開啟 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.pswp.cn/news/455220.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455220.shtml
英文地址,請注明出處:http://en.pswp.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&…

關于在smarty中實現省市區三級聯動

剛開始接觸php&#xff0c;&#xff0c;其實對于一些比較深入的東西還不是很了解&#xff0c;就像是這次的省市區聯動&#xff0c;都是用三張表為基礎編碼的&#xff0c;原諒我的無知&#xff0c;謝謝。 接下來就是編碼部分了&#xff1a; <?php require(./smarty/Smarty.c…

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…

X264學習筆記(1)

X264學習筆記&#xff08;1&#xff09; X264編碼流程 參數的初始化 1.opt&#xff0c;param根據輸入的參數和標準的規定&#xff0c;進行初始化設置。 Opt的說明如下&#xff1a; Opt->hin用于給出讀入的yuv文件的指針地址 Opt->hout給出了輸出的文件的指針地址 Opt->…

python 數字轉化excel行列_Python實現excel的列名稱轉數字、26進制(A-Z)與10進制互相轉換...

Python實現excel的列名稱轉數字、26進制(A-Z)與10進制互相轉換sequence list( map( lambda x: chr( x ), range( ord( A ), ord( Z ) 1 ) ) )##-----字母轉數字(python實現 1-26A-Z, then AA-AZ)def ten2TwentySix(num):L []numnum-1; #實現從1對應Aif num > 25:while Tr…

錯誤提示:'……' is not assignable to Android.app.Activity Manifest XML

1 問題描述&#xff1a; 針對這段代碼&#xff1a; <activity android:name".fragament.fragment_bulter" /> <activity android:name".fragament.fragment_girl" /> <activity android:name".fragament.fragment_user" />…

關于Lambda和匿名內部類

先上代碼&#xff1a; //gcache(f)public <T,R> Function<T,R> cache(Function<T,R> f){final Map<T,R> cachenew HashMap<>();Function<T,R> gt->{if(cache.containsKey(t)){System.out.println("cached t:"t);return cache…

H26L encoder.cfg參數分析

H264 encoder.cfg參數分析 收藏 (1) 文件操作參數:#Files InputFile "silent.yuv" #輸入序列,YUV 4:2:0 StartFrame 0 # 從視頻流的第幾幀開始編碼 FramesToBeEncoded 30 #編碼圖象幀數,指明了除去 B幀后將要被編碼的幀數(應該再實驗一下&#x…

django-ckeditor表情包修改

一、版本 Django1.11django-ckeditor5.2.2 二、關鍵步驟 1.刪除舊的ckeditor靜態文件 所在目錄&#xff1a;項目目錄下的static文件夾下的ckditor文件夾 rm ckeditor -rf 原因&#xff1a;在安裝ckeditor后需要執行collectstatic命令&#xff0c;這個過程中的查找靜態文件會去…

python中最難的是什么_python什么的最難了

學的人很少的,如果你沒有學過編程,建議學c語言.因為python中文資料很少的.你可以先了解一下phthonpython的歷史python的創始人為guido van rossum。1989年圣誕節期間&#xff0c;在阿姆斯特丹&#xff0c;guido為了打發圣誕節的無趣&#xff0c;決心開發一個新的腳本解釋程序&a…

Python3生成腳本實現重置鍵盤鍵位

個人博客點這里 #!/usr/bin/env python # -*- coding:utf-8 -*- # Created by 秋葉夏風# 本模塊的功能:<重置鍵盤鍵位>import sys import ossave_format "bat" # 這個值可以修改&#xff0c;有兩個選項(bat和reg)&#xff0c;可選擇生成bat批處理文件或者re…

《Java核心技術 卷Ⅱ 高級特性(原書第10版)》一2.2.2 如何讀入文本輸入

2.2.2 如何讀入文本輸入 最簡單的處理任意文本的方式就是使用在卷Ⅰ中我們廣泛使用的Scanner類。我們可以從任何輸入流中構建Scanner對象。或者&#xff0c;我們也可以將短小的文本文件像下面這樣讀入到一個字符串中&#xff1a; 在早期的Java版本中&#xff0c;處理文本輸入的…

leetcode add Two Numbers

部分 conditional operators ?:寫的statements 在有的編譯器下能通過&#xff0c;有的可能通不過 base operand of -> has non-pointer type ListNode轉載于:https://www.cnblogs.com/liyongguo/p/7152365.html

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;點擊查…

JM8.5中的7種宏塊模式問題

JM8.5中的7種宏塊模式問題 收藏 Outline: 1、 CFG文件中有關可變尺寸宏塊模式的相關選項2、 7種宏塊模式對應的數值常量3、 7種宏塊模式被分成宏塊和亞宏塊4、 如何對宏塊和亞宏塊的運動估計&#xff0c;采用一個共同的函數來處理5、 遺留問題1、CFG文件中有關可變尺寸宏塊…

python高級編程技巧

個人博客點這里 如何在列表,字典,集合中根據條件篩選數據 方法1:通過迭代來進行判斷篩選 解決方案 函數式編程: 如何統計序列中元素的出現頻度 解決方案:使用collections.Counter對象 將序列傳入Counter的構造器,得到Counter對象是元素頻度的字典 Counter.most_common(n)…

2016年安全身份識別主流趨勢

安全身份識別解決方案商HID Global通過從不同行業市場的重要客戶那里所獲得的深刻洞察&#xff0c;以及公司最新解決方案在前瞻性合作伙伴和全球各地的終端用戶中進行的試點項目與正式部署情況&#xff0c;確定了2016年最值得業界關注的安全趨勢。HID Global 廣闊的行業視角&am…

列出一個目錄中所有文件及大小

package com.test.tree;import java.io.File;/*** 列出一個目錄中所有的文件和他們的大小* author wyl**/ public class FileList {public void list(File f){ //文件根目錄&#xff0c;深度為0list(f,0);}/*** * param f* param depth 為了顯示文件的層級形式*/public void li…

多媒體音頻格式解析WMA WAV OGG AAC APE FLAC

無論是MP3還是MP4&#xff0c;甚至手機和多媒體DC&#xff0c;產品所支持的各種格式往往讓人眼花繚亂。特別是對于剛上手的新手玩家來說&#xff0c;各種格式都有哪些特性&#xff0c;在實際 使用當中有多少格式實用或者必須&#xff0c;其實有很多方面需要我們來系統的了解。這…