• x264


    x264

    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)

  • 相关阅读:
    21. 合并两个有序链表
    169. 多数元素
    关于快速幂取模
    IO帮助类
    XML序列化
    字符操作普通帮助类
    判断是否是手机
    C#命名规范汇总12条
    xamarin android如何将Java.Lang.Object类型转成C#类型
    mqtt服务器apollo的搭建和测试工具paho的使用
  • 原文地址:https://www.cnblogs.com/gr-nick/p/10805622.html
Copyright © 2020-2023  润新知