幀內預測模式提取

if (input->rdopt)
??? {
????? int mb_available_up;
????? int mb_available_left;
????? int mb_available_up_left;
?????
????? min_rdcost = max_rdcost;
?????
????? // precompute all new chroma intra prediction modes
?? //++ 對色度進行幀內預測
????? IntraChromaPrediction8x8(&mb_available_up, &mb_available_left, &mb_available_up_left);
?????
?? //++ 分別在四種色度模式下進行 RDO 計算,如果是 inter 模式,因為色度預測模式與 SSD 計算
?? //++ 無關,因此只需要計算一次(利用 currMB->c_ipred_mode == DC_PRED_8 條件限制來實現)
????? for (currMB->c_ipred_mode=DC_PRED_8; currMB->c_ipred_mode<=PLANE_8; currMB->c_ipred_mode++)
????? {
???????
??????? // bypass if c_ipred_mode is not allowed
??????? if ((currMB->c_ipred_mode==VERT_PRED_8 && !mb_available_up) ||
????????? (currMB->c_ipred_mode==HOR_PRED_8 && !mb_available_left) ||
????????? (currMB->c_ipred_mode==PLANE_8 && (!mb_available_left || !mb_available_up || !mb_available_up_left)))
????????? continue;
???????
???????
??????? //===== GET BEST MACROBLOCK MODE =====
??????? for (ctr16x16=0, index=0; index<7; index++)
??????? {
????????? mode = mb_mode_table[index];
?????????
????????? //--- for INTER16x16 check all prediction directions ---
????????? if (mode==1 && img->type==B_SLICE)
????????? {
??????????? best8x8pdir[1][0] = best8x8pdir[1][1] = best8x8pdir[1][2] = best8x8pdir[1][3] = ctr16x16;
??????????? if (ctr16x16 < 2) index--;
??????????? ctr16x16++;
????????? }
?????????
????????? img->NoResidueDirect = 0;
?????????
????????? if (valid[mode])
????????? {
??????????? // bypass if c_ipred_mode not used
??? //++ 設置當前宏塊類型以及其中每個8*8塊的分割方式和預測方向,每個4*4塊的參考幀索引
??? //++ 該函數在下面的 RDCost_for_macroblocks 函數內再次調用,進行了重復操作
??????????? SetModesAndRefframeForBlocks (mode);
??????????? if (currMB->c_ipred_mode == DC_PRED_8 || //++ 利用這個條件限制來實現 inter 模式時只計算一次 RDO
????????????? (IS_INTRA(currMB) ))
??????????? {
????????????? if (RDCost_for_macroblocks (lambda_mode, mode, &min_rdcost)) //++ 幀內模式時亮度存在重復計算情況:因為色度預測模式與亮度預測模式無關,所以在該色度模
????????????? {???????????????? //++ 式循環中每次計算得到的 intra16*16 和 intra4*4 宏塊類型的最佳亮度模式都是完全相同的
??????????????? //Rate control
??????????????? if(mode == P8x8)
??????????????? {
????????????????? for (i=0; i<16; i++)
??????????????????? for(j=0; j<16; j++)
????????????????????? diffy[j][i] = imgY_org[img->opix_y+j][img->opix_x+i] - mpr8x8[j][i];
??????????????? }else
??????????????? {
????????????????? for (i=0; i<16; i++)
??????????????????? for(j=0; j<16; j++)
????????????????????? diffy[j][i] = imgY_org[img->opix_y+j][img->opix_x+i] - pred[j][i];
??????????????? }
???????????????
??????????????? store_macroblock_parameters (mode);
????????????? }
??????????? }
????????? }
????????? if (valid[0] && bframe && mode == 0 && currMB->cbp && (currMB->cbp&15) != 15) //g050
????????? {
??????????? img->NoResidueDirect = 1;
??????????? if (RDCost_for_macroblocks (lambda_mode, mode, &min_rdcost))
??????????? {
????????????? //Rate control
????????????? for (i=0; i<16; i++)
??????????????? for(j=0; j<16; j++)
????????????????? diffy[j][i] = imgY_org[img->opix_y+j][img->opix_x+i] - pred[j][i];
??????????????? store_macroblock_parameters (mode);
??????????? }
????????? }
??????? }
????? }
??? }
??? else
??? {
????? if (valid[0] && bframe) // check DIRECT MODE
????? {
??????? cost = (have_direct?cost_direct:Get_Direct_CostMB (lambda_mode));
??????? cost -= (int)floor(16*lambda_motion+0.4999);
??????? if (cost <= min_cost)
??????? {
????????? //Rate control
????????? for (i=0; i<16; i++)
??????????? for(j=0; j<16; j++)
????????????? diffy[j][i] = imgY_org[img->pix_y+j][img->pix_x+i]-img->mpr[i][j];
???????????
??????????? min_cost = cost;
??????????? best_mode = 0;
??????? }
????? }
????? if (valid[I4MB]) // check INTRA4x4
????? {
??????? currMB->cbp = Mode_Decision_for_Intra4x4Macroblock (lambda_mode, &cost); //++ 計算當前宏塊采用intra4*4編碼時的代價和CBP
??????? if (cost <= min_cost)
??????? {
????????? //Rate control
????????? for (i=0; i<16; i++)
??????????? for(j=0; j<16; j++)
????????????? diffy[j][i] = imgY_org[img->pix_y+j][img->pix_x+i]-img->mpr[i][j]; //++ 保存采用intra4*4編碼時最佳模式的殘差塊
???????????
??????????? min_cost = cost;
??????????? best_mode = I4MB;
??????? }
????? }
????? if (valid[I16MB]) // check INTRA16x16
????? {
??????? intrapred_luma_16x16 (); //++ 分別計算當前宏塊在4種intra16*16幀內預測模式下的預測塊
??????? cost = find_sad_16x16 (&i16mode); //++ 計算intra16*16類型的代價(以SATD作為判斷標準,因為該段代碼是不采用RDO的處理過程)
??????? if (cost < min_cost) //++ 如果采用intra16*16類型編碼的代價小于采用intra4*4類型編碼的代價,則對當前宏塊采用intra16*16類型編碼
??????? {
????????? //Rate control
????????? for (i=0; i<16; i++)
??????????? for(j=0; j<16; j++)
????????????? diffy[j][i] = imgY_org[img->pix_y+j][img->pix_x+i]-img->mprr_2[i16mode][j][i];
???????????
??????????? best_mode?? = I16MB;
??????????? currMB->cbp = dct_luma_16x16 (i16mode); //++ 對當前宏塊采用intra16*16類型進行編碼,并計算CBP
??????? }
????? }
??? }
???
??? if (rerun==0)
??? {
????? intra1 = (currMB->mb_type==I16MB || currMB->mb_type==I4MB ? 1 : 0);
??? }
} // for (rerun=0; rerun<runs; rerun++)

if (input->rdopt)
{
???
??? if ((cbp!=0 || best_mode==I16MB ))
????? currMB->prev_cbp = 1;
??? else if (cbp==0 && !input->RCEnable)
??? {
????? currMB->delta_qp = 0;
????? currMB->qp = currMB->prev_qp;
????? img->qp = currMB->qp;
????? currMB->prev_cbp = 0;
??? }

??? set_stored_macroblock_parameters ();
}
else
{
??? //===== set parameters for chosen mode =====
??? SetModesAndRefframeForBlocks (best_mode); //++ 設置當前宏塊的參數,包括:宏塊類型(mb_type)、4個8*8塊的分割模式和預測方向(b8mode,b8pdir)、16個4*4塊的參考幀索引(ref_idx,ref_pic_id)
??? if (best_mode==P8x8)
??? {
????? SetCoeffAndReconstruction8x8 (currMB);
??? }
??? else
??? {
????? if (best_mode!=I4MB)
????? {
??????? for (k=0, j=img->block_y; j<img->block_y+4; j++)
????????? for (???? i=img->block_x; i<img->block_x+4; i++, k++)
????????? {
??????????? ipredmodes??? [i][j] = DC_PRED;
??????????? currMB->intra_pred_modes[k] = DC_PRED;
????????? }
????????? if (best_mode!=I16MB)
????????? {
??????????? LumaResidualCoding ();
??????????? //Rate control
??????????? for (i=0; i<16; i++)
????????????? for(j=0; j<16; j++)
??????????????? diffy[j][i] = imgY_org[img->pix_y+j][img->pix_x+i]-img->mpr[i][j];
????????? }
????? }
??? }
??? // precompute all chroma intra prediction modes
??? IntraChromaPrediction8x8(NULL, NULL, NULL); //++ 對色度塊進行處理,包括:分別計算4種色度幀內預測模式下的預測塊、代價(該分支未采用RDO,因此以SATD作為判斷標準)、最佳預測模式
??? img->i16offset = 0;
??? dummy = 0;
??? ChromaResidualCoding (&dummy);
??? if (best_mode==I16MB)
??? {
????? img->i16offset = I16Offset (currMB->cbp, i16mode);
??? }
??? SetMotionVectorsMB (currMB, bframe);
???
??? //===== check for SKIP mode =====
??? if ((img->type==P_SLICE || img->type==SP_SLICE) && best_mode==1 && currMB->cbp==0 &&
????? enc_picture->ref_idx[LIST_0][img->block_x][img->block_y]==0 &&
????? enc_picture->mv[LIST_0][img->block_x][img->block_y][0]==allmvs[0][0][0][0][0][0] &&
????? enc_picture->mv[LIST_0][img->block_x][img->block_y][1]==allmvs[0][0][0][0][0][1]?????????????? )
??? {
????? currMB->mb_type=currMB->b8mode[0]=currMB->b8mode[1]=currMB->b8mode[2]=currMB->b8mode[3]=0;
??? }
???
??? if(img->MbaffFrameFlag)
????? set_mbaff_parameters();
}

// Rate control
if(input->RCEnable)
{??
??? if(img->type==P_SLICE)
??? {
????? img->MADofMB[img->current_mb_nr] = calc_MAD();
?????
????? if(input->basicunit<img->Frame_Total_Number_MB)
????? {
??????? img->TotalMADBasicUnit +=img->MADofMB[img->current_mb_nr];
???????
??????? /* delta_qp is present only for non-skipped macroblocks*/
??????? if ((cbp!=0 || best_mode==I16MB))
????????? currMB->prev_cbp = 1;
??????? else
??????? {
????????? img->qp -= currMB->delta_qp;
????????? currMB->delta_qp = 0;
????????? currMB->qp = img->qp;
????????? currMB->prev_cbp = 0;
??????? }
??????? /* When MBAFF is used, delta_qp is only present for the first non-skipped macroblock of each
??????? macroblock pair*/
??????? if (input->MbInterlace)
??????? {
????????? if(!currMB->mb_field)
????????? {
??????????? DELTA_QP = currMB->delta_qp;
??????????? QP????? = currMB->qp;
????????? }
????????? else
????????? {
??????????? DELTA_QP2 = currMB->delta_qp;
??????????? QP2????? = currMB->qp;
????????? }
??????? }??????
????? }
??? }
}

???
if(input->rdopt)
??? rdopt->min_rdcost = min_rdcost;
else
??? rdopt->min_rdcost = min_cost;

if(img->MbaffFrameFlag)
{
??? if (img->current_mb_nr%2) //bottom
??? {
????? if ((currMB->mb_type ? 0:((img->type == B_SLICE) ? !currMB->cbp:1)) // bottom is skip
??????? &&(prevMB->mb_type ? 0:((img->type == B_SLICE) ? !prevMB->cbp:1))) // top is skip
????? {
??????? if (!(field_flag_inference() == curr_mb_field))
??????? {
????????? rdopt->min_rdcost = 1e30; // don't allow coding of an MB pair as skip if wrong inference
??????? }
????? }
??? }
}

//===== Decide if this MB will restrict the reference frames =====
if (input->RestrictRef==1)
{
??? if (input->rdopt==1)
??? {
????? refresh_map[2*img->mb_y ][2*img->mb_x ] = (intra ? 1 : 0);
????? refresh_map[2*img->mb_y ][2*img->mb_x+1] = (intra ? 1 : 0);
????? refresh_map[2*img->mb_y+1][2*img->mb_x ] = (intra ? 1 : 0);
????? refresh_map[2*img->mb_y+1][2*img->mb_x+1] = (intra ? 1 : 0);
??? }
??? else if (input->rdopt==2)
??? {
????? refresh_map[2*img->mb_y ][2*img->mb_x ] = (intra1==0 && (currMB->mb_type==I16MB || currMB->mb_type==I4MB) ? 1 : 0);
????? refresh_map[2*img->mb_y ][2*img->mb_x+1] = (intra1==0 && (currMB->mb_type==I16MB || currMB->mb_type==I4MB) ? 1 : 0);
????? refresh_map[2*img->mb_y+1][2*img->mb_x ] = (intra1==0 && (currMB->mb_type==I16MB || currMB->mb_type==I4MB) ? 1 : 0);
????? refresh_map[2*img->mb_y+1][2*img->mb_x+1] = (intra1==0 && (currMB->mb_type==I16MB || currMB->mb_type==I4MB) ? 1 : 0);
??? }
}
else if (input->RestrictRef==2)
{
??? refresh_map[2*img->mb_y ][2*img->mb_x ] = (currMB->mb_type==I16MB || currMB->mb_type==I4MB ? 1 : 0);
??? refresh_map[2*img->mb_y ][2*img->mb_x+1] = (currMB->mb_type==I16MB || currMB->mb_type==I4MB ? 1 : 0);
??? refresh_map[2*img->mb_y+1][2*img->mb_x ] = (currMB->mb_type==I16MB || currMB->mb_type==I4MB ? 1 : 0);
??? refresh_map[2*img->mb_y+1][2*img->mb_x+1] = (currMB->mb_type==I16MB || currMB->mb_type==I4MB ? 1 : 0);
}

if(input->FMEnable)
??? skip_intrabk_SAD(best_mode, listXsize[LIST_0+list_offset]);
}

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

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

相關文章

Django簡介以及安裝

Django簡介 1. 認識Django Django是一個高級的Python Web框架&#xff0c;它鼓勵快速開發和清潔&#xff0c;務實的設計。由經驗豐富的開發人員構建&#xff0c;它負責Web開發的許多麻煩&#xff0c;因此您可以專注于編寫應用程序&#xff0c;而無需重新創建輪子。它是免費的…

python基礎筆試面試題_python基礎面試常見題

Python是目前市面上&#xff0c;我個人認為是最簡潔、最優雅、最有前途、最全能的編程語言&#xff0c;沒有之一。 2、通過什么途徑學習的Python&#xff1f; 通過自學&#xff0c;包括網上查看一些視頻&#xff0c;購買一些相關專業的書籍。 3、Python和Java、PHP、C、C#、C等…

django-rest-swagger顯示接口備注內容

Swagger是一個API開發者的工具框架&#xff0c;用於生成、描述、調用和可視化RESTful風格的Web服務。總體目標是使客戶端和文件系統服務器以同樣的速度來更新&#xff0c;方法&#xff0c;參數和模型緊密集成到服務器端的代碼中&#xff0c;允許API始終保持同步。 在使用 djan…

安全和連接是IoT聯網設備2大挑戰

IoT正在推動500億個聯網設備在未來10年內從工業、零售、智能照明、智慧城市、汽車、農業、可穿戴設備、智能建筑、醫療市場涌現出來&#xff0c;ARM處理器部門市場營銷總監Ian Smythe表示&#xff1a;“到2020年&#xff0c;消費電子和健康、智慧城市和物流、汽車和運輸領域的I…

windows下部署免費ssl證書(letsencrypt)

隨著網絡的發展&#xff0c;網絡安全也越來越重要&#xff0c;對于網站來說&#xff0c;從Http升級到https也是我們要做的首要事情。要實現https&#xff0c;首先我們需要申請一張SSL證書&#xff0c;這篇文章我主要介紹下邊這幾個方面&#xff1a; 1. SSL簡單介紹 2. 免費Lete…

Django之URLconf路由

URLconf路由 一個干凈優雅的URL方案是高質量Web應用程序中的一個重要細節。 Django可以讓你設計URL&#xff0c;無論你想要什么&#xff0c;沒有框架限制。 要為應用程序設計URL&#xff0c;您可以非正式地創建一個名為URLconf&#xff08;URL配置&#xff09;的Python模塊。…

python中什么是關鍵字參數_如何使用python語言中函數的關鍵字參數的用法

一般情況下&#xff0c;在調用函數時&#xff0c;使用的是位置參數&#xff0c;即是按照參數的位置來傳值&#xff1b;關鍵字參數是按照定義函數傳入的參數名稱來傳值的。那么&#xff0c;關鍵字參數怎么使用&#xff1f;工具/原料 python pycharm 截圖工具 WPS 方法/步驟 1 打…

HTML塊級元素

在HTML5出現之前&#xff0c;人們一般把元素分為塊級、內聯和內聯塊元素。本文將詳細介紹HTML塊級元素h標題(Heading)元素有六個不同的級別&#xff0c;<h1>是最高級的&#xff0c;而<h6>則是最低的。一個標題元素能簡要描述該節的主題從<h1>到<h6>&am…

【SSL】HTTPS配置全過程

服務器配置https協議 HTTPS&#xff0c;是以安全為目標的HTTP通道&#xff0c;簡單講是HTTP的安全版。即HTTP下加入SSL層&#xff0c;HTTPS的安全基礎是SSL&#xff0c;因此加密的詳細內容就需要SSL。 配置HTTPS就需要證書&#xff0c;關于證書方面不做過多解釋&#xff0c;只…

iOS開發UI篇—懶載入

iOS開發UI篇—懶載入 1.懶載入基本 懶載入——也稱為延遲載入&#xff0c;即在須要的時候才載入&#xff08;效率低&#xff0c;占用內存小&#xff09;。所謂懶載入&#xff0c;寫的是其get方法. 注意&#xff1a;假設是懶載入的話則一定要注意先推斷是否已經有了。假設沒有那…

python之虛擬環境

Virtualenv(虛擬環境) VirtualEnv用于在一臺機器上創建多個獨立的Python虛擬運行環境&#xff0c;多個Python環境相互獨立&#xff0c;互不影響.這樣有很多優點,寶寶們要記住哦,比如: 在沒有權限的情況下安裝新套件 不同應用可以使用不同的套件版本 套件升級不影響其他應用 …

【解決】subprocess.CalledProcessError: Command ‘(‘lsb_release‘, ‘-a‘)‘ returned non-zero exit status 127

pip list 報錯 Traceback (most recent call last):File "/home/sensetime/.pyenv/versions/3.6.5/bin/pip", line 11, in <module>sys.exit(main())File "/home/sensetime/.pyenv/versions/3.6.5/lib/python3.6/site-packages/pip/_internal/cli/main.p…

輸出四位完全平方數_完全平方數中的規律

PS&#xff1a;很近之前自己收集的資料一個正整數如果是另一個整數的完全平方&#xff0c;那么我們就稱這個數為完全平方數&#xff0c;也叫做平方數。如&#xff1a;0&#xff0c;1&#xff0c;4&#xff0c;9&#xff0c;16&#xff0c;25&#xff0c;36&#xff0c;49&#…

RTP格式圖 NNEXB格式和RTP格式

Dove(12337127) 10:15:45我看JM代碼里面有些疑問 看好多地方都出現了ANNEXB 時空互換(178316135) 10:16:08h264的2種碼流編碼格式Dove(12337127) 10:16:19我就不太理解是什么意思 剛才翻標準看見了 剛準備認真看看 Dove(12337127) 10:16:29annexb rtp 是么&#x…

第一階段沖刺第二天

昨天把以前寫過的Java普通用戶類和訂單類看了看&#xff0c;添加了一些變量 看了一些其他網頁的代碼 今天繼續寫關于收藏部分的代碼 遇到的困難&#xff1a;還是沒有什么頭緒&#xff0c;做不到真正的實現轉載于:https://www.cnblogs.com/lzxw/p/6800311.html

為企業提供本地銷售人員的Universal Avenue獲1000萬美元A輪融資

為各類B2B企業提供本地銷售人員的瑞典初創企業Universal Avenue近日獲得了1000萬美元的A輪融資。此輪融資由Eight Roads&#xff08;富達國際的投資機構&#xff09;領投&#xff0c;原有投資者Northzone和MOOR跟投&#xff0c;加上2015年獲得的500萬美元種子輪融資&#xff0c…

Python02期預科課程筆記索引

Python index day01 Python簡介 Python發展歷程 Python安裝以及版本檢測PyCharm的安裝和破解 day02 Python注釋及語句分類 Python命令方式和關鍵字Python中的變量Python的數據類型PyCharm中的快捷鍵 day03 Python數據類型轉換Python中的運算和運算符Python流程控制 day0…

【Linux分享】Linux常用命令+教程分享

今天分享分為兩部分 :) PART01 Linux常用命令分享/ PART02 關于BD面試經驗分享 30mins Linux Command: PART 1 你本可以張口就來..... 本篇內容分享的宗旨: 拿下Linux面試 別面試的時候呆呆地說個ls了&#x1f691; 本篇分享詳細地介紹了常用Linux指令的功能、語法、參…

萬能無線鼠標對碼軟件_400元就能買ROG無線游戲鼠標,ROG影刃2無線版使用體驗...

影刃2是ROG剛剛推出的一款新產品&#xff0c;定位入門游戲玩家。目前市面上定位入門游戲玩家的無線鼠標真不多&#xff0c;400塊以內的預算想要選購一款合適的無線游戲鼠標&#xff0c;選擇其實非常有限。 就ROG產品線而言&#xff0c;烈刃2的價格到了700塊錢&#xff1b;羅技G…

[轉帖]H.264 RTP payload 格式(有效載荷)

1. 網絡抽象層單元類型 (NALU)NALU 頭由一個字節組成, 它的語法如下:---------------|0|1|2|3|4|5|6|7|--------|F|NRI| Type |---------------F: 1 個比特.forbidden_zero_bit. 在 H.264 規范中規定了這一位必須為 0.NRI: 2 個比特.nal_ref_idc. 取 00 ~ 11, 似乎指示這個 NAL…