Mercurial > libavcodec.hg
comparison h264.c @ 8783:e91ea98d868a libavcodec
Add SEI recovery point frame counter to H264Context and use it when
setting key_frame.
Patch by Ivan Schreter schreter A gmx D net
author | cehoyos |
---|---|
date | Mon, 09 Feb 2009 23:04:16 +0000 |
parents | 4f1567ce75c4 |
children | 530309ea02d8 |
comparison
equal
deleted
inserted
replaced
8782:bf4b7bde40ab | 8783:e91ea98d868a |
---|---|
2206 } | 2206 } |
2207 | 2207 |
2208 h->thread_context[0] = h; | 2208 h->thread_context[0] = h; |
2209 h->outputed_poc = INT_MIN; | 2209 h->outputed_poc = INT_MIN; |
2210 h->prev_poc_msb= 1<<16; | 2210 h->prev_poc_msb= 1<<16; |
2211 h->sei_recovery_frame_cnt = -1; | |
2211 return 0; | 2212 return 0; |
2212 } | 2213 } |
2213 | 2214 |
2214 static int frame_start(H264Context *h){ | 2215 static int frame_start(H264Context *h){ |
2215 MpegEncContext * const s = &h->s; | 2216 MpegEncContext * const s = &h->s; |
3139 h->outputed_poc= INT_MIN; | 3140 h->outputed_poc= INT_MIN; |
3140 idr(h); | 3141 idr(h); |
3141 if(h->s.current_picture_ptr) | 3142 if(h->s.current_picture_ptr) |
3142 h->s.current_picture_ptr->reference= 0; | 3143 h->s.current_picture_ptr->reference= 0; |
3143 h->s.first_field= 0; | 3144 h->s.first_field= 0; |
3145 h->sei_recovery_frame_cnt = -1; | |
3144 ff_mpeg_flush(avctx); | 3146 ff_mpeg_flush(avctx); |
3145 } | 3147 } |
3146 | 3148 |
3147 /** | 3149 /** |
3148 * Find a Picture in the short term reference list by frame number. | 3150 * Find a Picture in the short term reference list by frame number. |
6846 skip_bits(&s->gb, 8); | 6848 skip_bits(&s->gb, 8); |
6847 | 6849 |
6848 return 0; | 6850 return 0; |
6849 } | 6851 } |
6850 | 6852 |
6853 static int decode_recovery_point(H264Context *h){ | |
6854 MpegEncContext * const s = &h->s; | |
6855 | |
6856 h->sei_recovery_frame_cnt = get_ue_golomb(&s->gb); | |
6857 skip_bits(&s->gb, 4); /* 1b exact_match_flag, 1b broken_link_flag, 2b changing_slice_group_idc */ | |
6858 | |
6859 return 0; | |
6860 } | |
6861 | |
6851 static int decode_sei(H264Context *h){ | 6862 static int decode_sei(H264Context *h){ |
6852 MpegEncContext * const s = &h->s; | 6863 MpegEncContext * const s = &h->s; |
6853 | 6864 |
6854 while(get_bits_count(&s->gb) + 16 < s->gb.size_in_bits){ | 6865 while(get_bits_count(&s->gb) + 16 < s->gb.size_in_bits){ |
6855 int size, type; | 6866 int size, type; |
6869 if(decode_picture_timing(h) < 0) | 6880 if(decode_picture_timing(h) < 0) |
6870 return -1; | 6881 return -1; |
6871 break; | 6882 break; |
6872 case SEI_TYPE_USER_DATA_UNREGISTERED: | 6883 case SEI_TYPE_USER_DATA_UNREGISTERED: |
6873 if(decode_unregistered_user_data(h, size) < 0) | 6884 if(decode_unregistered_user_data(h, size) < 0) |
6885 return -1; | |
6886 break; | |
6887 case SEI_TYPE_RECOVERY_POINT: | |
6888 if(decode_recovery_point(h) < 0) | |
6874 return -1; | 6889 return -1; |
6875 break; | 6890 break; |
6876 default: | 6891 default: |
6877 skip_bits(&s->gb, 8*size); | 6892 skip_bits(&s->gb, 8*size); |
6878 } | 6893 } |
7429 hx->s.data_partitioning = 0; | 7444 hx->s.data_partitioning = 0; |
7430 | 7445 |
7431 if((err = decode_slice_header(hx, h))) | 7446 if((err = decode_slice_header(hx, h))) |
7432 break; | 7447 break; |
7433 | 7448 |
7434 s->current_picture_ptr->key_frame|= (hx->nal_unit_type == NAL_IDR_SLICE); | 7449 s->current_picture_ptr->key_frame |= |
7450 (hx->nal_unit_type == NAL_IDR_SLICE) || | |
7451 (h->sei_recovery_frame_cnt >= 0); | |
7435 if(hx->redundant_pic_count==0 && hx->s.hurry_up < 5 | 7452 if(hx->redundant_pic_count==0 && hx->s.hurry_up < 5 |
7436 && (avctx->skip_frame < AVDISCARD_NONREF || hx->nal_ref_idc) | 7453 && (avctx->skip_frame < AVDISCARD_NONREF || hx->nal_ref_idc) |
7437 && (avctx->skip_frame < AVDISCARD_BIDIR || hx->slice_type_nos!=FF_B_TYPE) | 7454 && (avctx->skip_frame < AVDISCARD_BIDIR || hx->slice_type_nos!=FF_B_TYPE) |
7438 && (avctx->skip_frame < AVDISCARD_NONKEY || hx->slice_type_nos==FF_I_TYPE) | 7455 && (avctx->skip_frame < AVDISCARD_NONKEY || hx->slice_type_nos==FF_I_TYPE) |
7439 && avctx->skip_frame < AVDISCARD_ALL){ | 7456 && avctx->skip_frame < AVDISCARD_ALL){ |
7666 */ | 7683 */ |
7667 if (!FIELD_PICTURE) | 7684 if (!FIELD_PICTURE) |
7668 ff_er_frame_end(s); | 7685 ff_er_frame_end(s); |
7669 | 7686 |
7670 MPV_frame_end(s); | 7687 MPV_frame_end(s); |
7688 h->sei_recovery_frame_cnt = -1; | |
7671 | 7689 |
7672 if (cur->field_poc[0]==INT_MAX || cur->field_poc[1]==INT_MAX) { | 7690 if (cur->field_poc[0]==INT_MAX || cur->field_poc[1]==INT_MAX) { |
7673 /* Wait for second field. */ | 7691 /* Wait for second field. */ |
7674 *data_size = 0; | 7692 *data_size = 0; |
7675 | 7693 |