MV預測過程詳解

===========第一步:確定相鄰塊===========

? ?? ?MV 預測以宏塊分割(或亞宏塊分割,如果宏塊存在亞分割)為單位,同一個宏塊分割(或亞宏塊分割)內所有 4*4 塊 MV 預測值相同。以每個宏塊分割(或亞宏塊分割)的左上角像素 pixel1 和右上角像素 pixel2 為參考點來確定相鄰塊則:
? ?? ?pixel1 左側相鄰像素所在 4*4 塊為當前宏塊分割(或亞宏塊分割)的相鄰塊 A
? ?? ?pixel1 上方相鄰像素所在 4*4 塊為當前宏塊分割(或亞宏塊分割)的相鄰塊 B
? ?? ?pixel2 右上對角線像素所在 4*4 塊為當前宏塊分割(或亞宏塊分割)的相鄰塊 C
? ?? ?pixel1 左上對角線像素所在 4*4 塊為當前宏塊分割(或亞宏塊分割)的相鄰塊 D


MV預測示意圖.JPG
??????以最復雜的 8*8 宏塊分割類型為例(此時只存在亞宏塊分割),分析如下:
? ?? ?假設圖中黑色框表示宏塊、每個綠色框表示一個 4*4 塊、每個紅色框表示一個 8*8 塊。當前宏塊的宏塊分割模式為 8*8(如圖中紅色線),其亞宏塊分割模式分別為:第一個 8*8 塊為 8*8,第二個 8*8 塊為 4*4(如圖中藍色線),第三個 8*8 塊為 4*8(如圖中藍色線),第四個 8*8 塊為 8*4(如圖中藍色線)。則按照上述方法來確定相鄰塊的方法如下:
? ?? ?第一個預測對象為第一個 8*8 塊,以其左上角像素 pixel1 和右上角像素 pixel2 為參考點,則:A 為 7 號 4*4 塊,B 為 2 號 4*4 塊,C 為 4 號 4*4 塊,D 為 1 號 4*4 塊。9、14、15 與 8 具有相同 MV 預測值
? ?? ?第二個預測對象為第二個 8*8 塊的第一個 4*4 塊,即 10 號塊,以其左上角像素 pixel1 和右上角像素 pixel2 為參考點,則:A 為 9 號4*4塊,B 為 4 號4*4塊,C 為 5 號 4*4 塊, D 為 3 號 4*4 塊
? ?? ?第三個預測對象為第二個 8*8 塊的第二個 4*4 塊,即 11 號塊,以其左上角像素 pixel1 和右上角像素 pixel2 為參考點,則:A 為 10 號4*4塊,B 為 5 號4*4塊,C 為 6 號 4*4 塊,D 為 4 號 4*4 塊
? ?? ?第四個預測對象為第二個 8*8 塊的第三個 4*4 塊,即 16 號塊,以其左上角像素 pixel1 和右上角像素 pixel2 為參考點,則:A 為 15 號4*4塊,B 為 10 號4*4塊,C 為 11 號 4*4 塊,D 為 9 號 4*4 塊
? ?? ?第五個預測對象為第二個 8*8 塊的第四個 4*4 塊,即 17 號塊,以其左上角像素 pixel1 和右上角像素 pixel2 為參考點,則:A 為 16 號4*4塊,B 為 11 號4*4塊,C 為 12 號 4*4 塊,D 為 10 號 4*4 塊
? ?? ?第六個預測對象為第三個 8*8 塊的第一個 4*8 塊,以其左上角像素 pixel1 和右上角像素 pixel2 為參考點,則:A 為 19 號 4*4 塊,B 為 14 號 4*4 塊,C 為 15 號 4*4 塊,D 為 13 號 4*4 塊。26 與 20 具有相同 MV 預測值
? ?? ?第七個預測對象為第三個 8*8 塊的第二個 4*8 塊,以其左上角像素 pixel1 和右上角像素 pixel2 為參考點,則:A 為 20 號 4*4 塊,B 為 15 號 4*4 塊,C 為 16 號 4*4 塊,D 為 14 號 4*4 塊。27 與 21 具有相同 MV 預測值
? ?? ?第八個預測對象為第四個 8*8 塊的第一個 8*4 塊,以其左上角像素 pixel1 和右上角像素 pixel2 為參考點,則:A 為 21 號 4*4 塊,B 為 16 號 4*4 塊,C 為 18 號 4*4 塊,D 為 15 號 4*4 塊。23 與 22 具有相同 MV 預測值
? ???第九個預測對象為第四個 8*8 塊的第二個 8*4 塊,以其左上角像素 pixel1 和右上角像素 pixel2 為參考點,則:A 為 27 號 4*4 塊,B 為 22 號 4*4 塊,C 為 24 號 4*4 塊,D 為 21 號 4*4 塊。29 與 28 具有相同 MV 預測值



===========第二步:確定 A、B、C 的可用性===========

根據 A、B、C 所在宏塊是否存在或者是否允許參與預測來判斷。如果 C 不可用,采用 D 代替 C




===========第三步:預測 MV ===========

1、如果 A、B、C 三個參考塊中只有一個與當前預測對象為同一參考幀,則選取該參考塊的 MV 作為最終 MV 預測值
2、當前宏塊是否為 8*16 或者 16*8 分割:
(1)、如果當前宏塊為 8*16 分割類型:
? ?? ?? ? 對于左邊 8*16 分割,如果 A 與當前分割為同一參考幀,則采用 A 的 MV 為該分割的最終 MV 預測值
? ?? ?? ? 對于右邊 8*16 分割,如果 C 與當前分割為同一參考幀,則采用 C 的 MV 為該分割的最終 MV 預測值
(2)、如果當前宏塊為 16*8 分割類型:
? ?? ?? ? 對于上邊 16*8 分割,如果 B 與當前分割為同一參考幀,則采用 B 的 MV 為該分割的最終 MV 預測值
? ?? ?? ? 對于下邊 16*8 分割,如果 A 與當前分割為同一參考幀,則采用 A 的 MV 為該分割的最終 MV 預測值
3、其余情況并且 B、C 中有一個可用或者兩者都可用,則采用中值預測(取 A、B、C 三者中MV的中值為最終 MV 預測值)
4、其余情況并且 B、C 皆不可用,則采用 A 的 MV 為最終 MV 預測值


【注】:1、宏塊分割時的相鄰塊確定方法與第一步所述過程雷同:16*16 相當于 8*8,8*16、16*8 分別相當于 4*8、8*4
? ?? ?? ?? ?2、對于不可用的相鄰塊,其 MV 仍然可能參與 MV 預測,但其值為 0。例如:A 不可用,B、C 可用,則最終可能仍然是在 A、B、C 中取中值,但此時 A 的 MV 為 0;
? ?? ?? ?? ?3、對于不可用的相鄰塊,其參考幀索引被設置為 -1,即必然與當前預測對象非同一參考幀;
? ?? ?? ?? ?4、可以驗證:同時滿足第三步的第一、第二兩種情況時,按第一種情況計算 MV 預測值與按第二種情況計算 MV 預測值等效;
? ?? ?? ?? ?5、該預測過程即為標準 8.4.1.3 小節的內容,在 JM86 中對應的代碼為 SetMotionVectorPredictor 函數;
? ?? ?? ?? ?6、MBAFF 情況下的相鄰塊均指對應位置(co-locate)塊。

?

?

我有一點想問,為什么SetMotionVectorPredictor 函數只在
img->type==B_SLICE && img->direct_type && (IS_DIRECT (currMB) ||
? ? (IS_P8x8(currMB) && !(currMB->b8mode[0] && currMB->b8mode[1] && currMB->b8mode[2] && currMB->b8mode[3])))
這個條件下進行,其他條件下為什么不用呢?

另外,我最近在看decode_one_macroblock這個函數,感覺跟標準上定義的有出入,比如上面這個問題,還有一些參數看不明白,字面上的意思與實際用途不符合,好郁悶。

?

還是上面的問題,在條件里面IS_P8x8(currMB)在這里做何意?定義IS_P8x8(MB)=((MB)->mb_type==P8x8) P8x8=8。這里我就是想不通,標準里面mb_type=8(B Slice情況下)表示B_L0_L1_16x8。而P條帶里面P8x8的mb_type值為3,任何一個都不為8,真的是不明白啊。

還有后面的currMB->b8mode又是指什么呢,按照條件,任何一個currMB->b8mode[x]=0條件就滿足,這又是什么意思呢?

我在decode_one_macroblock這個函數里琢磨了好幾天了,一直為一些細節煩惱,又找不到人討論,快崩潰啦,幫幫我~~

?

?

本帖最后由 firstime 于 2009-3-23 09:49 PM 編輯

1、為什么SetMotionVectorPredictor 函數只在
img->type==B_SLICE && img->direct_type && (IS_DIRECT (currMB) ||
? ? (IS_P8x8(currMB) && !(currMB->b8mode[0] && currMB->b8mode[1] && currMB->b8mode[2] && currMB->b8mode[3])))
這個條件下進行,其他條件下為什么不用呢?
——你看錯了哈。JM86 代碼中一共有 7 處調用該函數。

2、IS_P8x8(currMB)在這里做何意?
——說明你沒有看我的這篇帖子“JM 代碼中宏塊類型宏定義的說明

3、currMB->b8mode又是指什么
——說明你不但沒看城里漢子的那篇帖子“對幾個重要問題的詳細闡述”,也沒有查看以前的聊天記錄,更沒有看我加了注釋的代碼。

?

根據B,C的位置決定方法,本來的情況是B不可用的時候C也肯定不可用,但是由于有第二步中的D代替C這一條,B和C的可用不可用配對方式就似乎變得復雜了,但仔細按照MB可能的位置一一分析其實并不復雜,因為可以通過第三步前三種情況到達第4種情況(默認partitionType不是16X8和8X16)的,只能是當前MB是frame內第一行MB的情況。(在最后一列位置(除去同屬于第一行的右上角位置)的時候,雖然C不可用,但是第2步中D代替了C,所以變成B和C同時可用,這樣就滿足第三步中第三個條件了)
? ?? ?再來看第一行,對于所有位于第一行的MB,BC都是不存在的。 而除了位于最左上角的情況A都是存在,只有A存在的時候用A是理所當然。 而最左上角A也不存在,即可以理解為A,B,C都為(0,0),這樣,A = (0,0) = Median((0,0),(0,0),(0,0)) = Median(A,B,C), 兩者等效。
? ?? ?呵呵,不知道這么想正確不,還請指正。

? ?? ?還有,非常感謝這段分析,受益匪淺~


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455262.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455262.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455262.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Django models中關于blank與null的補充說明

建立一個簡易Model class Person(models.Model):GENDER_CHOICES((1,Male),(2,Female),)namemodels.CharField(max_length30,uniqueTrue,verbose_name姓 名) birthdaymodels.DateField(blankTrue,nullTrue)gendermodels.IntegerField(choicesGENDER_CHOICES)accountmodels.In…

python 人臉關鍵點檢測_opencv+python+dlib人臉關鍵點檢測、實時檢測

安裝的是anaconde3、python3.7.3,3.7環境安裝dlib太麻煩,在anaconde3中新建環境python3.6.8,在3.6環境下安裝dlib-19.6.1-cp36-cp36m-win_amd64.whl,下載地址:https://pypi.org/project/dlib/19.6.1/#filesvscode更改配…

Zabbix2.2.6郵件報警設置方法

http://www.jb51.net/article/56973.htm 這篇文章主要介紹了Zabbix郵件報警設置方法,在Zabbix服務端設置郵件報警,當被監控主機宕機或者達到觸發器預設值時,會自動發送報警郵件到指定郵箱說明:Zabbix監控服務端、客戶端都已經部署完…

Skip宏塊與Direct預測模式淺析

對于我來說,這個是一個老問題了。以前藍風車專門給我講解,我都沒搞懂(真有點對不起藍風車的細心教誨哈。呵呵~~~)。今天終于弄清楚了,特此總結出來,請大家指正。 B_Skip類型宏…

自律

生活上的自律 寫出自律的代碼 身體上的自律 日常生活中,存在這么兩條路。一條路誘惑我們只根據自己的沖動和直覺來生活。這條路可以稱為「寵物之路」,因為所有的動物,包括家里養的寵物狗走的都是這條路。餓了就吃,吃完就算。…

解決兼容性的庫

HTML5標簽兼容方案&#xff1a;html5shiv.js [GitHub地址&#xff1a;https://github.com/aFarkas/html5shiv/] IE8不支持HTML5的新標簽&#xff0c;如<header>、<nav>等標簽在IE8無法渲染。html5shiv.js可幫助IE6-8瀏覽器兼容HTML5語義化標簽。 使用方法&#xff…

H.264 中的相關問題

幀內解碼時&#xff0c;在解碼端&#xff0c;首先通過當前宏塊左邊、上邊已經解碼完成的宏塊使用當前宏塊的預測模式&#xff08;預測模式計算過程請參見我的論文《H.264數字視頻差錯控制技術的研究》&#xff0c;在群FTP“本群原創資料”目錄中&#xff09;得到當前宏塊的像素…

wenzhixin bootstrap-table 點擊table單元格改變顏色

bootstrap-table用于展示數據非常方便&#xff0c;也需要滿足一些個性化需求。比如點擊窗格&#xff08;td&#xff09;標記下顏色&#xff0c;用于目測 代碼如下&#xff0c;轉載請注明 $("table").on(click-row.bs.table, function (e, row, $el) {//el[0] is tr …

tornado學習筆記day01-高并發性能web框架

tornado的安裝 這里我使用的是虛擬環境中的pip安裝,配合清華大學鏡像源安裝的 pip install tornado -i https://pypi.tuna.tsinghua.edu.cn/simple我的第一個tornado程序 import tornado.web import tornado.ioloopclass IndexHandler(tornado.web.RequestHandler):主頁處理…

python99乘法表while翻譯_Python學習之while練習--九九乘法表

效果如下&#xff1a;實現代碼;m 1n 1while(m<10):while(n<m):print(n,"*",m,"",m*n,end \t)n 1print(\n)n 1m 1解析&#xff1a;這是一個很簡單的while嵌套程序&#xff0c;首先分析九九乘法表是從上往下逐行增加&#xff0c;且第一列乘積為1…

ASP.NET Core 2加入了Razor頁面特性

最近發布的ASP.NET Core 2.0&#xff0c;連同新發布的.NET Core 2和Entity Framework Core 2.0y&#xff0c;一并構成了.NET Core 2.0生態中的三元組。此發布給出了多個新特性和改進&#xff0c;其中包括通用性能的改進、Razor頁面、新的開發模板以及更好的Azure Diagnostics支…

matlab 矩陣拼接

E[a&#xff0c;b]%水平方向上的拼接 E[a &#xff1b;b] %垂直方向上的拼接 轉載于:https://www.cnblogs.com/hsy1941/p/7124083.html

JM8.5中的7種宏塊模式問題 - zhoujunming的專欄 - CSDN博客

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

tornado學習筆記day02-進階與提升

整理基礎工程 請看第一天的配置文件目錄,搭建了一個框架的基礎目錄 Application settings debug 作用 可以設置tornado是否工作在調試模式下面,默認為false,即工作在生產模式下 true的特性: 自動重啟: tornado程序會監控源代碼文件,會自動重啟服務器,減少我們手動重啟…

python123測驗2答案八邊形_Python試卷

3、寫一個函數&#xff0c;計算一個給定的日期是該年的第幾天。def getday(self,yNone,mNone,dNone):date datetime(y,m,d)days date.strftime(%j)return days4、寫一個函數&#xff0c;給定N&#xff0c;返回斐波那契數列第N項。def getn_vlaue(self,n):if n<2:return 1e…

java實體類如果不重寫toString方法,會如何?

先認識一下Object Object 類的 toString 方法 返回一個字符串&#xff0c;該字符串由類名&#xff08;對象是該類的一個實例&#xff09;、at 標記符“”和此對象哈希碼的無符號十六進制表示組成。換句話說&#xff0c;該方法返回一個字符串&#xff0c;它的值等于&#xff1a;…

H.264 中很有用的一些概念

Q:PSNR 峰值信噪比 是根據它來取qp是不是&#xff1f; A:不是 和QP沒有直接關系但是QP的選擇會影響到PSNR Q: 如果不用率失真最優化&#xff0c;為什么選擇SATD&#xff0b;deltar&#xff08;mv&#xff0c;mode&#xff09;作為模式選擇的依據&#xff1f;為什么運動估…

tornado學習筆記day03-響應輸出

write: 作用: 將chunk中的數據寫到輸出緩沖區 利用write方法寫json數據 我們自己手動序列化json的那種方式Content-Type 的屬性值為text-html而我們采用write自動序列化方式,我們的content-type 屬性為application/json set_default_headers(): 作用: 在進入HTTP響應方法…

Machine Learning——octave矩陣操作(2)——DAY3

矩陣的數學操作&#xff1a; Assumed: a為一個矩陣&#xff0c;m是一個向量 Log(a)——求每一個元素的對數 Exp(a)——以e為底的指數 1./a——求每個元素的導師 [a,b]max(m)——m是一個向量&#xff0c;a為m當中最大的元素&#xff0c;b為a在m中的排列序號&#xff08;已按從小…

python 多進程并發_python并發編程之多進程

一 multiprocessing模塊介紹python中的多線程無法利用多核優勢&#xff0c;如果想要充分地使用多核CPU的資源(os.cpu_count()查看)&#xff0c;在python中大部分情況需要使用多進程。Python提供了multiprocessing。multiprocessing模塊用來開啟子進程&#xff0c;并在子進程中執…