x264_t 结构体维护着CODEC的诸多重要信息
其中成员frames是一个指示和控制帧编码过程的结构。其中current是已经准备就绪可以编码的帧,其类型已经确定;next是尚未确定类型的帧;unused用于回收不使用的frame结构体以备今后再次使用。
struct x264_t ////
{
/* cpu capabilities */
unsigned int cpu;
/* bitstream output */
struct
{
int i_nal; //定义一个网络提取层//
x264_nal_t nal[3]; /* for now 3 is enought */
int i_bitstream; /* size of p_bitstream */
uint8_t *p_bitstream; /* will hold data for all nal */
bs_t bs;
} out;
/* encoder parameters */
x264_param_t param;
/* frame number/poc (TODO: rework that for B-frame) */
int i_frame; //一个指示和控制帧编码过程的结构
int i_poc;
int i_frame_offset; /* decoding only */
int i_frame_num; /* decoding only*/
int i_poc_msb; /* decoding only */
int i_poc_lsb; /* decoding only */
/* We use only one SPS and one PPS */
x264_sps_t sps_array[32];
x264_sps_t *sps;
x264_pps_t pps_array[256];
x264_pps_t *pps;
int i_idr_pic_id;
/* Slice header */
x264_slice_header_t sh;
/*cabac context */
x264_cabac_t cabac;
/*current picture being encoded */
x264_picture_t *picture;
/*bframe handling (only encoding for now) */
x264_frame_t *bframe_current[X264_BFRAME_MAX]; /* store the sequence of b frame being encoded */
x264_frame_t *frame_next[X264_BFRAME_MAX+1]; /* store the next sequence of frames to be encoded */这个是定义下一个帧,但不一定是B帧
x264_frame_t *frame_unused[X264_BFRAME_MAX+1]; /* store unused frames */
/*frame being reconstructed */
x264_frame_t *fdec;
/*Current MB DCT coeffs */
struct
{
DECLARE_ALIGNED( int, luma16×16_dc[16], 16 );
DECLARE_ALIGNED( int, chroma_dc[2][4], 16 );//色度
struct
{
DECLARE_ALIGNED( int, residual_ac[15], 16 );
DECLARE_ALIGNED( int, luma4×4[16], 16 );
} block[16+8];16*8的宏快的取用情况
} dct;离散余弦变换
/* MBtable and cache for current frame/mb */
struct
{
/*Strides */
int i_mb_stride;
/*Current index */
int i_mb_x;
int i_mb_y;
int i_mb_xy;
unsigned int i_neighbour;
/* mb table */
int8_t *type; /*mb type */
int8_t *qp; /* mb qp */
int16_t *cbp; ? /* mbcbp: 0×0?: luma, 0x?0: chroma, 0×100: luma dc, 0×0200 and 0×0400: chroma
dc (all set for PCM)*/
int8_t (*intra4×4_pred_mode)[7]; /* intra4×4 predmode. for non I4×4 set to I_PRED_4×4_DC(2) */
uint8_t (*non_zero_count)[16+4+4]; /* nzc. for I_PCMset to 16 */
int8_t *chroma_pred_mode; /*chroma_pred_mode. cabac only. for non intra I_PRED_CHROMA_DC(0) */
int16_t (*mv[2])[2]; /* mb mv. set to 0 for intra mb */
int16_t (*mvd[2])[2]; /* mb mv difference with predict. set to 0 if intra. cabac only */
int8_t *ref[2]; /*mb ref. set to -1 if non used (intra or Lx only */
/*current value */
int i_type;
int i_partition;
int i_sub_partition[4];
int i_cbp_luma;
int i_cbp_chroma;
int i_intra16×16_pred_mode;
int i_chroma_pred_mode;
struct
{
/*pointer over mb of the frame to be compressed */
uint8_t *p_img[3];
int i_img[3];
/*pointers over mb of references and reconstrucated frame */
uint8_t *p_fdec[3];
uint8_t*p_fref[2][16][3];
int i_fdec[3]; /* same strides for p_fdec/p_fref */
} pic;
/*cache */
struct
{
/*real intra4×4_pred_mode if I_4X4, I_PRED_4×4_DC if mb available, -1 if not */
int intra4×4_pred_mode[X264_SCAN8_SIZE];色度预测模式
/*i_non_zero_count if availble else 0×80 */
int non_zero_count[X264_SCAN8_SIZE];
/*-1 if unused, -2 if unavaible */
int8_t ref[2][X264_SCAN8_SIZE];
/*0 if non avaible */
int16_t mv[2][X264_SCAN8_SIZE][2];
int16_t mvd[2][X264_SCAN8_SIZE][2];运动矢量与真实值之间的差
} cache;
/**/
int i_last_qp; /* last qp */
int i_last_dqp; /*last delta qp */
} mb;宏快的预测以及运动补偿和运动估计
/*frames used for reference */
x264_frame_t *freference[16+1]; /* all references frames plus current */
int i_ref0; 参考帧列表一(定义为lsit0意为向前预测编码)
x264_frame_t *fref0[16]; /* ref list 0*/
int i_ref1;参考帧列表二(定义为lsit1意为向后预测编码)
x264_frame_t *fref1[16]; /* ref list 1*/
/*rate control encoding only */
x264_ratecontrol_t *rc;
/*stats */
struct
{
/*per slice info */
int i_slice_count[5];
int i_slice_size[5];
float f_psnr_y[5];
float f_psnr_u[5];
float f_psnr_v[5];
int i_mb_count[5][18];
} stat;声明每一片的参数变量
/* CPU functions dependants */
x264_predict_t predict_16×16[4+3];
x264_predict_t predict_8×8[4+3];
x264_predict_t predict_4×4[9+3];
x264_pixel_function_t pixf;
x264_mc_function_t mc[2];
x264_dct_function_t dctf;
/* vlc table for decoding purpose only */
x264_vlc_table_t *x264_coeff_token_lookup[5];
x264_vlc_table_t *x264_level_prefix_lookup;
x264_vlc_table_t *x264_total_zeros_lookup[15];
x264_vlc_table_t *x264_total_zeros_dc_lookup[3];
x264_vlc_table_t *x264_run_before_lookup[7];
};
#endif
给出编码过程中的各个参数的初始化
x264_param_t
typedef struct
{
/* CPU flags */
unsigned int cpu;
/* Video Properties */
int i_width;
int i_height;
struct
{
/*they will be reduced to be 0 < x <= 65535 and prime */
int i_sar_height;
int i_sar_width;
} vui;?
float f_fps;
/* Used for rate control only */
/*Bitstream parameters */
int i_frame_reference; /* Maximum number of reference frames */
int i_idrframe; /*every i_idrframe I frame are marked as IDR */
int i_iframe; /* every i_iframe are intra */
int i_bframe; /* how many b-frame between 2 references pictures */
int b_deblocking_filter;
int b_cabac;
int i_cabac_init_idc;给出熵编码初始化时表格的选择
int i_qp_constant; /* 1-51 */
int i_bitrate; /* not working yet */
/* Encoder analyser parameters */
struct
{
unsigned int intra; /* intra flags */
unsigned int inter; /* inter flags */
} analyse;
}
x264_param_t给出编码过程中的各个参数的初始化
sps序列参数集
typedef struct
{
int i_id;
int i_profile_idc;指明所用profile
int i_level_idc; 指明所用level
int b_constraint_set0;
int b_constraint_set1;
int b_constraint_set2; 当他们值等于1时,表示必须遵守某些制约条件
int i_log2_max_frame_num;表示图像解码顺序的最大取值
int i_poc_type; /* poc 0 */
int i_log2_max_poc_lsb; /* poc 1 */
int b_delta_pic_order_always_zero;其值等于一时句法元素delta_pic_order_cnt[0]和 delta_pic_order_cnt[1]不再片头出现,且他们的默认值都为0。为0时上述则出现。
int i_offset_for_non_ref_pic;用来计算非参考帧或场的picture order count ,其值应在[-2e31,2e31-1]
int i_offset_for_top_to_bottom_field; 用来计算帧的底场的picture order count 其值应在[-2e31,2e31-1]
int i_num_ref_frames_in_poc_cycle;用来解码picture order count 取值应在[0,255]之间
int i_offset_for_ref_frame[256]; 当picture order count type=1时用来解码poc,这句语法对循环num_ref_frames_in_poc_cycle中的每一个元素指定了一个偏移
int i_num_ref_frames;指定参考帧队列的最大长度 h264规定最多可为16个参考帧
int b_gaps_in_frame_num_value_allowed;值为1时表示允许句法frame_num可以不连续
int i_mb_width;
int i_mb_height;
int b_frame_mbs_only;
int b_mb_adaptive_frame_field;
int b_direct8×8_inference;指明b片的直接和skip模式下运动矢量的预测方法
int b_crop;
struct
{
int i_left;
int i_right;
int i_top;
int i_bottom;
} crop;图像剪彩后输出的参数
int b_vui;
struct
{
int i_sar_width;
int i_sar_height;
/* FIXME to complete */
} vui;
}
x264_sps_t定义序列参考队列的参数以及初始化
pps图像参数集
typedef struct
{
int i_id;
int i_sps_id;
int b_cabac;
int b_pic_order;
int i_num_slice_groups; 加一表示图像中片组的个数
int i_slice_group_map_type;片组分割类型 /*i_slice_group_map_type == 0 */
int i_run_length[256]; 指明片组类型为2时每个片组连续的map_units的个数 /* FIXME */
/*i_slice_group_map_type == 2 */
int i_top_left[256]; /* FIXME */
int i_bottom_right[256]; /* FIXME */
/*i_slice_group_map_type == 3, 4, 5 */
int b_slice_group_change_direction; 当类型为345时与下句语法一起指明片组分割方法
int i_slice_group_change_rate; /*i_slice_group_map_type == 6 */
int i_pic_size_in_map_units;类型为6时指明图像以map_units为单位的大小
int i_slice_group_id[256]; /* FIXME */指明map_units属于哪个片组
int i_num_ref_idx_l0_active;加1为参考帧队列的长度 此为list0
int i_num_ref_idx_l1_active;此为list1
int b_weighted_pred;用以指明是否允许P和SP片的加权预测
int b_weighted_bipred; 用以指明是否允许B片的加权预测
int i_pic_init_qp;加26后用以指明亮度分量的量化参数的初始值
int i_pic_init_qs;同上只是用于SP和SI
int i_chroma_qp_index_offset;指明计算使用时用到的参数
int b_deblocking_filter_control;
int b_constrained_intra_pred;控制PB帧的帧内编码
int b_redundant_pic_cnt;是否出现redundant_pic_cnt句法元素
} x264_pps_t
分享到:
相关推荐
在IT领域,"struct"是一个非常重要的概念,尤其是在C/C++等编程语言中。...因此,如果你正在寻找关于struct的高质量学习资料,建议寻找信誉良好的在线课程、教科书或官方文档,以确保获取准确且安全的信息。
1. asm-x.x.jar 2. asm-commons-x.x.jar 3. asm-tree-x.x.jar 4. commons-io-X.X.X.jar 5. commons-lang3-X.X.X.jar 6. commons-fileupload-X.X.X.jar 7. freemarker-X.X.X.jar 8. javassist-X.X.X.jar 9. ognl-X.X....
1. **Spring Boot 3**: Spring Boot是Spring框架的一个模块,它简化了初始化、配置和运行Spring应用的过程。Spring Boot 3是最新版本,提供了更多性能优化和对新Java版本的支持,如Java 17。它包含自动配置、起步...
本实践项目是基于VS2005进行的,它提供了关于如何使用Struct和Enums的实例,帮助学习者加深理解。 **结构(Struct)** 结构是一种值类型,它的数据存储在栈中,这意味着它不具有引用类型的特性,如引用传递和默认的...
在 MATLAB 开发环境中,`xstruct` 是一个特殊设计的类,它允许用户创建和管理类似于结构体的数据结构,但这些结构体的字段值可以在...记住,学习使用 `xstruct` 能够提升你在 MATLAB 环境中的编程效率和代码可维护性。
- Commons-logging-1.x.x.jar:ASF出品的日志包,Struts2框架用以支持Log4J和JDK 1.4+日志记录。 - Commons-fileupload-1.2.1.jar:文件上传组件,在Struts2版本2.1.6之后,该组件成为必需。 通过上述详细的知识点...
在编程世界中,C++和C#是两种广泛使用的编程语言,它们在处理数据传递时有一些相似之处,但也有明显的差异。...在深入学习“1.4struct”等文件中的示例和细节后,你会对C++和C#的struct数据传递有更全面的理解。
这篇Golang学习笔记主要探讨了struct的声明与初始化、匿名字段(继承)、方法以及方法的继承与重写。 1. 声明及初始化: 在Golang中,我们可以使用`type`关键字来声明一个新的struct类型。例如,定义一个`person`...
这里的`StructName`是结构体的类型名,`member1`、`member2`等是结构体的成员,它们可以是各种基本数据类型,如整型、浮点型、字符型等,甚至其他结构体或指针类型。 结构体的声明并不创建实例,而是定义了一个新的...
这个"struts1.x + hibernate 3+spring 3 集成实例"是一个空项目,特别适合初学者理解和学习,因为有详细的注释,使得理解过程更为简单易懂。 Struts1.x 是一个基于MVC(Model-View-Controller)设计模式的Java Web...
在编程领域,结构体(Struct)是数据组织的一种基本方式,尤其在C、C++、Go等语言中占据着核心地位。"Struct in Action"这个主题深入探讨了如何有效地使用结构体来处理复杂的数据结构和实现高效的数据操作。在这个...
java种菜源码使用标准项目结构以及 Mapstruct、lombok 等公开 Rest Service。 MapStruct 库用于 Java bean 类型之间的映射。 通过在 MapStruct 中使用自定义映射器,我们可以自定义默认映射方法 git clone ...
1. 寄存器访问:FT62F08X的硬件功能通过一系列的寄存器来控制。C程序中,可以使用结构体来封装这些寄存器,例如: ```c typedef struct { uint8_t P0; // P0端口寄存器 // 其他寄存器... } FMDRegs; extern ...
Bus X Struct 是一个示例,演示了如何在 Matlab 和 Simulink 之间使用 BusObjects 来处理和传递 Matlab 结构体数据。这个示例特别针对的是 Matlab 开发者,特别是那些使用 Simulink 进行系统级建模的用户。在 ...
1. 通过`struct`关键字定义结构体类型,并指定其成员变量,例如: ```c struct student_tag { char ID[7]; char name[20]; char gender; int age; char phone[9]; char addr[30]; }; ``` 这定义了一个名为`...
但在实际的编程过程中,我们往往还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号为整数,年龄为整数,所在的学习小组为字符,成绩为小数,因为数据类型不同,显然不能用一个数组来存放。...
逻辑斯谛映射常用于模拟生物种群的增长,其公式为:x[n+1] = r * x[n] * (1 - x[n]),其中r是控制参数,x[n]是当前状态。通过改变r值,可以观察到从稳定到混沌的过渡。 在MATLAB中实现混沌神经网络,通常包括以下...
struct node* lserch(struct node* head, int x) { struct node* k = head; while (k != NULL && k->d != x) k = k->next; return k; } ``` 2. **有序表的对分查找**: 对分查找仅适用于有序线性表,其效率...
1. 下载Struts1的库文件,如`struts-1.x.x.jar`,并将其添加到你的项目的`WEB-INF/lib`目录下。 2. 配置`web.xml`文件,这是Web应用的部署描述符。在其中,你需要定义Struts的前端控制器`ActionServlet`,并设置对应...
4.x 系列章节可能涵盖了字符串处理、正则表达式(re模块)以及文本I/O(StringIO)和二进制I/O的相关操作,还有可能涉及数据结构的编码与解码(struct模块)。 5.x 系列章节可能讨论了更多的数据操作,如列表推导式...