Mercurial > libavcodec.hg
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 |