基于H.264 JM参考模型的8x8/4x4帧内预测模式获取及I帧恢复问题
获取H.264 JM参考模型中8x8/4x4块的帧内预测模式
调整JM解码器的trace输出配置
- 修改JM的配置文件(通常为
encoder.cfg或decoder.cfg),开启子宏块级别的trace输出:- 将
TraceLevel参数调高至3及以上(具体数值可参考JM官方文档的参数说明) - 启用
WriteSubMBInfo参数(部分版本可能命名为TraceSubblocks),设置为1以开启子块信息记录
- 将
- 使用修改后的配置文件重新运行
ldecod.exe生成trace文件
检查并修改JM源码的trace输出逻辑
- 打开JM解码器源码中的
trace.c或decoder.c文件,定位帧内预测模式的输出代码段 - 若源码中未包含8x8/4x4子块的模式输出逻辑,手动添加对应代码(以4x4块为例):
8x8块可参照类似逻辑,输出对应子块的预测模式值// 在子宏块处理的trace输出部分添加 if (submb_type == I_4x4) { fprintf(trace_fp, "<TypeString>I_4x4_%d_%d_%d_%d</TypeString>\n", submb_mode[0], submb_mode[1], submb_mode[2], submb_mode[3]); } - 重新编译JM解码器,生成包含子块模式信息的
ldecod.exe后再执行解码
适配Python解析代码
- 扩展原有trace解析逻辑,新增对8x8/4x4块模式字段的解析:
def parse_intra_mode(line): if "I_4x4_" in line: mode_str = line.split("I_4x4_")[1].split("</TypeString>")[0] return {"block_type": "4x4", "modes": list(map(int, mode_str.split("_")))} elif "I_8x8_" in line: mode_str = line.split("I_8x8_")[1].split("</TypeString>")[0] return {"block_type": "8x8", "modes": list(map(int, mode_str.split("_")))} # 保留原16x16块的解析逻辑
内容的提问来源于stack exchange,提问作者Yuhang Ye
相关产品推荐
相关产品推荐

