开启 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 单元为: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 编辑 ]

 

 

谢谢牛人啊!

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

 

 
举个例子
这个里面怎么那么多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模式的 运动矢量要不要编码的?
编码的运动

 

 
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里面都没有看到,晕了好久!
今天终于明白了

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455220.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kafka入门介绍(转载)

Kafka作为一个分布式的流平台&#xff0c;这到底意味着什么&#xff1f; 我们认为&#xff0c;一个流处理平台具有三个关键能力&#xff1a; 发布和订阅消息&#xff08;流&#xff09;&#xff0c;在这方面&#xff0c;它类似于一个消息队列或企业消息系统。 以容错的方式存储…

Cmd Markdown 编辑阅读器

欢迎使用 Cmd Markdown 编辑阅读器 我们理解您需要更便捷更高效的工具记录思想&#xff0c;整理笔记、知识&#xff0c;并将其中承载的价值传播给他人&#xff0c;Cmd Markdown 是我们给出的答案 —— 我们为记录思想和分享知识提供更专业的工具。 您可以使用 Cmd Markdown&…

Ubuntu GitLab CI Docker ASP.NET Core 2.0 自动化发布和部署(1)

相关博文&#xff1a; Ubuntu 简单安装和配置 GitLabUbuntu 简单安装 DockerUbuntu Docker 简单安装 GitLabUbuntu Docker 安装和配置 GitLab CI 持续集成服务器版本 Ubuntu 16.04 LTS。 经过上面四篇博文中的相关安装和配置&#xff0c;我们主要完成了两个容器的创建和运行&am…

django-ckeditor表情包修改

一、版本 Django1.11django-ckeditor5.2.2 二、关键步骤 1.删除旧的ckeditor静态文件 所在目录&#xff1a;项目目录下的static文件夹下的ckditor文件夹 rm ckeditor -rf 原因&#xff1a;在安装ckeditor后需要执行collectstatic命令&#xff0c;这个过程中的查找静态文件会去…

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一2.2.2 如何读入文本输入

2.2.2 如何读入文本输入 最简单的处理任意文本的方式就是使用在卷Ⅰ中我们广泛使用的Scanner类。我们可以从任何输入流中构建Scanner对象。或者&#xff0c;我们也可以将短小的文本文件像下面这样读入到一个字符串中&#xff1a; 在早期的Java版本中&#xff0c;处理文本输入的…

amap不同样式marker点_想出一手漂亮的图,CAD打印样式表你必须会!

好课推荐&#xff1a;1.CAD2014&#xff1a;点击查看2.室内CAD&#xff1a;点击查看3.CAD2019&#xff1a;点击查看4.CAD2018&#xff1a;点击查看5.【bim】revit&#xff1a;点击查看6.室内手绘&#xff1a;点击查看7.CAD三维&#xff1a;点击查看8.全屋定制&#xff1a;点击查…

研究人员发现Office Word 0Day攻击 这个漏洞绕过了word宏安全设置 绿盟科技、McAfee及FireEye发出警告...

这次的0Day漏洞确实很厉害&#xff0c;以往攻击者诱使用户点击Word文档&#xff0c;由于其中包含了恶意脚本&#xff0c;大多数需要用户启用了宏。但这次的漏洞不是&#xff0c;受害者无需启用宏&#xff0c;也会中招&#xff0c;而且漏洞覆盖Windows所有版本&#xff08;包括W…

数据中心传输需求成以太网市场巨大推动力

近日&#xff0c;市场研究机构Infonetics作出评估称&#xff0c;数据中心以太网市场将迎来全面发展的势头&#xff0c;其驱动力则在于当前数据中心以太网络交换接口由10Gbps产品向25Gbps乃至50Gbps标准的大规模升级。 根据对2014年第三季度的市场销售情况研究&#xff0c;该公司…

主打“云安全” 迅雷系帝恩思登陆新三板

ZD至顶网安全频道 06月14日 综合消息&#xff1a; 6月14日上午&#xff0c;帝恩思(837018)敲响了登陆新三板的钟声。作为帝恩思的重要股东&#xff0c;迅雷&#xff08;NASDAQ:XNET&#xff09;CEO邹胜龙与帝恩斯董事长王宇杰、总经理许渊培等人一同参加了这一仪式。 帝恩斯是一…

UESTC 1636 梦后楼台高锁,酒醒帘幕低垂

题意&#xff1a;求一条路径&#xff0c;使得这条边连接1到n&#xff0c;求边权值的最大值与最小值的差 题解&#xff1a;最小生成树&#xff0c;对边权排序&#xff0c;可以枚举边的最大和最小的值&#xff0c;判断能否使得1和n连通 #include <bits/stdc.h> #define ll …

WORD列表缩进的文本起始点

Figure 1 Figure 2 Figure 3 编号位置以刻度尺为起点0.74厘米&#xff08;2个字符间距&#xff09;&#xff0c;文本缩进以刻度尺为起点2.96厘米&#xff08;8个字符间距&#xff09; 以上两者相减得到的值正好特殊格式悬挂缩进的值2.22厘米 Figure 4 上图看到&#xff0c;文本…

无人车火了 百度是如何做到的?

ZD至顶网服务器频道 03月02日 新闻消息&#xff08;文/于泽&#xff09;&#xff1a;百度无人车可谓狠狠的吸足了大众的眼球。一个问题逐渐出现在我们心中&#xff0c;为什么百度这样的互联网企业会推出无人车&#xff0c;似乎搜索引擎和无人车之间的关联度并不是很高。 谜题的…

Docker Compose 项目

二、Docker Compose 项目compose项目简介compose项目来源于之前的Fig项目&#xff0c;使用python代码编写。compose项目主要用于编排部署基于docker的应用。本身与docker&#xff0f;swarm配合度很高。Docker Compose 是 Docker 编排服务的一部分&#xff0c;可以让用户在其它平…

android 获取sd卡目录失败_树莓派对SD卡的大小,速度有哪些要求?

SD卡容量的大小通过NOOBS安装带有桌面和推荐软件&#xff08;完整&#xff09;的 Raspberry Pi OS&#xff0c;SD卡最小为16GB。 对于带有桌面和推荐软件的 Raspberry Pi OS 镜像安装&#xff0c;SD卡最小为8GB。对于安装 Raspberry Pi OS Lite&#xff0c;建议 SD 卡最小为4GB…

区分同源与非同源

2019独角兽企业重金招聘Python工程师标准>>> JSONP和AJAX相同&#xff0c;都是客户端向服务器端发送请求&#xff1a;1、给服务器端传递内容2、从服务器端获取数据 的方式 AJAX属于同源策略 JSONP属于非同源策略(跨域请求) -> 实现跨域请求的方式有很多种&#x…

Spring MVC-表单(Form)标签-下拉框(Dropdown)示例(转载实践)

以下内容翻译自&#xff1a;https://www.tutorialspoint.com/springmvc/springmvc_dropdown.htm 说明&#xff1a;示例基于Spring MVC 4.1.6。 以下示例显示如何使用Spring Web MVC框架在表单中使用Dropdown。首先&#xff0c;让我们使用Eclipse IDE&#xff0c;并按照以下步骤…

阿里巴巴中文站架构设计实践(何崚)图书

阿里巴巴中文站架构实践 何崚阿里巴巴 全文地址:阿里巴巴中文站架构设计实践(何崚).pdf 更多课件可到:这里查看 后续内容还在更新…

bilibili go框架_最好的开发语言一定是那位吗?Go语言有话说

鲁迅先生说过&#xff0c;所有能用 JS 写的前端项目最终都会被用 JS 重写一遍&#xff0c;所有能用 Go 写的后端项目最终也都会被用 Go 重写一遍。作为一名开发者&#xff0c;周六的我们能做什么呢&#xff1f;是因为产品经理的各种需求在加班吗&#xff1f;给你说了实现不了实…

FLV文件格式解析

FLV&#xff08;Flash Video&#xff09;是现在非常流行的流媒体格式&#xff0c;由于其视频文件体积轻巧、封装播放简单等特点&#xff0c;使其很适合在网络上进行应用&#xff0c;目前主流的视频网站无一例外地使用了FLV格式。另外由于当前浏览器与Flash Player紧密的结合&am…