[FFmpeg-devel] [PATCH] H.264 SEI handling vs. frame boundries
John Cox
jc
Mon Mar 16 18:07:43 CET 2009
Hi
OK - here's the (one-line) patch.
Test files:
CVSE2_Sony_B.zip
CVSE3_Sony_H.zip
CVSEFDFT3_Sony_E.zip
from
http://wftp3.itu.int/av-arch/jvt-site/draft_conformance/
In order to test you need to have an output yuv file generator that repeats
fields as requested by the repeat_pict field on output and compare with the
base longer yuv file (not the *-norpt.yuv). I haven't found an ffmpeg switch
for this yet.
In combination with my previous num_reorder_frames patch this leaves the only
failing conformance stream (in my stash of them) as:
FRExt/FRExt2_Panasonic_B
I haven't investigated yet - but the output file is the right length so its not
a simple frame drop.
John Cox
>On Mon, Mar 16, 2009 at 02:57:53PM +0000, John Cox wrote:
>> Hi
>>
>> I think there is a problem with the way SEIs in H.264 are handled when
>> splitting the input into frames. At the moment the frame breaker in
>> h264_parser.c seems to split on a new SPS, PPS or AU delimiter. This means
>> that if an AU goes <SEI><PPS><coded slice data> the SEI turns up in the
>> previous 'frame'. The particular case where this is a problem is where the SEI
>> contains pic_struct. In this case the pic struct gets applied to the frame
>> before the one it is meant to be applied to s.t. the repeat_pict count is
>> attached to the wrong frame. Changing the
>>
>> if(v==7 || v==8 || v==9){
>>
>> in h264_parser.c:ff_h264_find_frame_end to
>>
>> if(v==6 || v==7 || v==8 || v==9){
>>
>> fixes the problem - but I'm assuming there is some reason why it wasn't written
>> this way?
>
>hmm i suspect your suggested change is correct, can you send a patch?
>
>also a file to test this is welcome to verify that it does fix a bug
>
>[...]
-------------- next part --------------
Index: h264_parser.c
===================================================================
--- h264_parser.c (revision 17946)
+++ h264_parser.c (working copy)
@@ -70,7 +70,7 @@
else state>>=1; //2->1, 1->0, 0->0
}else if(state<=5){
int v= buf[i] & 0x1F;
- if(v==7 || v==8 || v==9){
+ if(v==6 || v==7 || v==8 || v==9){
if(pc->frame_start_found){
i++;
goto found;
More information about the ffmpeg-devel
mailing list