[Libav-user] OpenCV VideoCapture FFmpeg Module Bug on Linux using Video without a Codec
poste9
poste9 at gmail.com
Thu Mar 5 14:57:57 CET 2015
use valgrind
2015-03-05 10:50 GMT-03:00 Johannes Rehm <hahne.rehm at gmx.de>:
> So this is the function where the error happens (look for av_free_packet
> (&packet);):
>
> bool CvCapture_FFMPEG::grabFrame()
> {
> bool valid = false;
> int got_picture;
> int count_errs = 0;
> const int max_number_of_attempts = 1 << 9;
> if( !ic || !video_st ) return false;
> if( ic->streams[video_stream]->nb_frames > 0 &&
> frame_number > ic->streams[video_stream]->nb_frames )
> return false;
> av_free_packet (&packet);
> picture_pts = AV_NOPTS_VALUE_;
> // get the next frame
> while (!valid)
> {
> int ret = av_read_frame(ic, &packet);
> if (ret == AVERROR(EAGAIN)) continue;
> /* else if (ret < 0) break; */
> if( packet.stream_index != video_stream )
> {
> av_free_packet (&packet);
> count_errs++;
> if (count_errs > max_number_of_attempts)
> break;
> continue;
> }
> // Decode video frame
> #if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 2, 0)
> avcodec_decode_video2(video_st->codec, picture, &got_picture,
> &packet);
> #elif LIBAVFORMAT_BUILD > 4628
> avcodec_decode_video(video_st->codec,
> picture, &got_picture,
> packet.data, packet.size);
> #else
> avcodec_decode_video(&video_st->codec,
> picture, &got_picture,
> packet.data, packet.size);
> #endif
> // Did we get a video frame?
> if(got_picture)
> {
> //picture_pts = picture->best_effort_timestamp;
> if( picture_pts == AV_NOPTS_VALUE_ )
> picture_pts = packet.pts != AV_NOPTS_VALUE_ && packet.pts
> != 0 ? packet.pts : packet.dts;
> frame_number++;
> valid = true;
> }
> else
> {
> count_errs++;
> if (count_errs > max_number_of_attempts)
> break;
> }
> //I need to comment out the following line to prevent an
> segmentation fault when processing a raw video file without a codec:
> av_free_packet (&packet);
> }
> if( valid && first_frame_number < 0 )
> first_frame_number = dts_to_frame_number(picture_pts);
> // return if we have a new picture or not
> return valid;
> }
>
> I am not even sure if there will be a memory leak if I delete
> av_free_packet (&packet);
> But they might put this command for a reason and I do not want to create a
> new bug.
> Sorry for asking such a basic question: do you know how I can verify that
> there will be no memory leak (with or without adding av_init_packet before)?
>
> *Gesendet:* Donnerstag, 05. März 2015 um 14:22 Uhr
> *Von:* "Rafael Lúcio" <rafael at inova.in>
> *An:* "This list is about using libavcodec, libavformat, libavutil,
> libavdevice and libavfilter." <libav-user at ffmpeg.org>
> *Betreff:* Re: [Libav-user] OpenCV VideoCapture FFmpeg Module Bug on
> Linux using Video without a Codec
> I'm not an expert but maybe I can give u a simpler solution.... just
> ignore if I'm talking nonsense stuffs..
>
> maybe if u just av_init_packet before av_free_packet your problem is
> solved and you don't have memory leak.
> I haven't tested this theory, its just an idea.
>
> 2015-03-05 8:30 GMT-03:00 Johannes Rehm <hahne.rehm at gmx.de>:
>>
>> Hi All,
>>
>> there is a known bug in the VideoCapture ffmpeg module of OpenCV. It
>> occurs while loading videos without a codec:
>> http://code.opencv.org/issues/1915
>> I had some time now to debug this bug and found the issue in:
>> CvCapture_FFMPEG::grabFrame()
>> In the function
>> avcodec_decode_video2(video_st->codec, picture, &got_picture, &packet);
>> the AVFrame picture get set. But after
>> av_free_packet (&packet);
>> I get: "error: Cannot access memory at address..." for picture.data[0]
>> which leads to a segmentation fault later in the function sws_scale().
>> I can encode this video with a video codec using ffmpeg or whatever and I
>> get no segmentation fault (memory in picture.data[0] can still be accessed).
>> Of course there is an easy fix for this bug: Simply comment out / delete
>> av_free_packet (&packet);
>> This is working fine for me. Now I can process videos with and without
>> codecs. But I am not sure if this will lead to memory issues if
>> av_free_packet gets not called. Is there anybody who is familiar with the
>> FFmpeg interface of OpenCV and can help me here?
>> Thanks a lot!
>>
>> Best regards,
>> Johannes Rehm
>>
>> _______________________________________________
>> Libav-user mailing list
>> Libav-user at ffmpeg.org
>> http://ffmpeg.org/mailman/listinfo/libav-user
>>
>
>
>
> --
> -----------------------------------------------------------------
> Rafael Lúcio
> _______________________________________________ Libav-user mailing list
> Libav-user at ffmpeg.org http://ffmpeg.org/mailman/listinfo/libav-user
>
> _______________________________________________
> Libav-user mailing list
> Libav-user at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/libav-user
>
>
--
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://ffmpeg.org/pipermail/libav-user/attachments/20150305/75c73b32/attachment.html>
More information about the Libav-user
mailing list