static void PutSPS( decoder_t *p_dec, block_t *p_frag ) { decoder_sys_t *p_sys = p_dec->p_sys; const uint8_t *p_buffer = p_frag->p_buffer; size_t i_buffer = p_frag->i_buffer; if( !hxxx_strip_AnnexB_startcode( &p_buffer, &i_buffer ) ) { block_Release( p_frag ); return; } h264_sequence_parameter_set_t *p_sps = h264_decode_sps( p_buffer, i_buffer, true ); if( !p_sps ) { msg_Warn( p_dec, "invalid SPS" ); block_Release( p_frag ); return; } /* We have a new SPS */ if( !p_sys->sps[p_sps->i_id].p_sps ) msg_Dbg( p_dec, "found NAL_SPS (sps_id=%d)", p_sps->i_id ); StoreSPS( p_sys, p_sps->i_id, p_frag, p_sps ); }
static void PutSPS( decoder_t *p_dec, block_t *p_frag ) { decoder_sys_t *p_sys = p_dec->p_sys; const uint8_t *p_buffer = p_frag->p_buffer; size_t i_buffer = p_frag->i_buffer; if( !hxxx_strip_AnnexB_startcode( &p_buffer, &i_buffer ) ) return; h264_sequence_parameter_set_t *p_sps = h264_decode_sps( p_buffer, i_buffer, true ); if( !p_sps ) { msg_Warn( p_dec, "invalid SPS" ); block_Release( p_frag ); return; } p_dec->fmt_out.i_profile = p_sps->i_profile; p_dec->fmt_out.i_level = p_sps->i_level; (void) h264_get_picture_size( p_sps, &p_dec->fmt_out.video.i_width, &p_dec->fmt_out.video.i_height, &p_dec->fmt_out.video.i_visible_width, &p_dec->fmt_out.video.i_visible_height ); if( p_sps->vui.i_sar_num != 0 && p_sps->vui.i_sar_den != 0 ) { p_dec->fmt_out.video.i_sar_num = p_sps->vui.i_sar_num; p_dec->fmt_out.video.i_sar_den = p_sps->vui.i_sar_den; } p_sys->i_log2_max_frame_num = p_sps->i_log2_max_frame_num; p_sys->b_frame_mbs_only = p_sps->frame_mbs_only_flag; p_sys->i_pic_order_cnt_type = p_sps->i_pic_order_cnt_type; p_sys->i_delta_pic_order_always_zero_flag = p_sps->i_delta_pic_order_always_zero_flag; p_sys->i_log2_max_pic_order_cnt_lsb = p_sps->i_log2_max_pic_order_cnt_lsb; if( p_sps->vui.b_valid ) { p_sys->b_timing_info_present_flag = p_sps->vui.b_timing_info_present_flag; p_sys->i_num_units_in_tick = p_sps->vui.i_num_units_in_tick; p_sys->i_time_scale = p_sps->vui.i_time_scale; p_sys->b_fixed_frame_rate = p_sps->vui.b_fixed_frame_rate; p_sys->b_pic_struct_present_flag = p_sps->vui.b_pic_struct_present_flag; p_sys->b_cpb_dpb_delays_present_flag = p_sps->vui.b_hrd_parameters_present_flag; p_sys->i_cpb_removal_delay_length_minus1 = p_sps->vui.i_cpb_removal_delay_length_minus1; p_sys->i_dpb_output_delay_length_minus1 = p_sps->vui.i_dpb_output_delay_length_minus1; if( p_sps->vui.b_fixed_frame_rate && !p_dec->fmt_out.video.i_frame_rate_base ) { p_dec->fmt_out.video.i_frame_rate_base = p_sps->vui.i_num_units_in_tick; p_dec->fmt_out.video.i_frame_rate = p_sps->vui.i_time_scale >> 1 /* num_clock_ts == 2 */; }