JM8.5中的7种宏块模式问题
生活随笔
收集整理的這篇文章主要介紹了
JM8.5中的7种宏块模式问题
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
JM8.5中的7種宏塊模式問(wèn)題 收藏
Outline:
2、? 7種宏塊模式對(duì)應(yīng)的數(shù)值常量 3、? 7種宏塊模式被分成宏塊和亞宏塊 4、? 如何對(duì)宏塊和亞宏塊的運(yùn)動(dòng)估計(jì),采用一個(gè)共同的函數(shù)來(lái)處理 5、? 遺留問(wèn)題
?1、CFG文件中有關(guān)可變尺寸宏塊模式的相關(guān)選項(xiàng)
################################################################################Encoder Control ############################################################################### … InterSearch16x16????? =? 1? # Inter block search 16x16 (0=disable, 1=enable)
InterSearch16x8?????? =? 1? # Inter block search 16x8? (0=disable, 1=enable) InterSearch8x16?????? =? 1? # Inter block search? 8x16 (0=disable, 1=enable) InterSearch8x8??????? =? 1? # Inter block search? 8x8? (0=disable, 1=enable) InterSearch8x4??????? =? 1? # Inter block search? 8x4? (0=disable, 1=enable) InterSearch4x8??????? =? 1? # Inter block search? 4x8? (0=disable, 1=enable) InterSearch4x4??????? =? 1? # Inter block search? 4x4? (0=disable, 1=enable)
解釋:
各種宏塊尺寸可以在程序外部進(jìn)行選擇。
2、? 7種宏塊模式對(duì)應(yīng)的數(shù)值常量
各種宏塊模式對(duì)應(yīng)的數(shù)值常量如下:16×16-1???? 16×8-2?????? 8×16-3?????? 8×8-4??? 8×4-5???? 4×8-6????? 4×4-7?
以上的數(shù)值常量的rdopt.c的encode_one_macroblock()中的valid[]數(shù)組和mode變量中會(huì)用到,另外在mv_search.c的PartitionMotionSearch()中的blocktype變量也會(huì)用到。
?
3、?? 7種宏塊模式被分成宏塊和亞宏塊
16x16, 16x8, 8x16(,8×8)被稱為宏塊級(jí),而8×8,8×4,4×8,4×4被稱為亞宏塊級(jí)。所用到的函數(shù)是:encode_one_macroblock(),rdopt.c 該函數(shù)的作用是編碼一個(gè)宏塊(包括幀間、幀內(nèi)、幀內(nèi)預(yù)測(cè)的方式)。 其中重要的程序段如下: //宏塊級(jí)運(yùn)動(dòng)估計(jì)
//===== MOTION ESTIMATION FOR 16x16, 16x8, 8x16 BLOCKS ===== for (min_cost=1<<20, best_mode=1, mode=1; mode<4; mode++) { if (valid[mode])//對(duì)應(yīng)于程序外部(即CFG文件中)的設(shè)置 { //對(duì)于16×16,MB只分一個(gè)塊;對(duì)于16×8和8×16,MB被分成兩個(gè)塊 for (cost=0, block=0; block<(mode==1?1:2); block++) { //塊匹配!!!lambda_motion用來(lái)求運(yùn)動(dòng)矢量消耗的碼率 PartitionMotionSearch (mode, block, lambda_motion); … //亞宏塊級(jí)運(yùn)動(dòng)估計(jì)
if (valid[P8x8]) { … //=====? LOOP OVER POSSIBLE CODING MODES FOR 8x8 SUB-PARTITION? ===== for (min_cost8x8=(1<<20), min_rdcost=1e30, index=(bframe?0:1); index<5; index++) { if (valid[mode=b8_mode_table[index]])//b8_mode_table[6] = {0, 4, 5, 6, 7}; { curr_cbp_blk = 0; if (mode==0) //--- Direct Mode --- { … } // if (mode==0) else { //--- motion estimation for all reference frames --- PartitionMotionSearch (mode, block, lambda_motion); … NOTE:從上面程序段中可以看出JM8.5中對(duì)7種宏塊模式是采用全部遍歷的方式,所以導(dǎo)致的計(jì)算復(fù)雜度很高。 4、? 如何對(duì)宏塊和亞宏塊的運(yùn)動(dòng)估計(jì),采用一個(gè)共同的函數(shù)來(lái)處理
從3中的程序可以看到,對(duì)于宏塊和亞宏塊級(jí)的運(yùn)動(dòng)估計(jì),都采用了一個(gè)共同的函數(shù):PartitionMotionSearch(), mv_search.c 其中重要的程序段如下:
…… //各種宏塊模式下的子塊的起始偏移量,相對(duì)4*4塊來(lái)講,這有利于運(yùn)動(dòng)矢量的存放
//[5]表示宏塊的類型,[4]表示各種類型下的子塊序號(hào),最多子塊情況為P8X8模式下有4個(gè) static int? bx0[5][4] = {{0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,2,0,0}, {0,2,0,2}};
static int? by0[5][4] = {{0,0,0,0}, {0,0,0,0}, {0,2,0,0}, {0,0,0,0}, {0,0,2,2}};
…… int?? parttype? = (blocktype<4?blocktype:4);//亞宏塊的parttype都設(shè)為4 //step_?是用來(lái)求4*4塊級(jí)別的步長(zhǎng),
//由于parttype和blocktype的區(qū)別使得兩組步長(zhǎng)之間存在微妙的差異,為下面的循環(huán)做好了鋪墊
int?? step_h0?? = (input->blc_size[ parttype][0]>>2);int?? step_v0?? = (input->blc_size[ parttype][1]>>2); int?? step_h??? = (input->blc_size[blocktype][0]>>2); int?? step_v??? = (input->blc_size[blocktype][1]>>2); … //===== LOOP OVER SUB MACRO BLOCK partitions //這里對(duì)于亞宏塊的循環(huán)是自適應(yīng)的, //假如小于8*8塊尺寸時(shí),自動(dòng)采取循環(huán) for (v=by0[parttype][block8x8]; v<by0[parttype][block8x8]+step_v0; v+=step_v) { pic_block_y = img->block_y + v; for (h=bx0[parttype][block8x8]; h<bx0[parttype][block8x8]+step_h0; h+=step_h) {
……
總結(jié)
以上是生活随笔為你收集整理的JM8.5中的7种宏块模式问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C语言 内存分配 地址 指针 数组 参数
- 下一篇: C语言中指针的初始化和赋值