[FFmpeg-devel] [PATCH] H264 parser fix

Howard Chu hyc
Tue May 25 16:29:11 CEST 2010


Michael Niedermayer wrote:
> On Mon, May 24, 2010 at 11:25:05AM -0700, Howard Chu wrote:
>> Michael Niedermayer wrote:
>>> On Wed, May 19, 2010 at 01:15:17AM -0700, Howard Chu wrote:
>>>> When decoding an H264 stream that uses global headers, you get an endless
>>>> stream of "non-existing PPS referenced" messages. This message comes from
>>>> h264_parser.c, and it happens because it's using an H264Context hanging
>>>> off
>>>> the AVCodecParserContext, which is separate from the H264Context hanging
>>>> off the AVCodecContext, and only the AVCodecContext contains the
>>>> extradata
>>>> that provides the PPS and SPS.
>>>>
>>>> This patch is admittedly a hack, but it stops the error. It just checks
>>>> in
>>>> the AVCodecContext if the PPS wasn't found in the AVCodecParserContext.
>>>
>>> ugly ugly ugly
>>> if iam not mistaken this would be fixed by making the parser work with
>>> mov/mkv ("avc") style h264
>>
>> I read thru mov.c and matroskadec.c and couldn't find anything relevant, so
>> I don't understand what your suggestion means.
>
> i thought that the problem is that the parser is feeded a format it does not
> support. I did not confirm this but i see no reason that this is a different
> issue.

That is not the problem I was reporting. The parser has no trouble with the 
data format. It is simply missing the PPS and SPS because they were not 
available in the AVCodecParserContext. The extradata is only available in the 
AVCodecContext.

> The format difference should be easiest vissible by looking at code
> surrounding is_avc in h264.c
>
> if this is the issue the parser should be improved to suport the slghtly
> differnt way to pack things and also to look in extradata.

Before we can tell the parser to look in the extradata, we have to give the 
parser a way to access it, ideally when the parser is initialized. Right now 
there's no reliable way to do that. It seems odd to me that the parser entry 
points all require an AVCodecContext but av_parser_init() only takes a 
codec_id. If av_parser_init() took an AVCodecContext instead, all of the 
necessary information would be available.
-- 
   -- Howard Chu
   CTO, Symas Corp.           http://www.symas.com
   Director, Highland Sun     http://highlandsun.com/hyc/
   Chief Architect, OpenLDAP  http://www.openldap.org/project/



More information about the ffmpeg-devel mailing list