comparison h264.c @ 7350:5c45da72279e libavcodec

Support gaps in the frame num. Fixes at least: MR3_TANDBERG_B.264 MR4_TANDBERG_C.264 MR5_TANDBERG_C.264
author michael
date Wed, 23 Jul 2008 02:12:54 +0000
parents ee0fa5935e1a
children e03fd655afe3
comparison
equal deleted inserted replaced
7349:ee0fa5935e1a 7350:5c45da72279e
3537 } 3537 }
3538 for(j = 0; j < 16; j++) { 3538 for(j = 0; j < 16; j++) {
3539 pic= remove_long(h, j); 3539 pic= remove_long(h, j);
3540 if(pic) unreference_pic(h, pic, 0); 3540 if(pic) unreference_pic(h, pic, 0);
3541 } 3541 }
3542 s->current_picture_ptr->poc=
3543 s->current_picture_ptr->field_poc[0]=
3544 s->current_picture_ptr->field_poc[1]=
3545 h->poc_lsb=
3546 h->poc_msb=
3547 h->frame_num=
3542 s->current_picture_ptr->frame_num= 0; 3548 s->current_picture_ptr->frame_num= 0;
3543 break; 3549 break;
3544 default: assert(0); 3550 default: assert(0);
3545 } 3551 }
3546 } 3552 }
3597 */ 3603 */
3598 av_log(h->s.avctx, AV_LOG_ERROR, 3604 av_log(h->s.avctx, AV_LOG_ERROR,
3599 "number of reference frames exceeds max (probably " 3605 "number of reference frames exceeds max (probably "
3600 "corrupt input), discarding one\n"); 3606 "corrupt input), discarding one\n");
3601 3607
3602 if (h->long_ref_count) { 3608 if (h->long_ref_count && !h->short_ref_count) {
3603 for (i = 0; i < 16; ++i) 3609 for (i = 0; i < 16; ++i)
3604 if (h->long_ref[i]) 3610 if (h->long_ref[i])
3605 break; 3611 break;
3606 3612
3607 assert(i < 16); 3613 assert(i < 16);
4016 h->mb_aff_frame = h->sps.mb_aff; 4022 h->mb_aff_frame = h->sps.mb_aff;
4017 } 4023 }
4018 } 4024 }
4019 4025
4020 if(h0->current_slice == 0){ 4026 if(h0->current_slice == 0){
4027 while(h->frame_num != h->prev_frame_num &&
4028 h->frame_num != (h->prev_frame_num+1)%(1<<h->sps.log2_max_frame_num)){
4029 av_log(NULL, AV_LOG_DEBUG, "Frame num gap %d %d\n", h->frame_num, h->prev_frame_num);
4030 frame_start(h);
4031 h->prev_frame_num++;
4032 h->prev_frame_num %= 1<<h->sps.log2_max_frame_num;
4033 s->current_picture_ptr->frame_num= h->prev_frame_num;
4034 execute_ref_pic_marking(h, NULL, 0);
4035 }
4036
4021 /* See if we have a decoded first field looking for a pair... */ 4037 /* See if we have a decoded first field looking for a pair... */
4022 if (s0->first_field) { 4038 if (s0->first_field) {
4023 assert(s0->current_picture_ptr); 4039 assert(s0->current_picture_ptr);
4024 assert(s0->current_picture_ptr->data[0]); 4040 assert(s0->current_picture_ptr->data[0]);
4025 assert(s0->current_picture_ptr->reference != DELAYED_PIC_REF); 4041 assert(s0->current_picture_ptr->reference != DELAYED_PIC_REF);
7736 int i, out_idx; 7752 int i, out_idx;
7737 7753
7738 //FIXME factorize this with the output code below 7754 //FIXME factorize this with the output code below
7739 out = h->delayed_pic[0]; 7755 out = h->delayed_pic[0];
7740 out_idx = 0; 7756 out_idx = 0;
7741 for(i=1; h->delayed_pic[i] && !h->delayed_pic[i]->key_frame; i++) 7757 for(i=1; h->delayed_pic[i] && !h->delayed_pic[i]->key_frame && h->delayed_pic[i]->poc; i++)
7742 if(h->delayed_pic[i]->poc < out->poc){ 7758 if(h->delayed_pic[i]->poc < out->poc){
7743 out = h->delayed_pic[i]; 7759 out = h->delayed_pic[i];
7744 out_idx = i; 7760 out_idx = i;
7745 } 7761 }
7746 7762
7819 s->mb_y= 0; 7835 s->mb_y= 0;
7820 7836
7821 s->current_picture_ptr->qscale_type= FF_QSCALE_TYPE_H264; 7837 s->current_picture_ptr->qscale_type= FF_QSCALE_TYPE_H264;
7822 s->current_picture_ptr->pict_type= s->pict_type; 7838 s->current_picture_ptr->pict_type= s->pict_type;
7823 7839
7840 if(!s->dropable) {
7841 execute_ref_pic_marking(h, h->mmco, h->mmco_index);
7842 h->prev_poc_msb= h->poc_msb;
7843 h->prev_poc_lsb= h->poc_lsb;
7844 }
7824 h->prev_frame_num_offset= h->frame_num_offset; 7845 h->prev_frame_num_offset= h->frame_num_offset;
7825 h->prev_frame_num= h->frame_num; 7846 h->prev_frame_num= h->frame_num;
7826 if(!s->dropable) {
7827 h->prev_poc_msb= h->poc_msb;
7828 h->prev_poc_lsb= h->poc_lsb;
7829 execute_ref_pic_marking(h, h->mmco, h->mmco_index);
7830 }
7831 7847
7832 /* 7848 /*
7833 * FIXME: Error handling code does not seem to support interlaced 7849 * FIXME: Error handling code does not seem to support interlaced
7834 * when slices span multiple rows 7850 * when slices span multiple rows
7835 * The ff_er_add_slice calls don't work right for bottom 7851 * The ff_er_add_slice calls don't work right for bottom
7885 if(h->delayed_pic[i]->key_frame || h->delayed_pic[i]->poc==0) 7901 if(h->delayed_pic[i]->key_frame || h->delayed_pic[i]->poc==0)
7886 cross_idr = 1; 7902 cross_idr = 1;
7887 7903
7888 out = h->delayed_pic[0]; 7904 out = h->delayed_pic[0];
7889 out_idx = 0; 7905 out_idx = 0;
7890 for(i=1; h->delayed_pic[i] && !h->delayed_pic[i]->key_frame; i++) 7906 for(i=1; h->delayed_pic[i] && !h->delayed_pic[i]->key_frame && h->delayed_pic[i]->poc; i++)
7891 if(h->delayed_pic[i]->poc < out->poc){ 7907 if(h->delayed_pic[i]->poc < out->poc){
7892 out = h->delayed_pic[i]; 7908 out = h->delayed_pic[i];
7893 out_idx = i; 7909 out_idx = i;
7894 } 7910 }
7895 7911