comparison h264.c @ 7379:d3bd73e0f9a9 libavcodec

init_poc() vs. idr() cleanup
author michael
date Thu, 24 Jul 2008 22:04:29 +0000
parents eee233178dd6
children 9faeb82ba80b
comparison
equal deleted inserted replaced
7378:eee233178dd6 7379:d3bd73e0f9a9
3302 unreference_pic(h, h->short_ref[i], 0); 3302 unreference_pic(h, h->short_ref[i], 0);
3303 h->short_ref[i]= NULL; 3303 h->short_ref[i]= NULL;
3304 } 3304 }
3305 h->short_ref_count=0; 3305 h->short_ref_count=0;
3306 h->prev_frame_num= 0; 3306 h->prev_frame_num= 0;
3307 h->prev_frame_num_offset= 0;
3308 h->prev_poc_msb=
3309 h->prev_poc_lsb= 0;
3307 } 3310 }
3308 3311
3309 /* forget old pics after a seek */ 3312 /* forget old pics after a seek */
3310 static void flush_dpb(AVCodecContext *avctx){ 3313 static void flush_dpb(AVCodecContext *avctx){
3311 H264Context *h= avctx->priv_data; 3314 H264Context *h= avctx->priv_data;
3694 static int init_poc(H264Context *h){ 3697 static int init_poc(H264Context *h){
3695 MpegEncContext * const s = &h->s; 3698 MpegEncContext * const s = &h->s;
3696 const int max_frame_num= 1<<h->sps.log2_max_frame_num; 3699 const int max_frame_num= 1<<h->sps.log2_max_frame_num;
3697 int field_poc[2]; 3700 int field_poc[2];
3698 3701
3699 if(h->nal_unit_type == NAL_IDR_SLICE){
3700 h->frame_num_offset= 0;
3701 }else{
3702 if(h->frame_num < h->prev_frame_num) 3702 if(h->frame_num < h->prev_frame_num)
3703 h->frame_num_offset= h->prev_frame_num_offset + max_frame_num; 3703 h->frame_num_offset= h->prev_frame_num_offset + max_frame_num;
3704 else 3704 else
3705 h->frame_num_offset= h->prev_frame_num_offset; 3705 h->frame_num_offset= h->prev_frame_num_offset;
3706 }
3707 3706
3708 if(h->sps.poc_type==0){ 3707 if(h->sps.poc_type==0){
3709 const int max_poc_lsb= 1<<h->sps.log2_max_poc_lsb; 3708 const int max_poc_lsb= 1<<h->sps.log2_max_poc_lsb;
3710
3711 if(h->nal_unit_type == NAL_IDR_SLICE){
3712 h->prev_poc_msb=
3713 h->prev_poc_lsb= 0;
3714 }
3715 3709
3716 if (h->poc_lsb < h->prev_poc_lsb && h->prev_poc_lsb - h->poc_lsb >= max_poc_lsb/2) 3710 if (h->poc_lsb < h->prev_poc_lsb && h->prev_poc_lsb - h->poc_lsb >= max_poc_lsb/2)
3717 h->poc_msb = h->prev_poc_msb + max_poc_lsb; 3711 h->poc_msb = h->prev_poc_msb + max_poc_lsb;
3718 else if(h->poc_lsb > h->prev_poc_lsb && h->prev_poc_lsb - h->poc_lsb < -max_poc_lsb/2) 3712 else if(h->poc_lsb > h->prev_poc_lsb && h->prev_poc_lsb - h->poc_lsb < -max_poc_lsb/2)
3719 h->poc_msb = h->prev_poc_msb - max_poc_lsb; 3713 h->poc_msb = h->prev_poc_msb - max_poc_lsb;
3758 3752
3759 if(s->picture_structure == PICT_FRAME) 3753 if(s->picture_structure == PICT_FRAME)
3760 field_poc[1] += h->delta_poc[1]; 3754 field_poc[1] += h->delta_poc[1];
3761 }else{ 3755 }else{
3762 int poc; 3756 int poc;
3763 if(h->nal_unit_type == NAL_IDR_SLICE){
3764 poc= 0;
3765 }else{
3766 if(h->nal_ref_idc) poc= 2*(h->frame_num_offset + h->frame_num); 3757 if(h->nal_ref_idc) poc= 2*(h->frame_num_offset + h->frame_num);
3767 else poc= 2*(h->frame_num_offset + h->frame_num) - 1; 3758 else poc= 2*(h->frame_num_offset + h->frame_num) - 1;
3768 }
3769 field_poc[0]= poc; 3759 field_poc[0]= poc;
3770 field_poc[1]= poc; 3760 field_poc[1]= poc;
3771 } 3761 }
3772 3762
3773 if(s->picture_structure != PICT_BOTTOM_FIELD) { 3763 if(s->picture_structure != PICT_BOTTOM_FIELD) {