[FFmpeg-devel] [PATCH] H.264/AVCHD interlaced fixes

Ivan Schreter schreter
Sun Feb 8 16:06:34 CET 2009


Michael Niedermayer wrote:
> On Sun, Feb 08, 2009 at 03:20:14PM +0100, Ivan Schreter wrote:
>   
>> Hi,
>>
>> Michael Niedermayer wrote:
>>     
>>> On Sun, Feb 08, 2009 at 10:07:23AM +0100, Ivan Schreter wrote:
>>>   
>>>       
>>>>> [...]  
>>>>>       
>>>>>           
>>>>>> +
>>>>>> +    return 0;
>>>>>> +}
>>>>>> +
>>>>>>  int ff_h264_decode_sei(H264Context *h){
>>>>>>      MpegEncContext * const s = &h->s;
>>>>>>  @@ -6873,6 +6873,10 @@
>>>>>>              if(decode_unregistered_user_data(h, size) < 0)
>>>>>>                  return -1;
>>>>>>              break;
>>>>>> +        case SEI_TYPE_RECOVERY_POINT:
>>>>>> +            if(decode_recovery_point(h) < 0)
>>>>>> +                return -1;
>>>>>> +            break;
>>>>>>          default:
>>>>>>              skip_bits(&s->gb, 8*size);
>>>>>>          }
>>>>>> @@ -7340,6 +7344,8 @@
>>>>>>      int context_count = 0;
>>>>>>       h->max_contexts = avctx->thread_count;
>>>>>> +    h->sei_recovery_frame_cnt = -1;
>>>>>> +
>>>>>>  #if 0
>>>>>>      int i;
>>>>>>      for(i=0; i<50; i++){
>>>>>> @@ -7676,6 +7682,14 @@
>>>>>>          } else {
>>>>>>              cur->repeat_pict = 0;
>>>>>>
>>>>>> +            /*
>>>>>> +             * TODO: Currently, we only communicate the fact we have a 
>>>>>> key
>>>>>> +             * frame, but there is no possibility to communicate 
>>>>>> recovery
>>>>>> +             * frame count. Most probably, recovery frame count is 
>>>>>> anyway 0.
>>>>>> +             * Add this in the future.
>>>>>> +             */
>>>>>> +            cur->key_frame = (h->sei_recovery_frame_cnt >= 0);
>>>>>>     
>>>>>>         
>>>>>>             
>>>>> this could set key_frame == 0 for IDR, which is wrong
>>>>>   
>>>>>       
>>>>>           
>>>> Correct, my mistake. This should fix it:
>>>>
>>>> @@ -7422,6 +7445,7 @@
>>>>                 return -1;
>>>>             }
>>>>             idr(h); //FIXME ensure we don't loose some frames if there is 
>>>> reordering
>>>> +            h->sei_recovery_frame_cnt = 0;
>>>>         case NAL_SLICE:
>>>>             init_get_bits(&hx->s.gb, ptr, bit_length);
>>>>             hx->intra_gb_ptr=
>>>>
>>>> OK now?
>>>>     
>>>>         
>>> now its a hack
>>> i mean idr != sei_recovery_frame_cnt
>>>
>>>   
>>>       
>> True, but IDR == key frame, so implicitly it has recovery frame count == 
>> 0. So this will correctly detect it. How else would you do it?
>>     
>
> keyframe |= ...
>   
Do you mean I should add additional "keyframe" flag? I can do that...

>> h->sei_recovery_frame_cnt >= 0 iff it's a key frame. It's a keyframe, 
>> iff h->sei_recovery_frame_cnt >= 0. The only thing which might 
>> theoretically break it is a SEI recovery point associated with IDR frame 
>> having recovery_frame_cnt > 0. But this is not logical, since IDR frame 
>> is the begin of coding sequence, so it must be decodable without 
>> depending on previous frames. Therefore, I think it's OK so and not a hack.
>>     
>
> sei_recovery_frame_cnt implicates the existence of a SEI, IDR does not
>   
Yes, but the end result is exactly the same - a key frame.

>>>>> also it does not set the key_frame flag if there is no decode but just a
>>>>> AVParser
>>>>>   
>>>>>       
>>>>>           
>>>> I don't quite understand what you mean. Parser is addressed by patch #6, 
>>>> which handles both field combining and key frame flag. It was very hard to 
>>>> split it in two patches, therefore I kept it in one.
>>>>     
>>>>         
>>> i didnt review #6 as it was big & scary IIRC
>>>   
>>>       
>> Umm... It is a little bigger, but not _that_ big. And it's pretty 
>> straightforward - after finding a complete packet, this packet is parsed 
>> via parse_nal_units(), which is nothing else but the code I got from 
>> you, corrected and extended by a few things (namely reading field type 
>> and frame number). In parser itself, it then looks if it's an unpaired 
>> field picture, and if so, it will not return the packet yet, but note 
>> down the position in buffer and relevant picture type info, wait for 
>> next packet and pair it with it. As error handling, if an unpaired field 
>> comes, it will be discarded, since it can't be combined anyway into a 
>> full frame.
>>
>> I have commented the code IMHO quite extensively, so it should be easy 
>> to understand.
>>     
>
> the parsing and combining are seperate things requireing seperate
> patches.
>   
Oh, c'mon! I have split the big patch as good as possible. But I don't 
have infinitely much time, my small daughter was born a few days ago => 
end of hacking. I'd like to have my patches in for the release, though.

Regards,

Ivan





More information about the ffmpeg-devel mailing list