日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MV预测过程详解

發(fā)布時間:2023/12/18 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MV预测过程详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

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



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



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

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




===========第三步:預(yù)測 MV ===========

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


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

?

?

我有一點(diǎn)想問,為什么SetMotionVectorPredictor 函數(shù)只在
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])))
這個條件下進(jìn)行,其他條件下為什么不用呢?

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

?

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

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

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

?

?

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

1、為什么SetMotionVectorPredictor 函數(shù)只在
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])))
這個條件下進(jìn)行,其他條件下為什么不用呢?
——你看錯了哈。JM86 代碼中一共有 7 處調(diào)用該函數(shù)。

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

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

?

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

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


總結(jié)

以上是生活随笔為你收集整理的MV预测过程详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。