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