[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