⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 set.c.svn-base

📁 现在关于h.264的源码很多
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************** * set: h264 encoder (SPS and PPS init and write) ***************************************************************************** * Copyright (C) 2003 Laurent Aimar * $Id: set.c,v 1.1 2004/06/03 19:27:08 fenrir Exp $ * * Authors: Laurent Aimar <fenrir@via.ecp.fr> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA. *****************************************************************************/#ifdef HAVE_STDINT_H#include <stdint.h>#else#include <inttypes.h>#endif#include <stdlib.h>#include <stdio.h>#include <string.h>#include <stdarg.h>#include <math.h>#include "x264.h"#include "common/common.h"#ifndef _MSC_VER#include "config.h"#endifstatic void scaling_list_write( bs_t *s, x264_pps_t *pps, int idx ){    const int len = idx<4 ? 16 : 64;    const int *zigzag = idx<4 ? x264_zigzag_scan4 : x264_zigzag_scan8;    const uint8_t *list = pps->scaling_list[idx];    const uint8_t *def_list = (idx==CQM_4IC) ? pps->scaling_list[CQM_4IY]                            : (idx==CQM_4PC) ? pps->scaling_list[CQM_4PY]                            : x264_cqm_jvt[idx];    int j;    if( memcmp( list, def_list, len ) )    {        bs_write( s, 1, 1 ); // scaling_list_present_flag        for( j = 0; j < len; j++ )            bs_write_se( s, list[zigzag[j]] - (j>0 ? list[zigzag[j-1]] : 8) ); // delta    }    else        bs_write( s, 1, 0 ); // scaling_list_present_flag}void x264_sps_init( x264_sps_t *sps, int i_id, x264_param_t *param ){    sps->i_id = i_id;    sps->b_qpprime_y_zero_transform_bypass = !param->rc.b_cbr && param->rc.i_qp_constant == 0;    if( sps->b_qpprime_y_zero_transform_bypass )        sps->i_profile_idc  = PROFILE_HIGH444;    else if( param->analyse.b_transform_8x8 || param->i_cqm_preset != X264_CQM_FLAT )        sps->i_profile_idc  = PROFILE_HIGH;    else if( param->b_cabac || param->i_bframe > 0 )        sps->i_profile_idc  = PROFILE_MAIN;    else        sps->i_profile_idc  = PROFILE_BASELINE;    sps->i_level_idc = param->i_level_idc;    sps->b_constraint_set0  = 0;    sps->b_constraint_set1  = 0;    sps->b_constraint_set2  = 0;    sps->i_log2_max_frame_num = 4;  /* at least 4 */    while( (1 << sps->i_log2_max_frame_num) <= param->i_keyint_max )    {        sps->i_log2_max_frame_num++;    }    sps->i_log2_max_frame_num++;    /* just in case */    sps->i_poc_type = 0;    if( sps->i_poc_type == 0 )    {        sps->i_log2_max_poc_lsb = sps->i_log2_max_frame_num + 1;    /* max poc = 2*frame_num */    }    else if( sps->i_poc_type == 1 )    {        int i;        /* FIXME */        sps->b_delta_pic_order_always_zero = 1;        sps->i_offset_for_non_ref_pic = 0;        sps->i_offset_for_top_to_bottom_field = 0;        sps->i_num_ref_frames_in_poc_cycle = 0;        for( i = 0; i < sps->i_num_ref_frames_in_poc_cycle; i++ )        {            sps->i_offset_for_ref_frame[i] = 0;        }    }    sps->vui.i_num_reorder_frames = param->b_bframe_pyramid ? 2 : param->i_bframe ? 1 : 0;    /* extra slot with pyramid so that we don't have to override the     * order of forgetting old pictures */    sps->vui.i_max_dec_frame_buffering =    sps->i_num_ref_frames = X264_MIN(16, param->i_frame_reference + sps->vui.i_num_reorder_frames + param->b_bframe_pyramid);    sps->b_gaps_in_frame_num_value_allowed = 0;    sps->i_mb_width = ( param->i_width + 15 ) / 16;    sps->i_mb_height= ( param->i_height + 15 )/ 16;    sps->b_frame_mbs_only = 1;    sps->b_mb_adaptive_frame_field = 0;    sps->b_direct8x8_inference = 0;    if( sps->b_frame_mbs_only == 0 ||        !(param->analyse.inter & X264_ANALYSE_PSUB8x8) )    {        sps->b_direct8x8_inference = 1;    }    sps->crop.i_left   = 0;    sps->crop.i_top    = 0;    sps->crop.i_right  = (- param->i_width)  & 15;    sps->crop.i_bottom = (- param->i_height) & 15;    sps->b_crop = sps->crop.i_left  || sps->crop.i_top ||                  sps->crop.i_right || sps->crop.i_bottom;    sps->b_vui = 0;    sps->vui.b_aspect_ratio_info_present = 0;    if( param->vui.i_sar_width > 0 && param->vui.i_sar_height > 0 )    {        sps->vui.b_aspect_ratio_info_present = 1;        sps->vui.i_sar_width = param->vui.i_sar_width;        sps->vui.i_sar_height= param->vui.i_sar_height;    }    sps->b_vui |= sps->vui.b_aspect_ratio_info_present;        sps->vui.b_overscan_info_present = ( param->vui.i_overscan ? 1 : 0 );    if( sps->vui.b_overscan_info_present )        sps->vui.b_overscan_info = ( param->vui.i_overscan == 2 ? 1 : 0 );    sps->b_vui |= sps->vui.b_overscan_info_present;        sps->vui.b_signal_type_present = 0;    sps->vui.i_vidformat = ( param->vui.i_vidformat <= 5 ? param->vui.i_vidformat : 5 );    sps->vui.b_fullrange = ( param->vui.b_fullrange ? 1 : 0 );    sps->vui.b_color_description_present = 0;    sps->vui.i_colorprim = ( param->vui.i_colorprim <=  9 ? param->vui.i_colorprim : 2 );    sps->vui.i_transfer  = ( param->vui.i_transfer  <= 11 ? param->vui.i_transfer  : 2 );    sps->vui.i_colmatrix = ( param->vui.i_colmatrix <=  9 ? param->vui.i_colmatrix : 2 );    if( sps->vui.i_colorprim != 2 ||        sps->vui.i_transfer  != 2 ||        sps->vui.i_colmatrix != 2 )    {        sps->vui.b_color_description_present = 1;    }    if( sps->vui.i_vidformat != 5 ||        sps->vui.b_fullrange ||        sps->vui.b_color_description_present )    {        sps->vui.b_signal_type_present = 1;    }    sps->b_vui |= sps->vui.b_signal_type_present;        /* FIXME: not sufficient for interlaced video */    sps->vui.b_chroma_loc_info_present = ( param->vui.i_chroma_loc ? 1 : 0 );    if( sps->vui.b_chroma_loc_info_present )    {        sps->vui.i_chroma_loc_top = param->vui.i_chroma_loc;        sps->vui.i_chroma_loc_bottom = param->vui.i_chroma_loc;    }    sps->b_vui |= sps->vui.b_chroma_loc_info_present;    sps->vui.b_timing_info_present = 0;    if( param->i_fps_num > 0 && param->i_fps_den > 0)    {        sps->vui.b_timing_info_present = 1;        /* The standard is confusing me, but this seems to work best           with other encoders */        sps->vui.i_num_units_in_tick = param->i_fps_den;        sps->vui.i_time_scale = param->i_fps_num;        sps->vui.b_fixed_frame_rate = 1;    }    sps->b_vui |= sps->vui.b_timing_info_present;    sps->vui.b_bitstream_restriction = param->i_bframe > 0;    if( sps->vui.b_bitstream_restriction )    {        sps->vui.b_motion_vectors_over_pic_boundaries = 1;        sps->vui.i_max_bytes_per_pic_denom = 0;        sps->vui.i_max_bits_per_mb_denom = 0;        sps->vui.i_log2_max_mv_length_horizontal =        sps->vui.i_log2_max_mv_length_vertical = (int)(log(param->analyse.i_mv_range*4-1)/log(2)) + 1;    }    sps->b_vui |= sps->vui.b_bitstream_restriction;}void x264_sps_write( bs_t *s, x264_sps_t *sps ){    bs_write( s, 8, sps->i_profile_idc );    bs_write( s, 1, sps->b_constraint_set0 );    bs_write( s, 1, sps->b_constraint_set1 );    bs_write( s, 1, sps->b_constraint_set2 );    bs_write( s, 5, 0 );    /* reserved */    bs_write( s, 8, sps->i_level_idc );    bs_write_ue( s, sps->i_id );    if( sps->i_profile_idc >= PROFILE_HIGH )    {        bs_write_ue( s, 1 ); // chroma_format_idc = 4:2:0        bs_write_ue( s, 0 ); // bit_depth_luma_minus8        bs_write_ue( s, 0 ); // bit_depth_chroma_minus8        bs_write( s, 1, sps->b_qpprime_y_zero_transform_bypass );        bs_write( s, 1, 0 ); // seq_scaling_matrix_present_flag    }    bs_write_ue( s, sps->i_log2_max_frame_num - 4 );    bs_write_ue( s, sps->i_poc_type );    if( sps->i_poc_type == 0 )    {        bs_write_ue( s, sps->i_log2_max_poc_lsb - 4 );    }    else if( sps->i_poc_type == 1 )    {        int i;        bs_write( s, 1, sps->b_delta_pic_order_always_zero );        bs_write_se( s, sps->i_offset_for_non_ref_pic );        bs_write_se( s, sps->i_offset_for_top_to_bottom_field );        bs_write_ue( s, sps->i_num_ref_frames_in_poc_cycle );        for( i = 0; i < sps->i_num_ref_frames_in_poc_cycle; i++ )        {            bs_write_se( s, sps->i_offset_for_ref_frame[i] );        }    }    bs_write_ue( s, sps->i_num_ref_frames );    bs_write( s, 1, sps->b_gaps_in_frame_num_value_allowed );    bs_write_ue( s, sps->i_mb_width - 1 );    bs_write_ue( s, sps->i_mb_height - 1);    bs_write( s, 1, sps->b_frame_mbs_only );    if( !sps->b_frame_mbs_only )    {        bs_write( s, 1, sps->b_mb_adaptive_frame_field );    }    bs_write( s, 1, sps->b_direct8x8_inference );    bs_write( s, 1, sps->b_crop );    if( sps->b_crop )    {        bs_write_ue( s, sps->crop.i_left   / 2 );        bs_write_ue( s, sps->crop.i_right  / 2 );        bs_write_ue( s, sps->crop.i_top    / 2 );        bs_write_ue( s, sps->crop.i_bottom / 2 );    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -