[FFmpeg-devel] ffprobe: Do not decode zero-sized packets in ffprobe -show_frame

Petter Ericson petter.ericson at codemill.se
Thu Feb 16 09:55:56 CET 2012


On Wed, Feb 15, 2012 at 05:39:15PM +0100, Michael Niedermayer wrote:
> On Tue, Feb 14, 2012 at 05:26:13PM +0100, Petter Ericson wrote:
> > Greetings
> > 
> > Ticket #997 details a segfault in ffprobe that was exposed by the file
> > http://titan.codemill.se/~peteri/120210144737.ts
> > 
> > This patch fixes the segfault. However, the desyncing issue that I
> > mentioned in the ticket still remains (I was sloppy when looking at the
> > output - It is still present in git master). If anyone could advice on what
> > it is that is causing transcoding to result in desynced output, I would be
> > most grateful. 
> > 
> > The patched ffmpeg passes make fate.
> > 
> > Best regards
> > 
> > Petter Ericson
> > 
> 
> >  ffprobe.c |    2 ++
> >  1 file changed, 2 insertions(+)
> > d4cd04827b5c74b8d5d67f85d3f49b9646ae392d  patch
> > commit e40952af2f5b6eccf24b34926bf09747117affdc
> > Author: Petter Ericson <petter.ericson at codemill.se>
> > Date:   Tue Feb 14 16:59:56 2012 +0100
> > 
> >     ffprobe: Do not avcodec_decode_video2 video packets with size == 0
> > 
> > diff --git a/ffprobe.c b/ffprobe.c
> > index 79f7494..e23ef98 100644
> > --- a/ffprobe.c
> > +++ b/ffprobe.c
> > @@ -1349,6 +1349,8 @@ static av_always_inline int get_decoded_frame(AVFormatContext *fmt_ctx,
> >      *got_frame = 0;
> >      switch (dec_ctx->codec_type) {
> >      case AVMEDIA_TYPE_VIDEO:
> > +        if(pkt->size == 0)
> > +            return ret;
> >          ret = avcodec_decode_video2(dec_ctx, frame, got_frame, pkt);
> 
> This also will break flushing the last frames
> the check could be moved to the non flushing codepath
> 
> [...]
> 

Ah, so it will. Amended patch attached. The reason why the check can't
easily be done in the non-flushing loop is because zero-sized audio packets
have to be passed through. One could go with just checking the codec_type,
but that would lead to quite the ugly if-condition. Easier to just have a
flushing switch to get_decode_frame imo.

Still, I have not managed to hit this particular segfault with files from
any other source, so it is likely that something weird is going on, anyway, 
especially considering the timing problems.

/P
-------------- next part --------------
A non-text attachment was scrubbed...
Name: patch
Type: text/x-diff
Size: 2140 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20120216/e7efc67e/attachment.bin>


More information about the ffmpeg-devel mailing list