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