x264_sps_init

x264代码剖析(六):encode()函数之x264_encoder_headers()函数 x264代码剖析(六):encode()函数之x264_encoder_headers()函数           encode()函数是x264的主干函数,主要包括x264_encoder_open()函数、x264_encoder_headers()函数、x264_encoder_encode()函数与x264_encoder_close()函数四大部分,其中x264_encoder_en 阅读详情

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;

    }

}

x264编码参数详细介绍:profile、preset、tune、level、码控 阅读详情

相关推荐

H264 编码标准级别 Level 详解

H264 编码标准级别 Level 详解

世界那么大,我想去看看~【随心更新,看世界去了😄】 5186

ffmpeg x264编码参数

ffmpeg x264编码参数对照表x264   ffmpeg   说明 命令行 字段 命令行 字段   qp qp_constant cqp   cqp 固定量化因子。取值范围0到51。 经常取值在20-40之间,越小质量 越好,要求的码率越高。0表示无损压缩 max-keyint i_keyint_max g gop_size 关键帧的最大...

深之JohnChen的专栏 7745

【x264编码器】章节1——x264编码流程及基于x264的编码器demo

提供了一种方便的方式来根据指定的配置profile应用相应的设置到 x264 参数结构体上。不同的配置文件类型会对参数结构体进行不同的修改,以满足特定的编码需求。然后是编码器参数,包括帧参考数、最大关键帧间隔、最小关键帧间隔、B 帧数、场景切换阈值等。结构体的成员进行赋值,将其初始化为默认值。之后是一些编码器设置,如去块滤波、CABAC 编码、码率控制方法、参考帧压缩系数等。接下来是一系列与视频属性相关的参数,如色度格式、宽度、高度、宽高比等。然后是一些与日志输出、分析类型、量化矩阵等相关的参数。

vcvdv123的博客 5744

H.264 入门篇 - 01 (Bitstream)

前面说了编码器将连续的帧经过分割,预测,变换(DCT),量化,去块滤波,熵编码后,就可以出正常的码流了,但这仅仅是裸的数据,我们还需要将编码器的编码过程信息经过最后一步,打包到最终的比特文件,才形成最终符合 H.264 标准的码流文件;

StephenZhou 8720

x264 码率控制 VBV 算法原理:数学模型与数据流转

x264 码率控制 VBV 算法原理:数学模型与数据流转

世界那么大,我想去看看~【随心更新,看世界去了😄】 664

vasp和ms_武汉理工大学赵焱课题组开发脚本 MS建模一键获取VASP输入文件POSCAR

本文给大家推介并分享一个通过Materials Studio一键获取VASP输入文件POSCAR的脚本,xsd2pos.pl。此脚本是武汉理工大学首席教授赵焱在帮助学生解决VASP计算问题时编写,解决了其他间接非手动获取POSCAR存在的问题,同时也相较于其他方法更为便捷,相信会对从事VASP计算的同行们带来便利。赵焱老师怀着哺育天下学子的情怀,希望给大家分享一下。下文介绍一下它的使用方法以及它所...

weixin_39706367的博客 2288

LiveRTMP之H264 SPS解析宽高不正确导致播放时画面拉伸的问题修复(五)

LiveRTMP是将H264流以及AAC流以RTMP协议推送到RTMP服务器上进行直播。LiveRTMP推送库中会从H264流中提取中SPS、PPS进行解析,开发的时候遇到过有些SPS解析有误,获取到的宽高不正确,导致播放的时候画面被拉长的问题。下面给出一份比较完善的SPS解析。解析SPS数据,得到h264_sps_t结构的数据。技术交流QQ群:615081503。咨询电话:15156896292。

1190

【Qualcomm高通音频】音效调试_录音文件播放有杂音,如何定位原因?

一、录音播放数据处理过程介绍 (1)TX方向 麦克风(硅麦克风或者主机体麦克风)采集模拟音频信号,经过内部CODEC芯片中的adc转换为数字信号,在经过高通音频DSP处理音效后编码为wav/aac/amr/mp3等格式文件。 (2)RX方向 音频文件经过解码、重采样还原为pcm数据,经过DSP处理音效后送到内部CODEC,然后经过DAC转换为模拟信号,送到喇叭。 二、分析步骤 1...

crow_ch的博客 5971

x264源代码简单分析 编码器主干部分-1

x264源代码简单分析 编码器主干部分-1

hffgjh的博客 519

实测避坑:华为Atlas 300I DUO推理卡部署Qwen1.5,性能对比3090与完整配置流程

本文深度评测华为Atlas 300I DUO推理卡在部署Qwen1.5-14B大模型时的性能表现,并与RTX 3090进行对比。通过实测数据展示硬件参数、部署流程及性能优化建议,揭示国产AI加速卡在LLM推理中的独特优势与适用场景,为开发者提供完整的配置指南和避坑方案。

weixin_29083475的博客 794

ADB命令解锁Android手机屏幕的3种实用方法(附详细步骤)

本文详细介绍了在Android手机屏幕失灵或密码遗忘时,利用ADB命令解锁屏幕的三种实用方法。包括通过ADB模拟输入事件、移除锁屏认证文件(需Root权限)以及结合恢复模式抢救数据。文章提供了详细的操作步骤与风险提示,强调提前开启USB调试的重要性,是Android用户应对紧急锁屏情况的有效技术指南。

weixin_29229055的博客 919

H264规定了三种主要档次

H264规定了三种主要档次,每个档次支持一组特定的编码功能,并支持一类特定的应用。   1、基本档次(Baseline Profile):利用I片和P片支持帧内和帧间编码,支持利用基于上下文的自适应的变长编码进行的熵编码(CAvlc)。主要用于可视电话、会议电视、无线通信等实

maopig的专栏 4026

FFmpeg魔改指南:让RTMP协议完美兼容H265的三种方法(含SRS适配技巧)

本文详细介绍了三种让RTMP协议兼容H265编码的FFmpeg魔改方案,包括基于官方补丁的标准改造、Intel的SVT-HEVC集成方案以及金山云的自定义扩展方案。文章重点解析了各方案的实现原理与适配技巧,并提供了在SRS 6.0服务器上进行深度配置和性能调优的完整实战指南,帮助开发者解决H265推流至传统RTMP服务器的兼容性问题。

weixin_29290947的博客 195

[H264]x264_encoder_headers函数

x264_encoder_headers H264中我们所说的帧是不包含全部的视频的数据的,它是由网络数据NAL和视频数据VCL组成。这个函数主要用来生成一个帧的NAL数据层,这个函数主要是输出SPS、PPS、SEI等数据封装。 具体来看代码 int x264_encoder_headers( x264_t *h, x264_nal_t **pp_nal, int *pi_nal )...

lpcarl的专栏 263

duilib 实现截屏选取功能分析

本文关注点不再截屏而是截屏选取工具 1首先肯定是个透明窗口,且置顶并且是工具窗口(任务栏不显示窗口图标) 窗口样式 <?xml version="1.0" encoding="utf-8"?> <Window shadowattached="false"> <Box > <VBox name="track_box" margin="200,200,200,200" bkimage="file='screen_bord...

目前打算换一个工作,有招聘windows c++方向的也欢迎联系,北京、济南 最好 908

利用dpabi和restplus提取ROI灰质体积学习笔记

目录前言一、数据准备二、利用dpabi提取ROI灰质体积三、restplus提取ROI灰质体积 前言 我利用SPM/CAT12进行灰质、白质、脑脊液分割之后分别已经得到各自的图像文件,在全脑水平已经做了统计分析。如果还想要进一步进行ROI的统计分析或者与量表等临床资料做相关分析,就需要提取ROI灰质体积。几个月没动过这数据了,突然心血来潮想学一下如何提取ROI灰质体积,以此篇博客记录我的提取ROI灰质体积学习过程。提取ROI灰质体积的方法及软件有许多种,本人尝试了dpabi和restplus。 一、数据准备

weixin_52073820的博客 9224

使用FFmpeg的SDK库实现将H.264流封装进MP4文件时全局SPS、PPS与流中SPS、PPS冲突的问题

一、问题1. 使用FFmpeg的SDK库实现将H.264流封装进MP4文件的源码大致如下:char* filename = "./test.mp4"AVOutputFormat *fmt;AVStream* video_st;AVFormatContext *av_context; /* 初始化资源 */av_register_all();int iret = avformat_alloc_out...

北雨南萍 2245

Autosar进阶专栏索引

Autosar进阶专栏索引

赞的博客 3540

x264源代码简单分析:编码器主干部分-2

===================================================== H.264源代码分析文章列表: 【编码 - x264】 x264源代码简单分析:概述 x264源代码简单分析:x264命令行工具(x264.exe) x264源代码简单分析...

chuifuhuo6864的博客 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

x264_macroblock_cache_init 的分析

int x264_macroblock_cache_init ( x264_t *h ) 这个函数主要对cache中与宏块相关的变量进行初始化,包括为它们分配对应的内存空间。在函数里,会有一些变量的赋值一开始让人摸不着头脑,经过查找资料和跟踪代码确认,现对如下变量进行解释: int i_mb_count = h->mb.i_mb_count; //!h->mb.i_mb_s

HEVC_CJL的专栏 2581

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

X264编码流程

Main函数中包含三个函数:Init,Encode,Fini,分别用来初始化,编码和编码后内存处理。 Init: I**(1)X264_param_default:** 参数初始化,包括:CPU,视频参数,编码参数,码率控制参数,日志,分析参数和量化参数等。需要注意的是: param->rc.i_qp_constant = 26; //量化步长;     param->b_cabac=0;// 关闭CABAC编码;     param->analyse.i_me_method = X

weixin_43937576的博客 743

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

x264.c主线程调用说明

main() main_internal(): x264_threading_init(): parse():Parse command line data sigint_handler():设置b_ctrl_c = 1; encode(): x264_encoder_open(): x264_threading_init(): validate_parameters(): x264_cqm_parse_file(): x264_reduce_fraction(): x264_sps_init():根据输入

beidoubushixing的博客 662

x264代码分析:参考帧管理

X264是一款研究的是H.264编码的开源代码软件,相比JM而言,其编码性能有很大的提高,其支持大多数H.264的特性工具,包括:CABAC和 CAVLC高效嫡编码、多参考帧预测、所有的帧内预测宏块类型(16x6l和4x4)、所有的前向帧间预测P(帧)宏块类型 (16xl6,16x8,8xl6,8x8,8x4,4x8和4x4)、最常用的双向帧间预测(B帧)宏块类型(16xl6,16x8,8xl6和 8x8)、1/4 像素精度运动估计、率失真优化、自适应B帧选择且B帧可作为参考帧。......

BigDream123的博客 1422

FFmpeg 之X264视频编码与FAAC音频编码(四)

写到这里也结束了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个学习思路及方向,从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!目、讲解视频,并且会持续更新!**如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

2401_84121998的博客 1060

encoder.c中x264_slice_header_init内部printf:i_frame

0、1、2、3、4......249、0、1、2、3、4...、48、49   x264 --crf 22  -o test.264 hall_cif.yuv 352x288 static void x264_slice_header_init( x264_t *h, x264_slice_header_t *sh,                                    ...

wmnmtm的专栏 170
上一篇: x264运动估计
下一篇: x264_validate_parameters
android_lee2013
博客等级 码龄16年 86粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值