Beispiel #1
0
Datei: h264.c Projekt: r1k/vlc
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 */;
        }
Beispiel #2
0
Datei: h264.c Projekt: IAPark/vlc
static void ActivateSets( decoder_t *p_dec, const h264_sequence_parameter_set_t *p_sps,
                                            const h264_picture_parameter_set_t *p_pps )
{
    decoder_sys_t *p_sys = p_dec->p_sys;

    p_sys->p_active_pps = p_pps;
    p_sys->p_active_sps = p_sps;

    if( p_sps )
    {
        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;
        }

        if( p_sps->vui.b_valid )
        {
            if( !p_dec->fmt_in.video.i_frame_rate_base &&
                p_sps->vui.i_num_units_in_tick > 0 && p_sps->vui.i_time_scale > 1 )
            {
                const unsigned i_rate_base = p_sps->vui.i_num_units_in_tick;
                const unsigned i_rate = p_sps->vui.i_time_scale >> 1; /* num_clock_ts == 2 */
                if( i_rate_base != p_dec->fmt_out.video.i_frame_rate_base ||
                    i_rate != p_dec->fmt_out.video.i_frame_rate )
                {
                    p_dec->fmt_out.video.i_frame_rate_base = i_rate_base;
                    p_dec->fmt_out.video.i_frame_rate = i_rate;
                    date_Change( &p_sys->dts, p_sps->vui.i_time_scale, p_sps->vui.i_num_units_in_tick );
                }
            }
            if( p_dec->fmt_in.video.primaries == COLOR_PRIMARIES_UNDEF )
                h264_get_colorimetry( p_sps, &p_dec->fmt_out.video.primaries,
                                      &p_dec->fmt_out.video.transfer,
                                      &p_dec->fmt_out.video.space,
                                      &p_dec->fmt_out.video.b_color_range_full );
        }
    }
}