`
weiyinchao88
  • 浏览: 1213392 次
文章分类
社区版块
存档分类
最新评论

开启 JM 的 trace 功能

 
阅读更多
本帖最后由 firstime 于 2009-6-15 11:16 AM 编辑

城里汉子说过:
trace文件对分析码流结构很有效。我说的是trace文件,不是一步一步跟踪,就是编解码同时生成的 trace_enc.txt 这个文件,里面对每个比特位是什么都有记录。

本论坛的帖子“H.264编解码手册”里的 H.264_MPEG-4 AVC Reference Software Manua 建议大家去看看。这个文件对编解码的所有参数做了详细介绍

trace_enc.txt 是编码的文件
trace_dec.txt 是解码的文件

运行编解码器之后才会生成相应的 trace 文件


在代码中有个参数要设置一下才行:

在defines.h文件中把

#if defined _DEBUG
#define TRACE 0 //!< 0:Trace off 1:Trace on
#else

改成
#if defined _DEBUG
#define TRACE 1 //!< 0:Trace off 1:Trace on
#else

[ 本帖最后由 firstime 于 2007-3-9 08:17 PM 编辑 ]

如何阅读 trace 文件

@0 SPS: profile_idc 01011000 ( 88)
@8 SPS: constrained_set0_flag 0 (0)
@9 SPS: constrained_set1_flag 0 (0)
@10 SPS: constrained_set2_flag 0 (0)
@11 SPS: constrained_set3_flag 0 (0)
@12 SPS: reserved_zero 0000 (0)
@16 SPS: level_idc 00011110 ( 30)

以此为例,对应码流中的 NALU 单元为:6758001E.........,其中 0X67 是 NALU 头,从 0X58 开始为 NALU 体

第一行含义:从 NALU 体第 0 个比特开始的比特串为 SPS 中的语法元素 profile_idc ,其十进制表示值为 88 。标准 7.3.2.1 小节表格中规定该语法元素编码方式为U(8),因此 88 按 U(无符号数) 方式编码的二进制值为 1011000。 因为该语法元素编码方式为 U(8),即采用 8 比特无符号数编码,因此,最终在码流中应该补足 8 位,结果为 01011000;

第二行含义:从 NALU 体第 8 个比特开始的比特串为 SPS 中的语法元素 constrained_set0_flag ,其十进制表示值为 0 。标准 7.3.2.1 小节表格中规定该语法元素编码方式为 U(1),因此 0 按 U(1) 方式编码的二进制值为 0;

第三行含义:从 NALU 体第 9 个比特开始的比特串为 SPS 中的语法元素 constrained_set1_flag ,其十进制表示值为 0 。标准 7.3.2.1 小节表格中规定该语法元素编码方式为 U(1),因此 0 按 U(1) 方式编码的二进制值为 0;

第四行含义:从 NALU 体第 10 个比特开始的比特串为 SPS 中的语法元素 constrained_set2_flag ,其十进制表示值为 0 。标准 7.3.2.1 小节表格中规定该语法元素编码方式为 U(1),因此 0 按 U(1) 方式编码的二进制值为 0;

第五行含义:从 NALU 体第 11 个比特开始的比特串为 SPS 中的语法元素 constrained_set3_flag ,其十进制表示值为 0 。标准 7.3.2.1 小节表格中规定该语法元素编码方式为 U(1),因此 0 按 U(1) 方式编码的二进制值为 0;

第六行含义:从 NALU 体第 12 个比特开始的比特串为 SPS 中的语法元素 reserved_zero,其十进制表示值为 0 。标准 7.3.2.1 小节表格中规定该语法元素编码方式为 U(4),因此 0 按 U(无符号数) 方式编码的二进制值为 0; 因为该语法元素编码方式为 U(4),即采用 4 比特无符号数编码,因此,最终在码流中应该补足 4 位,结果为 0000;

第七行含义:从 NALU 体第 16 个比特开始的比特串为 SPS 中的语法元素 level_idc,其十进制表示值为 30 。标准 7.3.2.1 小节表格中规定该语法元素编码方式为U(8),因此 30 按 U(无符号数) 方式编码的二进制值为 11110; 因为该语法元素编码方式为 U(8),即采用 8 比特无符号数编码,因此,最终在码流中应该补足 8 位,结果为 00011110;

将上述结果的二进制串连起来:
01011000 0 0 0 0 0000 00011110

按每 8 个比特划分为一段:
01011000 00000000 00011110

将其转换为 16 进制:
58001E

实际传输的码流就是上面的二进制串,而我们用 ultraedit 看到的码流正是其 16 进制表示方式

[ 本帖最后由 firstime 于 2006-12-15 11:57 AM 编辑 ]

谢谢牛人啊!

嘿嘿,这个是我很想看到的啊,十分感谢啊!!

举个例子
这个里面怎么那么多MVD?
********* Pic: 33 (I/P) MB: 51 Slice: 0 **********
@108388mb_skip_flag 0000 (1)
@108392mb_type (P_SLICE) ( 7, 4) = 1 1 (1)
@108393ref_idx_l0 = 0 (0)
@108393mvd_l0 (0) = 2(org_mv 2 pred_mv 0) 010110 (2)
@108399mvd_l0 (1) = 0(org_mv 0 pred_mv 0) (0)
@108399CBP ( 7, 4) =31 00001001111 ( 31)
@108410transform size 8x8 flag = 1 11 (1)
@108412Delta QP ( 7, 4) = 0 (0)
@108412Luma8x8 sng( 0) level = -2 run = 0 ( -2)
@108412Luma8x8 sng( 1) level =0 run = 0 00001001111 (0)
@108423Luma8x8 sng( 0) level = -3 run = 0 ( -3)
@108423Luma8x8 sng( 1) level =0 run = 1 000001001110 (0)
@108435Luma8x8 sng( 0) level = -2 run = 0 ( -2)
@108435Luma8x8 sng( 1) level =0 run = 1 1001010 (0)
@108442Luma8x8 sng( 0) level = -3 run = 0 ( -3)
@108442Luma8x8 sng( 1) level =0 run = 1 001001001 (0)
@108451DC Chroma0: level =1 run = 0 (1)
@108451DC Chroma1: level =0 run = 2 1010 (0)
@108455DC Chroma0: level = -1 run = 0 ( -1)
@108455DC Chroma1: level =0 run = 1 0101 (0)
CABAC terminating bit = 0
=======================================================================
*********** Pic: 33 (I/P) MB: 53 Slice: 0 **********
@108461mb_skip_flag (0)
CABAC terminating bit = 0
思skip的编码信息急需都没有
那应该在解码的trace里面
但是解码的trace怎么打开
怎么看skip解码的时候copy的是那一块
skip模式的 运动矢量要不要编码的?
编码的运动

1:这个里面怎么那么多MVD?
——
@108392 mb_type (P_SLICE) ( 7, 4) = 1 1 (1)

这行说明该宏块为 P_L0_L0_16x8 类型宏块(参见标准表 7-13 第 2 行)
既然宏块被分割为两个 16*8,那么当然就有两个 MV 值(上面 8 个 4*4 共用一个,下面 8 个 4*4 共用一个),当然就有两个的 MVD 值,即:
@108393mvd_l0 (0) = 2(org_mv 2 pred_mv 0) 010110 (2)
@108399mvd_l0 (1) = 0(org_mv 0 pred_mv 0) (0)

同时可见该宏块并不是 SKIP 宏块,因为该宏块 mb_type= 1


2:解码的trace怎么打开
——解码 trace 打开方式与编码相同


3:skip模式的 运动矢量要不要编码
——请你先认真学习本论坛帖子[原创] Skip、Direct宏块浅析” 。而且请你注意不要混淆概念。H.264 中的预测模式没有 skip,因此不能说“一个宏块是 skip 模式”,只能说“一个宏块是 skip 类型”。skip 类型宏块采用的是 direct 模式。


4:怎么看skip解码的时候copy的是那一块
——每个宏块都有一个参考索引。该参考索引表示了当前宏块解码的参考图像是参考列表中的哪一幅。然后解码器根据这个参考索引和计算出的 MV 确定 copy 参考图像中的哪个 “宏块”。这是由两个条件一起决定的一个计算过程。在 trace 文件中是直接看不出来的。


5:仅仅靠分析 trace 文件是不够的,也是很累的。请你用一段已压缩码流跟踪解码过程。看样子你有点急躁。急躁是解决不了问题的。另外,看样子你的这个码流采用的是 CABAC 熵编码方式。请你试验时候先采用 CAVLC 熵编码的码流。应该从易到难,先通过 CAVLC 理解了 skip 再研究 CABAC 的情况。

[ 本帖最后由 firstime 于 2007-9-16 03:38 PM 编辑 ]
非常感谢!!!!!!!!!!!!!!!!!
多谢firsttime的精辟解疑释惑!
受益 匪浅

太感谢了阿

找出skip块的copy的块 可真麻烦阿
找了好久了
跟踪编码部分
什么都没有找到
对于skip宏块 是不是运动矢量在解码端才会出现(根据相邻块的运动矢量预测出来),然后copy该运动矢量对应的macroblock

跟踪解码部分
半天了
还没有发现在哪一部分针对skip解码
wisitng(80609949)

本帖最后由 firstime 于 2009-6-15 06:47 PM 编辑

你用我加了注释的 JM 解码器代码,进 interpret_mb_mode_B 或 interpret_mb_mode_P 函数就能看见了。interpret_mb_mode_B 的第二个 if 就是 B_skip , interpret_mb_mode_P 的第一个 if 就是 P_skip。

[ 本帖最后由 firstime 于 2006-12-16 10:32 AM 编辑 ]

楼主 强 !
早就想看trace了 ,打开开关,居然不知道trace是存成文件的,害的我在cmd里面都没有看到,晕了好久!
今天终于明白了

分享到:
评论

相关推荐

    JM20330芯片手册

    JM20330芯片内部集成了多个关键的功能模块,共同实现了其强大的性能和功能: - **寄存器文件**:用于配置芯片的工作模式和其他参数。 - **传输层**:负责数据包的封装和解封装,以及错误检查和纠正。 - **状态和控制...

    JM最新版jm19.0+官方手册

    1. **软件架构**:详细解释JM软件的模块组成,如编码器、解码器的结构以及各部分的功能。 2. **编码流程**:介绍从原始视频到编码码流的整个过程,包括帧类型选择、宏块划分、运动估计、变换与量化等步骤。 3. **...

    JM20330.zip

    在Schematic中,JM20330的引脚功能、输入输出信号和电源要求都会详细标注。 3. IDE SATA互转电路图:这是一个特定的应用场景,显示了JM20330如何将IDE接口的信号转换为SATA,反之亦然,确保不同接口的硬盘可以在同一...

    最新版本的jm代码

    【标题】"最新版本的jm代码"所涉及的知识点主要集中在JM编码库和视频处理技术上。JM,全称为Joint Model,通常是指JPEG-Multimedia(联合多媒体)编码器,这是一个用于研究高效视频编码标准的开源项目。这个项目的...

    JM20330_Spec_Rev. 3.0.pdf

    JM20330芯片属于串行ATA桥接芯片,其功能主要是连接Serial ATA (SATA)接口与并行ATA (PATA)接口,使旧的系统能够使用SATA硬盘。以下是JM20330规格书所包含的一些关键技术知识点。 首先,JM20330规格书提供了芯片的...

    USB转SATA芯片采用JM20329

    3. **电源管理**:具备良好的电源管理功能,可以在不使用时降低功耗,延长设备的电池寿命。 4. **数据安全**:支持SATA热插拔,减少数据传输过程中的损坏风险。 5. **低成本**:作为一款经济型解决方案,JM20329降低...

    景嘉微JM7201显卡资料

    景嘉微JM7201显卡资料 景嘉微JM7201显卡是基于GT12 PCIe JM7201 2G D3VGA+HDMI的显卡,主要应用于图形处理和显示输出。以下是景嘉微JM7201显卡的详细技术规格和特性: 一、技术规格 * 产品型号:PCIe-JM 7201 * ...

    JM2.ipa

    JM2.ipa

    使用usb桥接芯片JM20329的串口到USB电路图

    文件名“JM20329”可能包含的是关于JM20329芯片的详细数据手册、应用笔记或示例电路图,这些文档会详细阐述芯片的功能、引脚定义、电气特性、工作条件以及应用电路实例,帮助开发者正确地使用该芯片进行设计。...

    jm20330 datasheet 手册

    **一、JM20330的功能特性** 1. **双向转换**: JM20330能够同时处理从IDE到SATA以及从SATA到IDE的数据转换,确保设备间的双向通信。 2. **兼容性广泛**: 支持多种IDE设备,包括ATA/ATAPI硬盘、CD/DVD光驱等,同时...

    JM软件配置文件的参数说明

    JM软件配置文件的参数说明 H.264官方参考软件JM的配置文件参数说明是学习JM使用的必备手册。JM软件配置文件的参数说明提供了详细的参数解释,帮助用户快速了解和掌握JM软件的配置文件参数。 系统概述 JM软件配置...

    jm11.0kta2.3

    KTA2.3可能提供了更高级的测试功能,比如对新特性的支持,或者是对不同硬件平台的优化。 【标签】"jm11.0kta2.3" 作为标签,明确了这个压缩包的核心内容,方便搜索和分类。这使得对H.264编码感兴趣的开发者或者研究...

    h264 JM 所有代码和工具

    四、解码器功能与应用 JM解码器能够处理由JM编码器生成的比特流,同时也可以解码其他符合H.264标准的编码流。通过解码过程,我们可以分析视频流中的各种语法元素,了解码流结构,这对于理解和优化解码算法非常有...

    JM代码阅读笔记共5篇

    JM代码实现了H.264/AVC的全部功能,包括编码器和解码器,这对于开发者和研究人员来说是一个宝贵的参考资料。通过分析这些代码,可以学习到如何将复杂的视频编码算法转化为可执行的程序。 【压缩包子文件的文件名称...

    jm8.6最终注释版

    其次,jm8.6可能是一个具有特定功能的框架或库。例如,如果jm8.6是一个Web框架,那么它可能涉及到MVC(模型-视图-控制器)设计模式,包含路由处理、模板引擎、数据库交互等功能。注释将帮助我们理解这些组件如何协同...

    JM新版本1.6.3-1.zip

    JM新版本1.6.3-1.zip

    JM20330 datasheet

    - **功能增强**:如增加了晶体振荡器的描述、工业规格的介绍、泄漏电流信息等,这些增强功能使得JM20330能够更好地服务于不同的应用场景。 - **参数调整**:包括绝对最大额定值、存储温度、电阻值等,这些调整都是...

    JM沟通1.2.1安装包配合后续源码使用.ipa

    ·JM沟通单聊:文件、图片视频、表情、文本、阅后即焚功能、聊天记录同步、实时定位分享、加密信息、通话视频等全面性沟通功能,聊天,工作,生活,娱乐,全功能无限制好友数量,换号聊天记录同步带走,不在担心手机...

    JM Reference Software Manual

    该软件的各个版本通常包含新的参数和功能,比如在JM19.0版本中,增加了对快速模式参数(FastMode parameters)和自适应偏移四舍五入(Adaptive Offset Rounding)的支持。这些新增加的参数和功能可以提高编码的效率...

Global site tag (gtag.js) - Google Analytics