1 / 19

谢谢你: 我只对编码部分整体的看了一边,理解很浅显,希望你看完之后能够帮我指正一下。 每一个流程前边列出了该流程的出处,我只针对自己认为比较复杂的函数画出了流程图。 问题 :

谢谢你: 我只对编码部分整体的看了一边,理解很浅显,希望你看完之后能够帮我指正一下。 每一个流程前边列出了该流程的出处,我只针对自己认为比较复杂的函数画出了流程图。 问题 : 我感觉虽然做的是框架的工作,但是对 x264 的整体把握的并不好,不知道问题出在哪里? 有什么可以加深理解的办法呢? 我得目标是针对具体的某一块的算法进行优化,我想先要把整个程序的所有细节实现都看的比较明白了 以后在开始进行优化,不知道是否可行。还有你建议从哪里切入开始看细节部分呢?我是不是对标准的理解

ringo
Download Presentation

谢谢你: 我只对编码部分整体的看了一边,理解很浅显,希望你看完之后能够帮我指正一下。 每一个流程前边列出了该流程的出处,我只针对自己认为比较复杂的函数画出了流程图。 问题 :

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 谢谢你: 我只对编码部分整体的看了一边,理解很浅显,希望你看完之后能够帮我指正一下。 每一个流程前边列出了该流程的出处,我只针对自己认为比较复杂的函数画出了流程图。 问题: 我感觉虽然做的是框架的工作,但是对x264的整体把握的并不好,不知道问题出在哪里? 有什么可以加深理解的办法呢? 我得目标是针对具体的某一块的算法进行优化,我想先要把整个程序的所有细节实现都看的比较明白了 以后在开始进行优化,不知道是否可行。还有你建议从哪里切入开始看细节部分呢?我是不是对标准的理解 还不够深入,在看程序的时候返回去查看标准的时候应该看哪一个文档比较好呢?是H.264_Prepublish_0503.doc么? 谢谢目前就这些问题了,你有时间的话帮我看看 吧!

  2. X264.c: main x264_param_default 设置默认参数 读取命令行并分析 Parse 编码Encode X264.c:Encode 设置输出文件参数 p_set_outfile_param 得到总帧数 p_get_frame_total 初始化编码器 x264_encoder_open 为新图分配空间 x264_picture_alloc 更新,清理图片区, 关闭解码器,关闭输入输出文件 对帧编码 Encode frame 延迟的B帧

  3. X264:Encode_Frames 调用 x264_encoder_encode 进行编码 不强制任何参数 编码NAL层 x264_nal_encode p_write_nalu 写入 图片结束 Encoder.c: x264_encoder_encode 移动一些B 帧 和一个非B帧到编 码队列中去 编码 Do encode 将图片copy到一帧 中去并且移动到一个 缓冲器 获得要被编码 的帧 选择帧类型 更新编码器状态 判断是否存放 重建的帧 计算和打印 统计值 设置输出 图片属性

  4. Encoder.c: do encode 初始化 (参考列表,bit率控制) 设置帧上下文 (初始化帧类型) 创建切片头部 写入bit流:初始化bit流上下文 ->写入序列参数信号和图片 参数信号->写入切片数据 (x264_slice_write)->bit流 结束,设置输出。

  5. 初始化状态参数 Encoder.c: x264_slice_write NAL单元开始 写切片头部 如果是cabac编码 初始化上下文以及编码器 编码开始 装载缓冲区 分析宏块参数 x264_macroblock_analyse 宏块编码 x264_macroblock_encode

  6. 是否为 跳过宏块 是 否 是否为 cabac编码 是 否 写入cabac编码 x264_macroblock _write_cabac 写入cavlc编码 x264_macroblock_write_cavlc 进行相关处理 写入结束 End 保存缓冲区数据 编码结束(cabac或者cavlc) NAL单元编码结束

  7. Analysis.c : x264_macroblock_analyse 设置QP 并且避免QP变化太快 对分析进行初始化 分析开始 B P 判断切片类型 I 进行帧内模式分析 比较16*16和4*4 子块模式 B切片分析 P切片分析 从分析中更新 宏块 宏块分析结束

  8. P 检查是否为 跳过P宏块 否 P切片分析 是 分析加载花费 分析帧间 16*16模式 相关处理 是否为16*16 子块模式 是 分析帧间P模式 8*8子块 否 选择最好的 帧间模式 检测到16*16子 块信号并且帧内8*8花费 小于16*16运动 估计花费 是 分析帧间8*8子块 否

  9. 分析帧间 16*8/8*16子块 进行1/4象素加工 最佳帧内宏块模式 分析,并对色度和亮度 成分分别附值 P切片分析结束

  10. 判断是否为 直接模式 B切片分析 是 否 进行相关处理 判断是否为 skip模式 是 否 分析加载花费, 直接模式和 帧间16*16模式 是否收到16*16 子块信号 否 分析帧内8*8, 8*16,16*8子块 加工1/4象素精度

  11. 最佳帧内宏块 模式分析 B切片 分析结束

  12. Macroblock.c: x264_macroblock_encode 判断是否为 跳过P宏块 是 x264_macroblock_ encode_pskip( h ) 否 判断是否为 跳过B宏块 是 x264_macroblock_ encode_skip( h ) 否 量化缩放 判断宏块类型 I 16*16 I 4*4 x264_mb_encode _i16x16 x264_mb_encode _i4x4 Inter MB 运动补偿x264_mb_mc 16×16DCT变换 分别对每一个4×4块量化和z扫描 以及对每一个8×8的块进行化简 色度编码开始

  13. 量化放缩 判断是否为skip模式, 并进行相关处理 x264_mb_encode_8x8 色度编码结束 计算亮度色度句型,以及非零计数 存储cbp: coded_ block_ pattern 检查P/B跳过情况, 进行相应处理 宏块编码结束

  14. 读取 h->mb.pic.p_fenc[0]中的数据, 对其进行16*16dct变换,系数存放 在一个三维数组(17*4*4)里边, 的dct[1][][]中 Encoder.c: x264_mb_encode_i16x16 进入循环16次 对每一个4*4块进行编码 将所有的4*4块的dc系数,按照 一定顺序存放在Dct[0][ ] [ ]中 量化Z扫描,结果存放于 h->dct.block[i].residual_ac 反量化所有dct[1][][]中的系数 是 i<16 否 对dct[0][][]中的所有dc系数 进行量化和扫描,解雇存放于 h->dct.luma16x16_dc 重建块(idct,反量化),并将结果 存放入h->mb.pic.p_fdec[0] 宏块编码结束

  15. Encoder.c: x264_mb_encode_i4×4 对4*4子块dct变换从p_src和p_dst 取出数据变换以后放在dct4*4中 对dct4*4量化 4*4 Z字型全扫描结果存放于 h->dct.block[idx].luma4x4 对dct4*4 中的数据解量化 对dct4*4中的数据进行idct变换, 结果放置于p_dst 中,用于重建 编码结束

  16. common\macroblock.c:x264_mb_mc 判断宏块类型 为使用列表0预测的 16*16预测模式 如果宏块类型为 P8*8或者B8*8 是否为B跳过 或者直接模式 分三种情况进行处理 (16×16,16×8,8×16) x264_mb_mc_0xywh 是 否,即为其 他B模式 x264_mb_mc_direct8x8 分为D_L0,D_L1,以及B预测 三大种种情况进行讨论分别调用: x264_mb_mc_0xywh x264_mb_mc_1xywh x264_mb_mc_01xywh x264_mb_mc_direct8x8 进行处理 初始化参考列表 判断宏块部分类新 D_16x16 End D_16x8 D_8*16

  17. Macroblock.c: x264_mb_encode_8x8(编码色度成分) 对色度成分进行 8×8子块dct变换 对每一个4×4子块进行处理: 存储dc系数,量化,z扫描,反量化 对每一个子块的dc系数进行单独处理 量化,z扫描 对每一个子块的dc系数进行反变换和反量化 用于重建块 判断如果为B帧间模式并且简化参数足够低则: 该8*8块几乎没有色度数据因此把它置为空, 这样作可以节省bit 对整块进行反dct变换,用于重建 结束

  18. Cavlc.c:x264_macroblock_write_cavlc 判断切片类型I,P,B 写入宏块类型,预测,和运动矢量 是否为I_PCM类型 是 写入哥伦布函数 bs_ write _ue 否 是否为I_4×4类型 是 补齐0 写入哥伦布函数 bs_ write _ue 分别写入Y, Cr, Cb值 并且返回 是否为I_16×16类型 是 为每一个4*4亮度子块进 行预测返回预测模式 结束 否 跳出类型判断 写入亮度和色度 的预测类型 写入每一个亮度4×4 子块的预测模式 是否为P_L0类型 是 写入色度的预测模式 判断宏块部分的类型 (16×16,16×8,8×16) 否 跳出类型判断 写入部分类型,针对每种不同类型 写入参考帧号和预测矢量 跳出类型判断

  19. 是否为P_8×8类型 是 写入子宏块类型 否 是否为B_8×8类型 是 写入4个参考图像索引 写入宏块类型 否 是否为B直接类型 写入子宏块的mvd? x264_sub_mb_mv_write_cavlc 否 写入子块类型 跳出宏块类型判断 是 写入参考帧索引 初始化参考列表 直接写0 写入残差块,注意对B宏 块来说是两个残差分量 写入宏块类型 跳出宏块类型判断 写入参考帧索引 写入mvd 写入编码的块的句型 写入残差数据 block_ residual_ write_ cavlc 结束

More Related