關於encode_one_macroblock()中的一個for循環

標題: 關於encode_one_macroblock()中的一個for循環
achen
新手上路
Rank: 1



UID 3674
精華 0
積分 0
帖子 18
閱讀權限 10
註冊 2007-1-3
來自 成都
狀態 離線
發表於 2007-4-11 09:49 PM  資料 短消息 
關於encode_one_macroblock()中的一個for循環

for (currMB->c_ipred_mode=DC_PRED_8; currMB->c_ipred_mode<=PLANE_8;
currMB->c_ipred_mode++)


這個好像不是幀內色度的預測模式的遍歷,而是包括了色度和亮度的所有情況。
不知理解是否正確。




好好學習
報效國家
頂部
achiever
新手上路
Rank: 1



UID 7611
精華 0
積分 0
帖子 6
閱讀權限 10
註冊 2007-3-26
狀態 離線
發表於 2007-4-12 09:14 AM  資料 短消息 
注意 compute_mode_RD_cost裏面的
  if ((input->FastCrIntraDecision )
    || (currMB->c_ipred_mode == DC_PRED_8 || (IS_INTRA(currMB) )))
頂部
achen
新手上路
Rank: 1



UID 3674
精華 0
積分 0
帖子 18
閱讀權限 10
註冊 2007-1-3
來自 成都
狀態 離線
發表於 2007-4-12 03:04 PM  資料 短消息 
樓上的,此話怎講啊?

能否詳細一點啊,謝謝!




好好學習
報效國家
頂部
figolau
新手上路
Rank: 1



UID 2048
精華 0
積分 0
帖子 17
閱讀權限 10
註冊 2006-10-12
狀態 離線
發表於 2007-4-12 08:19 PM  資料 短消息 
2樓的兄弟已經說了大概了,我補充一下吧.
JM10.2中應該是這麼安排的

幀內預測模式下先搜索色度預測模式,然後在色度幀內模式的基礎上再進行亮度幀內預測模式的搜索
因爲inter切片也會有intra宏塊,所以也會進行幀內宏塊的搜尋,所以仍然保持這個循環模式,但是幀內色度
預測在幀間編碼宏塊中並不需要,所需在compute_mode_RD_cost會只在
     if (currMB->c_ipred_mode == DC_PRED_8 || (IS_INTRA(currMB) )) 條件下才會繼續下去計算RD值;
頂部
achen
新手上路
Rank: 1



UID 3674
精華 0
積分 0
帖子 18
閱讀權限 10
註冊 2007-1-3
來自 成都
狀態 離線
發表於 2007-4-13 08:57 AM  資料 短消息 
還有三個問題

1、  在if (currMB->c_ipred_mode == DC_PRED_8 || (IS_INTRA(currMB) )) 中,爲什麼色度預測單單要對(currMB->c_ipred_mode == DC_PRED_8)的情況做RD,而對其他的三種預測模式Vert、Hor和Plane都不錯RD;
2、 for (currMB->c_ipred_mode=DC_PRED_8; currMB->c_ipred_mode<=PLANE_8; currMB->c_ipred_mode++)中,色度是四種預測模式,幀內亮度預測嵌套其中,那麼每一種幀內亮度預測都要計算4次RD,不是重複了麼? 或者說幀內色度預測模式對幀內亮度預測還有影響麼?那又是什麼影響呢?
3、 if (currMB->c_ipred_mode == DC_PRED_8 || (IS_INTRA(currMB))之後的RDCost計算後,有一個判斷:if(mode==P8*8){。。。。。},這個判斷是幹什麼用的?它肯定不屬於 (IS_INTRA(currMB)之列,那麼是對應於(currMB->c_ipred_mode == DC_PRED_8)的麼?好像也不是。
懇請指教!

[ 本帖最後由 achen 於 2007-4-13 09:49 AM 編輯 ]




好好學習
報效國家
頂部
achen
新手上路
Rank: 1



UID 3674
精華 0
積分 0
帖子 18
閱讀權限 10
註冊 2007-1-3
來自 成都
狀態 離線
發表於 2007-4-13 05:00 PM  資料 短消息 
頂一下吧,期待解答!

頂一下吧,期待解答!




好好學習
報效國家
頂部
figolau
新手上路
Rank: 1



UID 2048
精華 0
積分 0
帖子 17
閱讀權限 10
註冊 2006-10-12
狀態 離線
發表於 2007-4-13 05:24 PM  資料 短消息 
1.Intra宏塊編碼時亮度預測模式和色度預測模式是沒有關係的,所以Intra編碼要對各種色度預測模式做RD成本估計

2. inter宏塊的色度的運動是由量度的運動矢量來決定的

3.因爲inter切片也可以包含intra宏塊,所以纔會保留
for (currMB->c_ipred_mode=DC_PRED_8; currMB->c_ipred_mode<=max_chroma_pred_mode; currMB->c_ipred_mode++)這個循環結構;
但是通過
if (img->yuv_format != YUV400 && max_index != 5)
        {
        }
  else
          max_chroma_pred_mode = DC_PRED_8;
來限定是否需要進行幀內色度預測的循環;

我是看的是JM10.2,不知道前面的是否也是這麼寫的
頂部
firstime (天之驕子)
超級版主
Rank: 8Rank: 8


UID 1900
精華 19
積分 390
帖子 798
閱讀權限 150
註冊 2006-9-26
狀態 離線
發表於 2007-4-18 08:36 PM  資料 文集 短消息  QQ
這裏的確存在重複計算的問題。而且重複很嚴重。




歡迎加入我們的QQ羣:12923082。新加入者請先仔細閱讀論壇中的《羣成員須知》!
頂部
firstime (天之驕子)
超級版主
Rank: 8Rank: 8


UID 1900
精華 19
積分 390
帖子 798
閱讀權限 150
註冊 2006-9-26
狀態 離線
發表於 2007-11-21 05:30 PM  資料 文集 短消息  QQ


QUOTE:
原帖由 achen 於 2007-4-13 08:57 發表
1、  在if (currMB->c_ipred_mode == DC_PRED_8 || (IS_INTRA(currMB) )) 中,爲什麼色度預測單單要對(currMB->c_ipred_mode == DC_PRED_8)的情況做RD,而對其他的三種預測模式Vert、Hor和Plane都不錯RD; ...

1、當是 intra 編碼方式時,四種色度預測模式都要做 RDO。而當是 inter 編碼方式時,SSD 的計算與幀內預測模式無關,只需要讓程序進一次下面的 RDCost_for_macroblocks 函數就可以了。因爲這裏是把亮度放到色度的循環裏,所以通過 currMB->c_ipred_mode == DC_PRED_8  的這個條件來控制只進一次 RDCost_for_macroblocks 函數;

2、當是 intra 編碼方式時,由不同的亮度和色度模式所計算得到的 SSD 來作爲 RDO 的失真度。每一種不同的亮度和色度的組合就會得到不同的失真度。因此這裏要分別取四種色度幀內預測模式去與不同的亮度幀內預測模式組合,來計算不同組合下的 RDO,以得到各種組合中最佳的組合。這其實是一個數學上的排列組合問題;

3、我看的版本跟你不一樣,所以沒有你說的那個條件判斷。
發佈了10 篇原創文章 · 獲贊 5 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章