[JM代码] 开启 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 编辑 ]

2#

发表于 2006-12-15 11:09 AM | 只看该作者

如何阅读 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 单元为:67  58  00  1E.........,其中 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 进制:
58  00  1E

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

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

 
3#

谢谢牛人啊!

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

 
4#
举个例子
这个里面怎么那么多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 Chroma  0: level =  1 run = 0                                (  1)
@108451DC Chroma  1: level =  0 run = 2                           1010 (  0)
@108455DC Chroma  0: level = -1 run = 0                                ( -1)
@108455DC Chroma  1: 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模式的 运动矢量要不要编码的?
编码的运动
 
5#
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 编辑 ]

 
 
6#
非常感谢!!!!!!!!!!!!!!!!!
多谢firsttime的精辟解疑释惑!
受益 匪浅
 
7#
太感谢了阿
 
8#
找出skip块的copy的块 可真麻烦阿
找了好久了
跟踪编码部分
什么都没有找到
对于skip宏块 是不是运动矢量在解码端才会出现(根据相邻块的运动矢量预测出来),然后copy该运动矢量对应的macroblock

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

wisitng(80609949)
 
9#
本帖最后由 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 编辑 ]

 
10#

发表于 2006-12-18 11:48 AM | 只看该作者

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

开启 JM 的 trace 功能相关推荐

  1. Orin 平台 调试 camera打开trace功能

    1 提高时钟频率 sudo su echo 1 > /sys/kernel/debug/bpmp/debug/clk/vi/mrq_rate_locked echo 1 > /sys/ke ...

  2. 开启Windows7的隐藏功能:虚拟WiFi和SoftAP(即虚拟无线AP)

    开启Windows7的隐藏功能:虚拟WiFi和SoftAP(即虚拟无线AP),就可以让电脑编程无线路由器,实现共享上网,节省网费和路由器购买费. 1.  以管理员什么分运行命令提示符: 快捷键win+ ...

  3. 开启文件高级共享功能

    如果要开启文件高级共享功能,可以在"我的电脑"中执行"工具->文件夹选项"命令,接着切换到"查看"选项卡,在高级设置中清除" ...

  4. linux开启内部路由转发功能

    linux开启内部路由转发功能 2015-09-23 18:02:09 标签:linux开启内部路由转么功能 linux内部机器共享上网 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 ...

  5. Window Server 2008中开启Window Media Player功能

    Window Server 2008中开启Window Media Player功能 服务器管理器 功能 优质Windows音频视频体验 打勾 安装 其它功能有: 桌面休验 等.... the end ...

  6. trace java_使用java动态字节码技术简单实现arthas的trace功能。

    参考资料 用过[Arthas]的都知道,Arthas是alibaba开源的一个非常强大的Java诊断工具. 不管是线上还是线下,我们都可以用Arthas分析程序的线程状态.查看jvm的实时运行状态.打 ...

  7. 巧为Win10家庭版开启组策略编辑器功能

    运行以下cmd命令可以开启组策略编辑器功能 cmd文件下载链接 https://download.csdn.net/download/caijunfen/10620175

  8. 个人计算机预防勒索病毒,Windows10如何开启预防勒索病毒功能|电脑安全开启防御勒索软件的方法...

    电脑安装上Windows10系统,内置有"Windows Defender安全中心",可以保护电脑.但是最近一年比特币勒索病毒一直让大家头疼.为此,微软在"Windows ...

  9. RedHat Linux 5企业版开启VNCSERVER远程桌面功能[转]

    RedHat Linux 5企业版开启VNCSERVER远程桌面功能 环境:RedHat Linux 5企业版. Xwindows:gnome (红帽默认安装的图形界面) 尽管我们可以使用SSH连接远 ...

最新文章

  1. Qt分析:Qt中的两种定时器
  2. C#Redis集合set
  3. oracle专用服务器模式与共享服务器模式
  4. TF之AE:AE实现TF自带数据集AE的encoder之后decoder之前的非监督学习分类
  5. c语言24点游戏流程图,C语言解24点游戏程序
  6. hdu 5277(最大团问题)
  7. QueryRunner使用
  8. php dio获取串口数据,flutter通过dio读取二进制数据,比如通过api接口读取图片
  9. oracle 由非归档到归档模式
  10. 编译WINDOWS版SDL2:You should run hg revert SDL_config.h
  11. eclipse配色方案推荐_收藏!58个设计师最佳配色工具网站
  12. U盘安装WIN10移动系统
  13. 计算机控制技术期中测试素材2020版
  14. MSP、CSP、BSP区别
  15. 网站地图制作百度地图google地图制作方法
  16. 【jQWidgets】API 笔记
  17. 不管几岁,少女心万岁~女神节快乐!
  18. p二、使用 docker-compose 安装 Prometheus+Alertmanager+Grafana
  19. 一些实用的产品经理工具网站,助力提升你的专业技能!
  20. 烽火通信(天涯,有点早了)

热门文章

  1. TFS多地办公时的处理
  2. 第十节:利用async和await简化异步编程模式的几种写法
  3. c#进阶(5)—— WCF 实现简单预订功能
  4. asp.net mvc webform和razor的page基类区别
  5. 【转】3.4SharePoint服务器端对象模型 之 访问文件和文件夹(Part 4)
  6. 一步步编写操作系统 23 重写主引导记录mbr
  7. professional中文_Microsoft office 2007 简体中文版
  8. 【情人节表白代码】——情人节将至,10余款浪漫爱心特效送给你爱的那个她
  9. 小学计算机制作表格教案,小学信息技术《表格的制作》教案
  10. mysql emma_ubuntu mysql emma中文乱码问题解决