Mercurial > libavcodec.hg
comparison h264.c @ 9883:ffc0f9de5743 libavcodec
Fix H.264 picture reordering, 2nd try.
First, reverted one was r19239.
Patch by Haruhiko Yamagata, h D yamagata A nifty D com
author | cehoyos |
---|---|
date | Tue, 23 Jun 2009 21:03:35 +0000 |
parents | 7c769effb964 |
children | f86df3ebfef7 |
comparison
equal
deleted
inserted
replaced
9882:7b58b1410f48 | 9883:ffc0f9de5743 |
---|---|
2238 * This is incorrect for H.264; IDR markings must be used. | 2238 * This is incorrect for H.264; IDR markings must be used. |
2239 * Zero here; IDR markings per slice in frame or fields are ORed in later. | 2239 * Zero here; IDR markings per slice in frame or fields are ORed in later. |
2240 * See decode_nal_units(). | 2240 * See decode_nal_units(). |
2241 */ | 2241 */ |
2242 s->current_picture_ptr->key_frame= 0; | 2242 s->current_picture_ptr->key_frame= 0; |
2243 s->current_picture_ptr->mmco_reseted= 0; | |
2243 | 2244 |
2244 assert(s->linesize && s->uvlinesize); | 2245 assert(s->linesize && s->uvlinesize); |
2245 | 2246 |
2246 for(i=0; i<16; i++){ | 2247 for(i=0; i<16; i++){ |
2247 h->block_offset[i]= 4*((scan8[i] - scan8[0])&7) + 4*s->linesize*((scan8[i] - scan8[0])>>3); | 2248 h->block_offset[i]= 4*((scan8[i] - scan8[0])&7) + 4*s->linesize*((scan8[i] - scan8[0])>>3); |
3367 s->current_picture_ptr->field_poc[1]= | 3368 s->current_picture_ptr->field_poc[1]= |
3368 h->poc_lsb= | 3369 h->poc_lsb= |
3369 h->poc_msb= | 3370 h->poc_msb= |
3370 h->frame_num= | 3371 h->frame_num= |
3371 s->current_picture_ptr->frame_num= 0; | 3372 s->current_picture_ptr->frame_num= 0; |
3373 s->current_picture_ptr->mmco_reseted=1; | |
3372 break; | 3374 break; |
3373 default: assert(0); | 3375 default: assert(0); |
3374 } | 3376 } |
3375 } | 3377 } |
3376 | 3378 |
7706 int i, out_idx; | 7708 int i, out_idx; |
7707 | 7709 |
7708 //FIXME factorize this with the output code below | 7710 //FIXME factorize this with the output code below |
7709 out = h->delayed_pic[0]; | 7711 out = h->delayed_pic[0]; |
7710 out_idx = 0; | 7712 out_idx = 0; |
7711 for(i=1; h->delayed_pic[i] && (h->delayed_pic[i]->poc && !h->delayed_pic[i]->key_frame); i++) | 7713 for(i=1; h->delayed_pic[i] && !h->delayed_pic[i]->key_frame && !h->delayed_pic[i]->mmco_reseted; i++) |
7712 if(h->delayed_pic[i]->poc < out->poc){ | 7714 if(h->delayed_pic[i]->poc < out->poc){ |
7713 out = h->delayed_pic[i]; | 7715 out = h->delayed_pic[i]; |
7714 out_idx = i; | 7716 out_idx = i; |
7715 } | 7717 } |
7716 | 7718 |
7882 if(cur->reference == 0) | 7884 if(cur->reference == 0) |
7883 cur->reference = DELAYED_PIC_REF; | 7885 cur->reference = DELAYED_PIC_REF; |
7884 | 7886 |
7885 out = h->delayed_pic[0]; | 7887 out = h->delayed_pic[0]; |
7886 out_idx = 0; | 7888 out_idx = 0; |
7887 for(i=1; h->delayed_pic[i] && (h->delayed_pic[i]->poc && !h->delayed_pic[i]->key_frame); i++) | 7889 for(i=1; h->delayed_pic[i] && !h->delayed_pic[i]->key_frame && !h->delayed_pic[i]->mmco_reseted; i++) |
7888 if(h->delayed_pic[i]->poc < out->poc){ | 7890 if(h->delayed_pic[i]->poc < out->poc){ |
7889 out = h->delayed_pic[i]; | 7891 out = h->delayed_pic[i]; |
7890 out_idx = i; | 7892 out_idx = i; |
7891 } | 7893 } |
7892 cross_idr = !h->delayed_pic[0]->poc || !!h->delayed_pic[i] || h->delayed_pic[0]->key_frame; | 7894 cross_idr = !!h->delayed_pic[i] || h->delayed_pic[0]->key_frame || h->delayed_pic[0]->mmco_reseted; |
7893 | 7895 |
7894 out_of_order = !cross_idr && out->poc < h->outputed_poc; | 7896 out_of_order = !cross_idr && out->poc < h->outputed_poc; |
7895 | 7897 |
7896 if(h->sps.bitstream_restriction_flag && s->avctx->has_b_frames >= h->sps.num_reorder_frames) | 7898 if(h->sps.bitstream_restriction_flag && s->avctx->has_b_frames >= h->sps.num_reorder_frames) |
7897 { } | 7899 { } |