x264

x264

x264  h264

1. x264调用主要过程

x264_param_default():设置参数集结构体x264_param_t的缺省值。

x264_picture_alloc():为图像结构体x264_picture_t分配内存。

x264_encoder_open():打开编码器。

x264_encoder_encode():编码一帧图像。

x264_encoder_close():关闭编码器。

x264_picture_clean():释放x264_picture_alloc()申请的资源。

x264_encoder_open()调用了下面的函数:

x264_validate_parameters():检查输入参数(例如输入图像的宽高是否为正数)。

x264_predict_16x16_init():初始化Intra16x16帧内预测汇编函数。

x264_predict_4x4_init():初始化Intra4x4帧内预测汇编函数。

x264_pixel_init():初始化像素值计算相关的汇编函数(包括SAD、SATD、SSD等)。

x264_dct_init():初始化DCT变换和DCT反变换相关的汇编函数。

x264_mc_init():初始化运动补偿相关的汇编函数。

x264_quant_init():初始化量化和反量化相关的汇编函数。

x264_deblock_init():初始化去块效应滤波器相关的汇编函数。

x264_lookahead_init():初始化Lookahead相关的变量。

x264_ratecontrol_new():初始化码率控制模块。

x264_encoder_headers()调用了下面的函数:

x264_sps_write():输出SPS

x264_pps_write():输出PPS

x264_sei_version_write():输出SEI

x264_encoder_encode()调用了下面的函数:

x264_frame_pop_unused():获取1个x264_frame_t类型结构体fenc。如果frames.unused[]队列不为空,就调用x264_frame_pop()从unused[]队列取1个现成的;否则就调用x264_frame_new()创建一个新的。

x264_frame_copy_picture():将输入的图像数据拷贝至fenc。

x264_lookahead_put_frame():将fenc放入lookahead.next.list[]队列,等待确定帧类型。

x264_lookahead_get_frames():通过lookahead分析帧类型。该函数调用了x264_slicetype_decide(),x264_slicetype_analyse()和x264_slicetype_frame_cost()等函数。经过一些列分析之后,最终确定了帧类型信息,并且将帧放入frames.current[]队列。

x264_frame_shift():从frames.current[]队列取出一帧用于编码。

x264_reference_update():更新参考帧列表。

x264_reference_reset():如果为IDR帧,调用该函数清空参考帧列表。

x264_reference_hierarchy_reset():如果是I(非IDR帧)、P帧、B帧(可做为参考帧),调用该函数(还没研究)。

x264_reference_build_list():创建参考帧列表list0和list1。

x264_ratecontrol_start():开启码率控制。

x264_slice_init():创建 Slice Header。

x264_slices_write(): 编码数据(最关键的步骤)。其中调用了x264_slice_write()完成了编码的工作(注意“x264_slices_write()”和“x264_slice_write()”名字差了一个“s”)。

x264_encoder_frame_end():编码结束后做一些后续处理,例如释放一些中间变量以及打印输出一些统计信息。其中调用了x264_frame_push_unused()将fenc重新放回frames.unused[]队列,并且调用x264_ratecontrol_end()关闭码率控制。

x264_slice_write()中以下几个函数比较重要:

x264_nal_start():开始写一个NALU。

x264_macroblock_thread_init():初始化存储宏块的重建数据缓存fdec_buf[]和编码数据缓存fenc_buf[]。

x264_slice_header_write():输出 Slice Header。

x264_fdec_filter_row():滤波模块。该模块包含了环路滤波,半像素插值,SSIM/PSNR的计算。

x264_macroblock_cache_load():将要编码的宏块的周围的宏块的信息读进来。

x264_macroblock_analyse():分析模块。该模块包含了帧内预测模式分析以及帧间运动估计等。

x264_macroblock_encode():宏块编码模块。该模块通过对残差的DCT变换、量化等方式对宏块进行编码。

x264_macroblock_write_cabac():CABAC熵编码模块。

x264_macroblock_write_cavlc():CAVLC熵编码模块。

x264_macroblock_cache_save():保存当前宏块的信息。

x264_ratecontrol_mb():码率控制。

x264_nal_end():结束写一个NALU。

几个模块:

滤波模块:环路滤波,半像素插值,SSIM,PSNR计算

分析模块:帧间预测,运动估计

码率控制模块:码率控制

宏块编码模块:DCT变换、量化

熵编码模块:CAVLC、CABAC

chrominance(chroma), luminance(luma)

原文地址:https://www.cnblogs.com/gr-nick/p/10805622.html

时间: 2024-10-03 16:06:02

x264的相关文章

ffmpeg+x264推送high422 10bit码流

一.目的 推送一条rtmp流,视频码流采用h264 high422 10bit编码 二.环境 1.linux系统:Red Hat Enterprise Linux Server release 5.8 2.ffmpeg:3.1.4 3.x264:git下来的最新代码(2016-10-21) 三.编译x264+ffmpeg 1.编译x264 ./configure --enable_static --bit-depth=10 make make install 默认安装库和头文件到/usr/loc

x264阅读记录-3

14. x264_macroblock_encode函数-1 这个函数主要根据已经选定的模式来对宏块残差进行编码. (1)如果是P_SKIP模式,那么调用x264_macroblock_encode_pskip函数 在x264_macroblock_encode_pskip中先对亮度和色度进行运动补偿,调用的函数函数h->mc.mc_luma和 h->mc.mc_chroma.这两个是函数指针,根据需要对其进行初始化.一般常用的是函数mc_luma, 在mc.c文件中.在mc_luma中如果存

x264代码剖析(十五):核心算法之宏块编码中的变换编码

x264代码剖析(十五):核心算法之宏块编码中的变换编码 为了进一步节省图像的传输码率,需要对图像进行压缩,通常采用变换编码及量化来消除图像中的相关性以减少图像编码的动态范围.本文主要介绍变换编码的相关内容,并给出x264中变换编码的代码分析. 1.变换编码 变换编码将图像时域信号变换成频域信号,在频域中图像信号能量大部分集中在低频区域,相对时域信号,码率有较大的下降. H.264对图像或预测残差采用4×4整数离散余弦变换技术,避免了以往标准中使用的通用8×8离散余弦变换逆变换经常出现的失配问题

x264 - 高品质 H.264 编码器

转自:http://www.5i01.cn/topicdetail.php?f=510&t=3735840&r=18&last=48592660 H.264 / MPEG-4 AVC 是优秀的视讯编码格式就目前已成熟的视讯编码格式而言,H.264的压缩率是最佳的.压缩率极高,可以只用很低 bitrate 提供堪用画质. 而 x264 为免费开放原始码的 H.264 / MPEG-4 AVC 编码器,是目前编码效率最高的开放原始码 H.264 编码器. 此文只是基础知识,说明只是大略

x264源代码简单分析:熵编码(Entropy Encoding)部分

本文记录x264的 x264_slice_write()函数中调用的x264_macroblock_write_cavlc()的源代码.x264_macroblock_write_cavlc()对应着x264中的熵编码模块.熵编码模块主要完成了编码数据输出的功能. 函数调用关系图 熵编码(Entropy Encoding)部分的源代码在整个x264中的位置如下图所示. 单击查看更清晰的图片 熵编码(Entropy Encoding)部分的函数调用关系如下图所示.   单击查看更清晰的图片 从图中

x264改变输出分辨率的算法

在某些应用场景下,x264的输入视频分辨率与接收端输出的视频分辨率不同. 例如编码端摄像头采集到的YUV数据为1280x720,而接收端视频显示窗口为640x480. 对于这种场景,一般的处理方式是: 源端:采集,编码,传输 720p的码流 收端:接收,解码720p的码流,缩放到480p去显示. 这种方式的劣势在于编码,传输了接收端用不到的大分辨率码流. 一种改进的方式是在源端缩放720p的视频输入数据: 源端:采集720p,缩放到480p,输入480p给x264编码器编码,传输 480p的码流

ubuntu12.04上live555+v4l2+ffmpeg+x264开发环境的搭建

我把可能会用到的主要资源上传到度盘: http://pan.baidu.com/s/1i38AleP ubuntu上安装主要步骤就是解压.configure.make.sudo make install live555的安装可以看这里: http://www.live555.com/liveMedia/#config-unix libx264的安装则是直接解压.然后configure.make和sudo make install,configure命令如下 ./configure --disab

ios及android两个平台下x264编译脚本

今年做了一些音视频编解码工作,此前做图形.图像类工作多一些,做了音视频编解码才知道,这项工作还是很有趣.很神奇的.比如采集几十M的视频数据,经过编码存储后,文件体积仅仅有几十K大小,这当中就需要x264来发挥神奇了.下面将手机端ios及android两个平台下x264编译脚本分享出来,希望对正在做相关工作的同学有帮助.x264源码地址:http://www.videolan.org/developers/x264.html 1. ios平台下x264编译.这个编译脚本修改自:https://gi

x264编码延时研究

研究了一下x264编码延时. 方法是加log在x264.c static int encode( x264_param_t *param, cli_opt_t *opt ) { ... i_frame_size = encode_frame( h, opt->hout, &pic, &last_dts ); if( i_frame_size == 0)   // delay frames fprintf( stderr, "output zero %d\n", i

win7中用MinGW编译x264出现"No working C compiler found."错误

Description Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + - + Ak. Input The input contains exactly one test case. The first line of input contains three positive integers n (n ≤ 30), k (k ≤ 109) and m (m < 104). Then