x264_sps_init

x264_sps_init此函数为序列量化集的初始化。主要对结构体x264_sps_t中参数的初始化。

void x264_sps_init( x264_sps_t *sps, int i_id, x264_param_t *param )

{

    sps->i_id = i_id;首先设置序列参数集的ID

b_qpprime_y_zero_transform_bypass判断码率控制方法是否是恒定质量方法并且量化值初始为0.

    sps->b_qpprime_y_zero_transform_bypass = param->rc.i_rc_method == X264_RC_CQP && param->rc.i_qp_constant == 0;

    if( sps->b_qpprime_y_zero_transform_bypass )

        sps->i_profile_idc  = PROFILE_HIGH444_PREDICTIVE;

    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 || param->b_interlaced )

        sps->i_profile_idc  = PROFILE_MAIN;

    else

        sps->i_profile_idc  = PROFILE_BASELINE;

baseline:(1)b_qpprime_y_zero_transform_bypass不等于0(2)analyse.b_transform_8x8等于0并且param->i_cqm_preset = X264_CQM_FLAT(3)b_cabac等于0并且i_bframe小于等于0,并且interlaced=0

    sps->i_level_idc = param->i_level_idc;

定义本序列参数集的level值

    sps->b_constraint_set0  = sps->i_profile_idc == PROFILE_BASELINE;

    /* x264 doesn't support the features that are in Baseline and not in Main,

     * namely arbitrary_slice_order and slice_groups. */

    sps->b_constraint_set1  = sps->i_profile_idc <= PROFILE_MAIN;

    /* Never set constraint_set2, it is not necessary and not used in real world. */

    sps->b_constraint_set2  = 0;       ?附录A2.1

然后设置IDR帧之间的最大的帧数,这个帧数是以2的多少次幂计数的,它由参数的i_keyint_max(默认初始化为250)决定。

    sps->i_log2_max_frame_num = 4;  /* at least 4这个句法元素是为读取frame_num服务的 */

    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 */

然后设置i_poc_type为0,POC类型指明了POC的编码方法,POC标识图象的播放顺序。由于H.264使用了B帧,使得图象的解码顺序并不一定等于播放顺序,但她们存在一定的映射关系。POC类型可以有Frame_num通过映射关系计算得来,也可以索性以编码器显示传送的方式传达给解码器. POC类型有3种方案.

   然后设置i_log2_max_poc_lsb,最大POC的什么东西,也搞不明白。

   POC是一个播放顺序,接受到一个IDR侦,POC会被清0

    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->b_vui = 1; 指明vui子结构是否出现在码流中(video usability information)

    sps->b_gaps_in_frame_num_value_allowed = 0; 这个句法元素等于时,表示允许句法元素frame_num可以不连续;当传输信道堵塞时,允许丢弃若干帧

    sps->i_mb_width = ( param->i_width + 15 ) / 16;

    sps->i_mb_height= ( param->i_height + 15 ) / 16;

    if( param->b_interlaced )

        sps->i_mb_height = ( sps->i_mb_height + 1 ) & ~1;

    sps->b_frame_mbs_only = ! param->b_interlaced;

    sps->b_mb_adaptive_frame_field = param->b_interlaced;

    sps->b_direct8x8_inference = 1; 指明b片的直接和skip模式下运动矢量的预测方法

    sps->crop.i_left   = 0;

    sps->crop.i_top    = 0;

    sps->crop.i_right  = sps->i_mb_width*16 - param->i_width;

    sps->crop.i_bottom = (sps->i_mb_height*16 - param->i_height) >> param->b_interlaced;

    sps->b_crop = sps->crop.i_left  || sps->crop.i_top ||

                  sps->crop.i_right || sps->crop.i_bottom;

指明解码器是否要将图像裁剪后输出,如果是的话,后面紧跟的四个句法元素分别指出左、右、上、下裁剪的宽度。此处不支持将图像剪裁后输出。

 

    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->vui.b_overscan_info_present = ( param->vui.i_overscan ? 1 : 0 );i_overscan类型 0=undef, 1=no overscan, 2=overscan

    if( sps->vui.b_overscan_info_present )

        sps->vui.b_overscan_info = ( param->vui.i_overscan == 2 ? 1 : 0 );

 

    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 ); /* undef原始色度格式*/

    sps->vui.i_transfer  = ( param->vui.i_transfer  <= 11 ? param->vui.i_transfer  : 2 ); /* undef 转换方式*/

    sps->vui.i_colmatrix = ( param->vui.i_colmatrix <=  9 ? param->vui.i_colmatrix : 2 ); /* undef 色度矩阵设置*/

    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;

    }

 

    /* 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->vui.b_timing_info_present = 0; 264码流中时间相关信息是在vui中,x264生成的码流是有vui信息的,但jm等编码器默认情况下是不生成vui信息。这表示,其播放时间是不能给出的

    if( param->i_fps_num > 0 && param->i_fps_den > 0)

    {

        sps->vui.b_timing_info_present = 1;是否有目前的时间信息。

        sps->vui.i_num_units_in_tick = param->i_fps_den;在一个时间点的数量单位。

        sps->vui.i_time_scale = param->i_fps_num * 2;时间规模?

        sps->vui.b_fixed_frame_rate = 1;是否有恒定的帧率。/

    }

 

    sps->vui.i_num_reorder_frames = param->b_bframe_pyramid ? 2 : param->i_bframe ? 1 : 0; b_bframe_pyrami为允许部分B为参考帧。i_num_reorder_frames为重新排序的帧的数目。

    /* extra slot with pyramid so that we don't have to override the

l        order of forgetting old pictures */

l        额外的插入参考帧,以使得我们不用重写忘记的老的图像。

    sps->vui.i_max_dec_frame_buffering =

    sps->i_num_ref_frames = X264_MIN(16, X264_MAX(param->i_frame_reference, 1 + sps->vui.i_num_reorder_frames));

i_max_dec_frame_buffering最大的解码帧的缓冲区。

    sps->vui.b_bitstream_restriction = 1;是否比特流受限

    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;

    }

}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/254730.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HALCON相机标定相机内参相机外参

目录相机标定1.相机标定是什么2.怎么使用halcon进行相机内外参标定&#xff1f;&#xff08;1&#xff09;搭建硬件1.**相机连好电脑&#xff0c;用相机厂家软件打开相机&#xff0c;检查一下相机是否正常。**2.**接下来使用halcon连接相机**&#xff08;2&#xff09;开始标定…

ionic更改端口号

ionic serve -p 8888 —— 重新指定端口号为8888 serve [options] ............................... 启动本地服务器进行开发测试 dev/testing   [--consolelogs|-c] ..................... 输入app的控制台到ionic的控制台显示   [--serverlogs|-s] .....................…

angular change the url , prevent reloading

http://stackoverflow.com/questions/14974271/can-you-change-a-path-without-reloading-the-controller-in-angularjs $location.search({vln: $scope.vln_id}, false);会改变url中 &#xff1f; 后面的 搜索参数&#xff0c;但是controller不会重新实例化。angular 官方文档…

Ubuntu apt-get 更新/查看软件

ubuntu 升级软件&#xff1a; sudo apt-get update 更新源  sudo apt-get upgrade 更新已安装的包  sudo apt-get dist-upgrade 升级系统 ubuntu升级特定软件&#xff1a; 可以用 sudo apt-get install pkgname 看软件安装位置:dpkg -L xxxx 查看软件是否安装&#xff1…

X264设定

--aq-mode <integer> AQ method [1]- 0: Disabled- 1: Variance AQ (complexity mask)说明&#xff1a;自适应量化方法&#xff0c;可以改善某些场景过于模糊等问题&#xff0c;默认开启- 0: 关闭- 1: 可变AQ推荐值&#xff1a;默认范例&#xff1a;--aq-mode 1--aq-stre…

C#圆形卡尺测量程序基于halcon

废话不多说上源码 觉得帖子有用给点个赞哈 先来个效果图 下边的是源码&#xff0c;自己新建一个文件粘贴进去&#xff0c;包含到您现在的项目 中。这串源码后边是使用方法。 using System; using System.Collections.Generic; using System.Linq; using System.Text; usin…

MySQL松散索引扫描与紧凑索引扫描

什么是松散索引&#xff1f; 答&#xff1a;实际上就是当MySQL 完全利用索引扫描来实现GROUP BY 的时候&#xff0c;并不需要扫描所有满足条件的索引键即可完成操作得出结果。 要利用到松散索引扫描实现GROUP BY&#xff0c;需要至少满足以下几个条件&#xff1a;◆ GROUP BY 条…

算法马拉松24

算法马拉松24 A 小C的多边形 题意&#xff1a;n1个点的多边形。给外圈的边标记上1~n&#xff0c;里圈的边也标记上1~n&#xff0c;使得对于一个外圈相邻点与中间点构成的三角形的边权之和都相等。\(n \le 10^6\) 题解&#xff1a;显然每个三角形权值和为\(\frac{3(n1)}{2}\) 一…

HUD2795 线段树(单点更新)

题目中给出的h和w范围均大&#xff0c;其实n的最大范围才200000&#xff0c;所以我们建立的线段树大小为min(h,n),线段树的每一个节点包含一个变量c&#xff0c;记录当前区间内还剩下的可以put on的最大长度。插入一个数时&#xff0c;如果该数大于该区间最大值&#xff0c;则返…

科维PLC运行时系统ProConOS embedded CLR 2.2 特定应用

ProConOS embedded CLR是新型的开放式标准化PLC运行时系统&#xff0c;符合IEC 61131标准&#xff0c;可执行不同的自动化任务&#xff08;PLC、PAC、运动控制、CNC、机器人和传感器&#xff09;。   通过采用国际标准的微软中间语言&#xff08;依据IEC/ISO 23271标准为MSIL…

linux下vi命令大全

进入vi的命令 vi filename :打开或新建文件&#xff0c;并将光标置于第一行首 vi n filename &#xff1a;打开文件&#xff0c;并将光标置于第n行首 vi filename &#xff1a;打开文件&#xff0c;并将光标置于最后一行首 vi /pattern filename&#xff1a;打开文件&…

set()与get()详细解答(C#)

这几天在搬砖时候用到了set()与get()&#xff0c;同事问了我一些问题&#xff0c;我打算在博客中总结一下。 觉得帮助到了您&#xff0c;帮我点个赞哦。 属性访问器 其实说白了就是操作一个属性&#xff0c;更通俗一点说就是对一个变量的取值与赋值。 先来看get() get 访问…

IM应用中如何计算富文本的高度

背景 在开发IM的项目过程中&#xff0c;经常会有出现一些需要计算DOM高度&#xff0c;然后超出若干行隐藏等需求。很多时候&#xff0c;需要计算高度的DOM元素都是动态生成的&#xff0c;我们无法在数据渲染前获取到它的高度。 如果没有任何交互&#xff0c;我们可以通过CSS来实…

G代码 机器人的CNC实现

&#xfeff;  控制铣削工作台和工件的NC程序&#xff0c;通过CAD软件创建&#xff0c;这些NC程序与特定的机器类型相关。 NC程序在笛卡尔坐标系中动作的描述&#xff0c;对于需要确保一个明确的变换轴位置的关节型的机器人来说&#xff0c;缺少附加的状态和旋转信息。传…

IScroll5中文API整理,用法与参考

IScroll是移动页面上被使用的一款仿系统滚动插件。IScroll5相对于之前的IScroll4改进了许多&#xff0c;使得大家可以更方便的定制所需的功能了。 做项目的时候正好用到了这个插件&#xff0c;自己做了一下总结&#xff0c;发在这里方便大家学习IScroll5。 官网&#xff1a;htt…

Linux 安装USB摄像头

sudo apt-get updatesudo apt-get install fswebcamsudo apt-get install mplayersudo apt-get install alsamixer安装完毕ls /dev查找设备是否有video0这个设备sudo mplayer tv:// 可以看到摄像内容转载于:https://www.cnblogs.com/smartkeke/p/6820426.html

struct x264_t 维护着CODEC的诸多重要信息

//x264_t结构体维护着CODEC的诸多重要信息struct x264_t{/* encoder parameters ( 编码器参数 )*/x264_param_t param;x264_t *thread[X264_SLICE_MAX];/* bitstream output ( 字节流输出 ) */struct{int i_nal;x264_nal_t nal[X264_NAL_MAX];int i_bitstr…

如何判断一条曲线是否自己相交?

今天看到群里有人在问这个问题&#xff0c;想了一个解决办法。 我们首先作假设&#xff0c;如果一条曲线有交点&#xff0c;那么它就是相交的对吧。可能大家想的都是这样&#xff0c;就开始找各种方法去识别交点。 我们换个角度想一下&#xff1a;是不是我们判断这条曲线是否带…

XML 与网络的数据传输

&#xfeff;&#xfeff;XML 与网络的数据传输