[FFmpeg-devel] [PATCH] mpeg12dec: don't assert on unknown chroma format
h.leppkes at gmail.com
Wed Sep 30 14:33:22 CEST 2015
On Wed, Sep 30, 2015 at 2:29 PM, Hendrik Leppkes <h.leppkes at gmail.com> wrote:
> On Wed, Sep 30, 2015 at 2:10 PM, Michael Niedermayer <michaelni at gmx.at> wrote:
>> On Wed, Sep 30, 2015 at 12:42:59PM +0200, Hendrik Leppkes wrote:
>>> The chroma format can be still unset in postinit when a badly cut stream
>>> starts with a slice instead of a sequence header. This is a common
>>> occurance when feeding avcodec from a Live TV stream.
>>> libavcodec/mpeg12dec.c | 1 -
>>> 1 file changed, 1 deletion(-)
>>> diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c
>>> index 5d916d1..b3c2c45 100644
>>> --- a/libavcodec/mpeg12dec.c
>>> +++ b/libavcodec/mpeg12dec.c
>>> @@ -1389,7 +1389,6 @@ static int mpeg_decode_postinit(AVCodecContext *avctx)
>>> case 1: avctx->chroma_sample_location = AVCHROMA_LOC_LEFT; break;
>>> case 2:
>>> case 3: avctx->chroma_sample_location = AVCHROMA_LOC_TOPLEFT; break;
>>> - default: av_assert0(0);
>>> } // MPEG-2
>> This assert double checks that the context init which uses
>> width/height/chroma format is done after the chroma format and w/h has
>> been read from the headers
>> if this is reached without the headers being read then the code is
>> buggy and removing the assert will not fix that bug
>> also if there is no sequence header how is width/height set ?
>> theres a check for width/height before mpeg_decode_postinit is called
> The dimensions are set by the caller in the avctx before opening the
> codec, which apparently inits the mpeg context as well.
> Feel free to fix it differently, error out or something, but I can
> trip an assert with input data, which should never happen.
Just to amend - after the fix it works perfectly fine again. It errors
out on a bunch of frames of course later on, but then it fixes itself
and decodes the Live TV stream like usual.
More information about the ffmpeg-devel