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 { }