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

Q:PSNR

峰值信噪比

是根據它來取qp是不是?

A:不是

和QP沒有直接關系但是QP的選擇會影響到PSNR

Q: 如果不用率失真最優化,為什么選擇SATD+delta×r(mv,mode)作為模式選擇的依據?為什么運動估計中,整象素搜索用SAD,而亞象素用SATD?為什么幀內模式選擇要用SATD?

A:

SAD即絕對誤差和,僅反映殘差時域差異,影響PSNR值,不能有效反映碼流的大小。SATD即將殘差經哈德曼變換的4×4塊的預測殘差絕對值總和,可以將其看作簡單的時頻變換,其值在一定程度上可以反映生成碼流的大小。因此,不用率失真最優化時,可將其作為模式選擇的依據。

一般幀內要對所有的模式進行檢測,幀內預測選用SATD 的原因同上。

在做運動估計時,一般而言,離最優匹配點越遠,匹配誤差值SAD越大,這就是有名的單一平面假設,現有的運動估計快速算法大都利用該特性。但是,轉換后SATD值并不滿足該條件,如果在整象素中運用SATD搜索,容易陷入局部最優點。而在亞象素中,待搜索點不多,各點處的 SAD差異相對不大,可以用SATD選擇碼流較少的匹配位置。

作者:ichliebemich

發表時間:2006-4-6 16:28:51

Q:什么是 SAD,SAE,SATD,SSD,SSE,MAD,MAE,MSD,MSE?

A:SAD(Sum of Absolute Difference)=SAE(Sum of Absolute Error)即絕對誤差和

SATD(Sum of Absolute Transformed Difference)即hadamard變換后再絕對值求和

SSD(Sum of Squared Difference)=SSE(Sum of Squared Error)即差值的平方和

MAD(Mean Absolute Difference)=MAE(Mean Absolute Error)即平均絕對差值

MSD(Mean Squared Difference)=MSE(Mean Squared Error)即平均平方誤差

--------------------------------------------------------------------------------

作者:avs264

發表時間:2006-4-8 11:43:54

Q:下面代碼的功能是什么?

if(pix & (~255))

{

pix1[x] = (-pix) >> 31;

}

else

{

pix1[x] = (unsigned char)pix;

}

A:

pix的定義是short型,pix1定義的是unsigned char型

這段代碼可以這么理解(這段代碼的功能):如果pix<0,那么pix1[x]=0,如果 pix>255,那么pix1[x]=255,否則pix1[x]=pix;

Q:編解碼是以什么為單位進行的?

A:在看編碼解碼的框圖的時候,如果你以幀為輸入單位來看,可能你會看不懂,所以應該以宏塊為輸入單位來看,因為編碼解碼都是以宏塊為單位,逐個宏塊編解碼,然后組合為一幀圖像的。這樣你就能看明白了。所以個人認為編解碼應該是以宏塊為單位進行的。

Q:為何在cavlc編碼的時候,第一個負數要加1?

A:如果拖尾小于3,說明第一個level的絕對值值肯定大于 1。因此,level為正時,減1;為負時加1。可降低碼流

Q: YCrCb 4:2:0是什么?像4:4:4和4:2:2一樣表示 Y:Cr:Cb是4:2:0嗎?

A: 不要讓它騙了,我覺得它所表達意思應該是4:1:1,還有如果你看得是像 http://www.cs.sfu.ca/CC/365/li/material/notes/Chap3/Chap3.4/Chap3.4.html 里面這樣的對4:2:0的說明的爛圖的話,可能看半天也不明白,建議看 里面相應的圖。里面的說明也很詳細:

4 : 2 :0 means that Cr and Cb each haveh alf the horizontal and vertical resolution of Y, as

shown. The term ‘4 : 2 : 0’ is rather confusing: the numbers do not actually have a sensible

interpretation and appear to have been chosen historically as a ‘code’ to identify this particular sampling pattern.

Q:H.264中,術語IDR的意思是什么,有什么用?

A:IDR-instantaneous decoding refresh (IDR)picture;

A coded picture in which all slices are I or SI slices that causes the decoding process to mark all reference pictures as "unused for reference" immediately after decoding the IDR picture. After the decoding of an IDR picture all following coded pictures in decoding order can be decoded without inter prediction from any picture decoded prior to the IDR picture. The first picture of each coded video sequence is an IDR picture.

也就是說,IDR的出現其實是相當于向解碼器發出了一個清理reference buffer的信號吧,上面說前于這一幀的所有已編碼幀不能為inter做參考幀了。

Q:CABAC中開始時各字符出現的概率是怎么得到的?

A:基于查表實現的

Q:我們可以從一幅圖像的自相關函數圖中得到不同圖像之間的相似程度.在中點處的最頂點表示圖像未經移動時的圖像.當空域移動拷貝被從原始圖像的任一個方向移除的時候,這個函數值就會急驟下降,就這說明了一個圖像采樣值的鄰域內是高度相關的.

我想問一下,空域移動拷貝被從原始圖像的任一個方向移除的時候,這是一個什么過程

A:空域移動就表示平移,求自相關函數就包含平移這個過程.你看一維的 R(t,delta)=E[X(t)*X(t+delta)] ,二維不過平移多個方向而已

A:only the central decoder is standardized什么意思Q:意思是說264標準只定義了碼流的格式編碼器實現是各公司自己的事,只要形成的碼流符合標準就行 解碼器必須按照這個格式來,這樣任何符合標準的碼流都可以解出來

Q:What is RVLC?

A:It is a VLC method which can be decoded from left to right and from right to left exclusively.

Q:RDO模型用來干什么?RQ模型又用來干什么?

A:RDO用來確定編碼模式的,保證碼率比特數和圖像失真的最佳權衡點,而RQ是在上一層碼率數一定的情況下用來確定下一層分配的比特數。RQ先于RDO進行。

Q:幀,場,圖像的聯系與區別是什么?

A:在分析標準時要分清幀(frame)、場(field)、圖像(picture)很關鍵。

frame;逐行掃描圖像

field:隔行掃描圖像,偶數行成為頂場行,奇數行稱為為底場行,所有頂場行稱為頂場,同樣所有底場行稱為底場。

pictue:場和幀都可認為是圖像

[注:SUPERPUMA語]

頂底場分別編碼,對應位置的宏塊叫做宏塊對。頂場對已編碼的頂/底場預測編碼。底場一般對頂場預測編碼

Q: 如何在VC下編譯JM

A:編碼步驟:

打開tml.dsw,依次選擇project->settings,在settings for那一欄中選中lencod,在右邊的debug選項卡做如下填寫:

Executable for debug session:和tml.dsw同一文件夾,我填的是/JM/bin/lencod.exe,具體有什么講究我沒有研究,應該沒很大關系。

Working directory:./bin

Program arguments:-f encoder.cfg decoder.cfg

Remote executable path and file name:可不填

然后,在vc中選擇build->set active configurations,再選擇lencod-Win32 debug.

下一步compile、build、execute,在這些之后,就完成了編碼的工作。

解碼步驟:

重復以上編碼操作,不同之處是在settings for那一欄中選中ldecod,Executable for debug session填的路徑和編碼時應一樣,Program arguments填decoder.cfg,build->set active configurations中選擇ldecod-Win32 debug,其他不變。之后compile、build、execute,解碼完成!

還有一點需要注意:編碼的yuv圖像要放在bin文件夾中!

Q:關于 H264 ASIC設計的難點。

A:

1)怎樣設計一個高效的Memory(SDRAM or DDR)系統是其中最大的挑戰。MC最少的單元是4x4,因為在一行中只有4個Pixel,必然會導致memory miss rate的增加,從而降低memory BW的利用率。也許可以利用圖像的空間相關性,設計一個類似于CACHE的結構。但CACHE的大小是一個值得探討的問題。

2)怎樣用相同的硬件結構來實現幀內預測和幀間預測。

3)怎樣用一套硬件結構來同時實現mpeg2/4,WMV.因為核心的算法,例如DCT都不一樣。

4)怎樣降低熵解碼的復雜度。

5)可以最多允許多少個reference Frame的問題。這對整個硬件構架沒有任何影響。但直接影響成本,也就是片外要用多少M memory的問題。

A: IDR幀與I幀的區別Q:因為264采用了多幀預測,就有可能在display order下I幀后的P會參考I幀前的幀,這樣在random access時如果只找I幀,隨后的幀的參考幀可能unavailable,IDR就是這樣一種特殊的I幀,把它定義為確保后面的P一定不參考其前面的幀,可以放心地random access。

Q:對于幀間編碼,在一個宏塊內,可以同時存在的模式?

A:在同一宏塊內,如果用模式16*8,那么宏塊分為兩塊,均為16*8;8*16類似.如果用p8*8模式,對于8*4和4*8把一個8*8塊分為兩個塊,對于4*4則分為4個.

Q:幀間預測時,MV,MVp,MVD分別是什么?

A:me得到的是mv

預測得到的是mvp

差值是mvd

MV:運動向量,參考幀中相對于當前幀的偏移

MVp:參考運動向量

MVD:兩個向量間的差別

Q: I幀和P幀的概念比較好懂,B幀的概念有些模糊,只知道加了B幀圖像質量會更好,請問對B幀該怎么理解?

A: B 幀在 MPEG-4 中有四種參考模式,如果是同時參考前后的畫面壓縮,則記錄的是 和 (前畫面 pixel 值 + 后畫面 pixel 值)/2 的差值,也就是 和 「前后畫面的平均」的差值。所以記錄的差值個數和 P 幀一樣,只有一個,沒有增加。而因為 B 幀位于前后畫面的中間,以「前后畫面的平均」,也就是「前后畫面的中間值」來作為預測數值(預測 B 幀的 pixel 數值為多少?如果有誤差,再記錄差值),這樣這個預測數值會比單獨使用前一個畫面來預測,更接近目前真正的 B 幀的數值,可想而知,如此所需要記錄的差值就會很小甚至可以根本不用記錄,所以便可以省下很多的 bits,提高壓縮率。

除了壓縮率以外,B 幀對畫質的影響也是有的,因為 B 幀這種參考前后畫面的特性,等于有內插(interpolation)的效果,所以可以減少噪訊。

Golomb 用于運動矢量,模式類型,頭信息等編碼

CAVLC用于殘差編碼

CABAC 都可以

Q:rdp(user data packet protocol) 和 (rtp)real-time transport protocol有什么區別?

A:RTP是為了實時傳輸而在源數據上加了一些時間控制信息

UDP只是為了傳輸數據,udp的包可以加上rtp的頭,成為一個rtp的數據包

rtp3984 拆分3種包:

單一NALU包

聚合包

分割包

經過測試發現,無線網絡下,一包大小不能超過1400,只能傳QCIF,QP35

Q:相對 PAFF,MBAFF的作用大不大?

A:有優勢,但不明顯。只有當圖像運動劇烈的時候,優勢才會比較明顯。

Q:變換量化公式: |Zij|=(|Wij|.MF+f)>>qbits 中的f是什么?

A:f 是一個修正參數,對于幀內編碼宏塊f=(2^qbits)/3,對于幀間編碼宏塊f=(2^qbits)/6。

Q:整數DCT變換之后,為什么還要對直流分量進行哈達瑪變換??有什么意義?

A:因為在幀內編碼宏塊中大多數的能量都集中在直流系數上,這種變換有利于進一步壓縮4×4的亮度直流信號的相關性。

Q:white paper中給出幀內預測9種模式,vertical和horizontal容易理解,不知其他模式是依據怎樣的算法來進行預測的。

A:標準P91-96給出了算法。

如8.3.1.2.8 Specification of Intra_4x4_Vertical_Left prediction mode中指出:

This Intra_4x4 prediction mode shall be used when Intra4x4PredMode[luma4x4BlkIdx] is equal to 7.

The values of the prediction samples pred4x4L(x,y),with x,y=0...3 are derived as follows:

For y=0 or y=2,

pred4x4L(x,y)=(p(x+(y>>1),-1)+p(x+(y>>1)+1,-1)+1)>>1;

Otherwise,

pred4x4L(x,y)=(p(x+(y>>1),-1)+2*p(x+(y>>1)+1,-1)+p(x+(y>>1)+2,-1)+2)>>1;

hehe,>>為無符號數右移操作。

Q:關于對除開拖尾系數以外的非零系數Level編碼

A:level的編碼和AVS一樣,查6個表,表也和AVS的一樣

JM有算法,可以參看

writeSyntaxElement_Level_VLCN 函數。.

這個算法就是生成6個表的算法。

Q:h264在網絡上以udp方式傳輸問題

在mpeg4標準中,都是通過rtp協議把視頻幀分成一個個的包加上rtp頭再發送,在h264 中,是由nal直接分片成包的還是要通過rtp分呢?要不要加rtp頭

Q:FMO 的優處和劣處?

A:劣處是FMO模式打亂了原宏塊順序,降低了編碼效率,增加了時延;

優處是增強了抗誤碼性能。

Q:block的類型包括幾種?

A:在變換編碼的階段,根據block的類型有三種變換編碼,

block 的類型包括1、亮度的4*4直流系數組成的塊;2、色度的2*2的直流系數組成的塊;3、其它類型的塊(包括亮度的4*4交流系數組成的塊(在DC系數的位置設為0);色度的4*4交流系數組成的塊(在DC系數的位置設為0);采用4*4幀內編碼模式的4*4塊;運動補償的4*4的幀間預測塊)

其中亮度4*4DC系數組成塊和色度2*2的直流系數組成的塊僅僅在16*16的幀內預測模式下會出現。

Q:在進行運動估計和運動補償時,所用的塊匹配快速算法有哪些?匹配準則又有哪幾種?

A:塊匹配快速算法有:正交搜索算法(OSA)、交叉搜索算法(CSA)、共軛方向搜索(CDS)、三步搜索(TSS)、二維對數(TDL)和全搜索(FS)、鉆石算法等等。匹配準則一般有:歸一化互相關函數(NCCF)、均方誤差(MSE)、絕對誤差和(SAD)等等。SAD最常用。

Q:jm各個版本之間的代碼做了些什么改動,有沒有說明這些的文檔啊?

A:每個版本源代碼的根目錄下都有一個 change.txt 文件,里面詳細記錄了所有版本的更新。

補充:為何已經有了 JM 10.2,大家仍偏好用 8.6 呢 ?

風輕回答:針對對象不同,jm90以上全部是針對高保真的視頻的。86基本上可以滿足一般處理的所有要求。

Q: PicAFF和MbAFF的區別是什么?

A: PicAFF和MBAFF是決定壓縮場的兩種方式,PicAff(picture adaptive field frame)是在圖像層來說的,此時幀被分成兩個場,并且這兩個場單獨壓縮,這兩個場在分別分成16*16的宏塊,然后對宏塊進行編碼,編碼的時候對場中的宏塊單獨編碼,在某個場編碼完后,才會編另一個場的碼。

而 MBAFF(MicroBlock Adaptive Filed/Frame)是在宏塊層(16*32)上進行編碼,它將該宏塊層即可以按單獨的場,也可以將兩個場合并成一個進行編碼,在分成兩個單獨的宏塊(16*16)編碼的時候,是先編碼一個場的宏塊,再編碼另一個場的宏塊,這和PicAFF的區別就是對于整個圖像來說各個場的宏塊還是交叉編碼的;在合并成單獨的一個宏塊編碼時,在一個宏塊(16*16)內,即包括奇數場的元素,也包括偶數場的元素,即宏塊對,同時同一幅圖像值(就算是上一場)也不能做參考。

Q:用h264設計的解碼器是不是可以解任意編碼器編的碼?是根據檔次設計解碼器嗎?

A:不可以解任意編碼器編的碼。也不是根據檔次來設計編解碼器。要根據具體的情況。

如果是按照H.264的標準來設計編解碼器,便是通用的;若編解碼器的設計有自己的特點,便不能成為通用的編解碼器。

Q:在VC環境下是如何讀入*.yuv序列的?

A:把*.yuv文件當作一般的文件讀就可以了。

如下:

#include

#include

void main()

{

char *Y;

char *Cb;

char *Cr;

int width = 352, height = 288;

FILE *fp;

FILE *fy;

int i;

Y = (char*)malloc(width*height);

Cb = (char*)malloc(width*height/4);

Cr = (char*)malloc(width*height/4);

fp= fopen("input.yuv","rb");

if(fp == NULL)

printf("open input.yuv failed/n");

fy = fopen("output.yuv", "ab+");

if(fy == NULL)

printf("open output.yuv failed/n");

for(i = 0; i<1; i++)

{

//fseek(fp, i*width*height, 0);

if(0 == fread(Y, width*height, 1, fp))

printf("read error/n");

if(0 == fwrite(Y, width*height, 1, fy))

printf("write error/n");

fread(Cb, width*height/4, 1, fp);

fread(Cr, width*height/4, 1, fp);

fwrite(Cb, width*height/4, 1, fy);

fwrite(Cr, width*height/4, 1, fy);

}

fclose(fp);

fclose(fy);

free(Y);

free(Cb);

free(Cr);

}

Q:SODB,RBSP,EBSP的區別

A:SODB:最原始的編碼數據,沒有任何附加數據

RBSP:在SODB的基礎上加了rbsp_stop_ont_bit(bit 值為1),并用0按字節補位對齊,字節對齊后,后面還有可能存在若干組16bits的0x0000(參考標準中的One or more cabac_zero_word 16-bit syntax elements equal to 0x0000 may be present in some RBSPs after the rbsp_trailing_bits( ) at the end of the RBSP.)

EBSP:在RBSP的基礎上增加了防止偽起始碼字節(0X03)

Q:碼流的讀取位置

A:當數據流存儲在介質上時,此時讀取用GetAnnexbNALU (nalu);

否則,數據流應該來自分組交換網絡,此時讀取用GetRTPNALU (nalu)

二者的區別:

碼流格式為Byte stream format時,調用函數GetAnnexbNALU(nalu);此時碼流中包含起始碼前綴(start_code_prefix_one_3bytes),3 個字節,值為0x00 00 01。并可能包含連續若干字節的0(leading_zero_8bit),拖尾字節0。起始碼前綴是為了表明碼流的開始,與AVS相似。因為可能存在填充bit 0,所以也可能包含有leading_zero_8bit,即起始碼前綴的表現形式可能是0x00 00 00 01或其他值。但這些值必須包含0x00 00 01。對原始碼流提取后,這些值均被丟棄。

如果碼流是按RTP協議傳輸,則調用GetRTPNALU(nalu)。并對RTP包進行拆封。在H.264中,對RTP包頭的各段的值進行了限制,這些被限制的值必須滿足條件,否則認為出錯。

A:MBAFF的問題

Q:幀模式下的MBAFF,每個宏塊對由本幀的宏塊組成。

場模式下的MBAFF,把兩場組成一幀后,在按照幀的方式來組成宏塊對。實際上是每個宏塊對由頂場的一個宏塊和底場的一個宏塊組成。

Q;CAVLC,Exp-Golomb的區別

A:Exp-Golomb的前綴和后綴根據階數K的不同,可能是對稱,后綴比前綴的長度多 1等情況。

負數的情況下,通過公式(–1)k+1 Ceil( k÷2 ),把解析出來的哥倫布碼值還原為原始的語法元素值;正數也有相應的對應方法。

CAVLC 的前綴和后綴可能對稱,也可能不對稱,(大多數情況下都是不對稱的)而且后綴還可以不存在,后綴的長度也是根據上下文環境來判斷的,后綴的取值是根據編碼表查詢的,

對于正數,編碼后的后綴部分的最后1 bit一定是0(若存在后綴);對于負數,其一定是1(若存在后綴)。

CAVLC 與Exp-Golomb的前綴的表現形式都是1,01,001,0001......

Q:CAVLC的過程

A:編碼4×4的殘差塊通過Zig-Zag掃描,得到一系列字符,如:0,3,0,1,-1,-1,0,1,0......

由此序列推導出以下變量:TotalCoeffs(全部的非零系數,包括拖尾系數),TotalZeros(最后一個非零系數前面的所有0的個數,方向為從左到右,比如上面的序列中,最后一個非零系數為1),TrailingOnes(托尾系數的個數,并規定不能超過3個),然后通過NC值查表,把

TotalCoeffs ,和TrailingOnes的組合進行編碼,稱為編碼元素coeff_token。接下來,對每個拖尾系數的符合編碼,0表示+,1表示負。再接下來,對剩下的非零系數編碼(此時拖尾系數已經被編碼了,不再包括),編碼方向為從右到左,比如上面的序列中,先編碼1,再編碼3。這些系數被編碼后,是由 level_prefix和level_suffix兩部分組成的。level_prefix的值通過查表得出,level_suffix是由若干個0組成,0的個數由suffixLength決定。再接著對TotalZeros的值編碼。然后對RunBefore(每個非零系數前零的個數)進行編碼,這個方向也是從右到左,并且最后一個(從左邊數的第一個)非零系數前零的個數不需要編碼,因為后面的編過后,剩下多少個0只有一個存放位置,就是最前面。

解碼

由計算出的 bit串長度讀出相應的bits,通過查表得到TotalCoeffs和TrailingOnes的值,此時無輸出,接著讀取拖尾系數的符合,由編碼的順序知,先讀到的是最后一個拖尾系數。解碼完拖尾系數并依次輸出,接下來是剩下的非零系數的值,通過查表解碼并輸出。然后解碼TotalZeros,此時輸出不變,仍為以前的解碼值。接下來解碼RunBefore,因為編碼時是從右往左編的,故第一個解碼出來的RunBefore應該插到第一個解碼出的拖尾系數的前面,即插入的方向也是從右到左,最后一步時,剩下的RunBefore都插入到最前面。

Q:哪位能講一下標準里面的坐標的問題,分不清到底指的是塊,宏塊,尤其是MBAFF時?比如第6章逆掃描時的這兩個公式:y = yO + ( mbAddr % 2 ) * 16(幀),

y = yO + ( mbAddr % 2 ) (場)

A:這是計算像素坐標的計算公式,MBADDR 時是以宏塊對出現的,MBADDR是宏塊對的號碼,所以場模式下是不要乘16的,TOP FIELD和BOTTON FIELD的像素是獨立計算的。表達可能不大準確,也可能有誤,希望各位指點。

Q:為什么要在計算楨內DC預測模式時要+2,+4?

A:16*16和4*4的楨內 DC預測模式中+2,+4的目的是為了四舍五入,使預測值更精確~~~

如(A+B+C+D)/4=190.1,那么約等于190

(A+B+C+D)/4=190.9,也是約等于190

這樣誤差就會大些

所以加上0.5后190.1=190.6,約等于190

而190.9+0.5后=191.4,約等于191

這樣保證了精確性~~~

Q: 為什么量化系數的數組是取[6][4][4]呢?

A:設變量p為需要變換的系數,c(p) 為變換之后的系數,其變換如下:

|1 1 1 1| |p00 p01 p02 p03| |1 2 1 1| |aa ab/2 aa ab/2|

|2 1 -1 -2| |p10 p11 p12 p13| |1 1 -1 -2| * |ab/2 bb/4 ab/2 bb/4|

|1 -1 -1 1| |p20 p21 p22 p23| |1 -1 -1 2| |aa ab/2 aa ab/2|

|1 -2 2 -1| |p30 p31 p32 p33| |1 -2 1 -1| |ab/2 bb/4 ab/2 bb/4|

我們可以看到位于p00、p02、p20、p22位置的系數需要乘aa,p11、p13、p31、p33的系數需要乘bb/4,其余的系數需要乘ab/2,這里a = 0.5,b = sqrt(0.4),c = 0.5。然而整數變換中的乘法運算可以與量化過程的除法運算糅合起來,這樣就產生了你所提到的quant_coef[6][4][4]。第一個分量取6,是因為量化階每隔6就增加一倍,因此只需要記錄下量化階為0-5時的各個系數的大小,而后兩個分量取4則是為了與整數變換的大小相匹配

Q: int cof[4][6][4][4]; //!< correction coefficients from predicted

這個變量是干什么用的啊?

A:這個變量用來存儲解碼并且逆量化之后的系數,其中cof[4][6]的內容如下:

|y0 y1 y4 y5 |

|y2 y3 y6 y7 |

|y8 y9 y12 y13|

|y10 y11 y14 y15|

|u0 u1 v0 v1 |

|u2 u3 v2 v3 |

Q:IDR picture指什么?

A:instantaneous decoder refresh picture,是一種只包含I-slices的picture. IDR picture之后的picture不使用IDR picture之前的picture作為運動估計的參考picture.

[此帖子已被 avs264 在 2006-4-8 11:45:56 編輯過]

[此帖子已被 shirleyhuang 在 2006-4-19 13:46:00 編輯過]

--------------------------------------------------------------------------------

作者:shirleyhuang

發表時間:2006-4-19 13:54:46

PartitionMotionSearch 函數里面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}},[5]是模式,[4]是子塊的坐標 。0模式就是指skip或direct模式

ChromaResidualCoding (&dummy)中dummy是計算色度CBP的值,然后在亮度CBP上疊加,構成率失真函數的重要部分

--------------------------------------------------------------------------------

作者:shirleyhuang

發表時間:2006-4-19 21:06:57

常用的測試序列選擇:

Coastguard :為物體的相對運動和鏡頭移動

flower :為物體的劇烈運動和鏡頭的快速移動

garphone :為物體的快速轉換

foreman :為物體轉換和鏡頭移動

mobile&calendar :為物體的多種運動和鏡頭移動

--------------------------------------------------------------------------------

作者:shirleyhuang

發表時間:2006-4-22 17:30:36

為什么幀內預測要用未濾波的圖像而不是濾波后的圖像呢?

幀內預測只能用濾波前的值,因為幀內預測的時候邊界濾波還不能進行,幀內預測所需要的象素點的邊界的濾波不能進行,因為需要等到當前宏塊解完后才開始,但是你現在就在解當前宏塊,所以為了避免預測和濾波的耦合 應該分開來單獨做,prediction的時候保存一個line buffer就解決問題了

h->param.analyse.inter &= X264_ANALYSE_PSUB16x16|X264_ANALYSE_PSUB8x8|X264_ANALYSE_BSUB16x16|

X264_ANALYSE_I4x4|X264_ANALYSE_I8x8;

為什么這么做啊?

幀間要遍歷所有模塊,可以去掉一下選項,就是說,你可以不搜索一些模式,他默認是都要搜索的,比如你編碼P幀的時候,不想搜索的那么精細,可以去掉ANALYSE_PSUB8x8

--------------------------------------------------------------------------------

作者:shirleyhuang

發表時間:2006-4-26 9:34:28

Q:CQM_4IY,CQM_4IC,CQM_4PY,CQM_4PC,CQM_8IY,CQM_8PY 的含義?

A:cqm_4iy->INTRA4X4_LUMA,cqm_4ic->INTRA4X4_CHROMA

cqm_4py->INTER4X4_LUMA,cqm_4ic->INTER4X4_CHROMA

cqm_4py->INTER8X8_LUMA,cqm_4ic->INTER8X8_CHROMA

Q:在x264的x264_cqm_init( x264_t *h )函數中:

for( i = 0; i < 16; i++ )

{

h->dequant4_mf[i_list][q][0] = def_dequant4[q] * h->pps->scaling_list[i_list];

h-> quant4_mf[i_list][q][0] = def_quant4[q] * 16 / h->pps->scaling_list[i_list];

}

第二個式子為什么*16?

A:你不要管這個16,這個16是約定成俗的,要和量化,凡量化一直考慮

Q:unquant4_mf[4][52][16]這個矩陣也是量化里面的,你看量化矩陣和反量化矩陣都是4維的,而這個是3維的

A:unquant4_mf[i_list] [q],是0~15,是線性排列,quant4_mf[i_list][q%6][0],是[][]矩陣排列

Q:在上面的程序中量化和反量化矩陣為什么第三維只為0呢?

A:為0才對,因為本來定義[4][4],現在要線性訪問16個成員,就必須[0]了

以上問題由城里漢子回答,特此感謝!

--------------------------------------------------------------------------------

作者:shirleyhuang

發表時間:2006-5-12 10:05:15

Q:關于skip模式的問題

A:When a Skipped macroblock is signalled in the bitstream, no further data is sent for that macroblock. The decoder calculates a vector for the skipped macroblock and reconstructs the macroblock using motion-compensated prediction from the first reference picture in list 0.

p_skip 就是說只計算參考幀中的mv,傳輸的是0數據,直接把參考中的匹配宏塊拿過來就行了,skip模式只傳送mb_type,其他信息都是從參考楨中獲取,在解碼端計算MV及恢復殘差數據,MV不是從參考幀獲得的,是在解碼端計算,mv是根據周圍的相鄰塊的mv進行計算,好像是取中間值,有點像MV在運動估計時候的預測,是只傳送mb_type,其他信息都可以計算出來 ,這就是skip。

To have a SKIP mode in H.264, a macroblock should meet following conditions all together [5]:

(i) the best motion compensation block size is 16x16,

(ii) reference frame is just one previous one,

(iii) motion vector is (0,0) or the same as its PMV, and(iv) its transform coefficients are all quantized to zero.

(iv) its transform coefficients are all quantized to zero

--------------------------------------------------------------------------------

作者:jqzw

發表時間:2006-5-14 10:47:38

為什么幀內預測要用未濾波的圖像而不是濾波后的圖像呢?

幀內預測只能用濾波前的值,因為幀內預測的時候邊界濾波還不能進行,幀內預測所需要的象素點的邊界的濾波不能進行,因為需要等到當前宏塊解完后才開始,但是你現在就在解當前宏塊,所以為了避免預測和濾波的耦合應該分開來單獨做,prediction的時候保存一個line buffer就解決問題了

----這樣的解釋對嗎?

--------------------------------------------------------------------------------

作者:shirleyhuang

發表時間:2006-5-14 14:34:05

如若解釋不對,還請賜教^-^

--------------------------------------------------------------------------------

作者:shirleyhuang

發表時間:2006-5-21 15:42:17

FrameSkip, 該參數是對原始YUV幀丟棄數,就是說每隔一幀(I或者P,不包括B)丟棄FrameSkip幀。

NumberBFrames,就是兩個編碼幀中間B幀的數目,該數必須小于FrameSkip

FramesToBeEncoded,總共要編碼的幀數,不包括B幀.因為在編碼過程中 b幀對其他幀并不產生影響,而且在實時編碼中,如果負擔過重;或帶寬有限,可以有選擇的丟棄b幀

IntraPeriod,每IntraPeriod幀(I/P幀)有一個I幀編碼

如果你選擇的frameskip>=1,numberbframes=0,intraperiod>1,序列類型:ipp...ipp...

如果你選擇的 frameskip>=1,numberbframes=1,intraperiod>1,序列類型:ipbpb...ipbpb...

如果你選擇的 frameskip>=2,numberbframes=2,intraperiod>1,序列類型:ipbbpbb...ipbbpbb...

--------------------------------------------------------------------------------

作者:oliverzou

發表時間:2006-6-11 23:40:37

h264標準里為什么有PAFF和MBAFF兩種編碼模式,都是出于編碼效率的考慮嗎?

還是PAFF 編碼還考慮了逐行隔行顯示的問題

--------------------------------------------------------------------------------

作者:oliverzou

發表時間:2006-6-11 23:49:46

P_Skip的特別之處在于碼流中不傳輸MVD數據,預測塊的大小肯定史16*16。當下面四個條件滿足任意一個時,當前宏塊的MV預測值直接置為(0,0),不滿足時當作普通P宏塊處理

– mbAddrA is not available

– mbAddrB is not available

– refIdxL0A is equal to 0 and both components of mvL0A are equal to 0

– refIdxL0B is equal to 0 and both components of mvL0B are equal to 0

--------------------------------------------------------------------------------

作者:shirleyhuang

發表時間:2006-7-21 15:33:29

#define SADFUNC(w, h, base) /

uint32_t /

T264_##base##_u_##w##x##h##_c(uint8_t* src, int32_t src_stride, uint8_t* data, int32_t dst_stride) /

{ /

return T264_##base##_u_c(src, src_stride, data, w, h, dst_stride); /

}

這種宏定義無論是在 t264,x264或是jm代碼中都比較常見

使用這樣的宏定義后,函數名字可以根據宏定義進行改變,也就是說,函數名也有宏定義。

相鄰兩個##之間的內容用調用時的()內的相應的內容進行代替,例如:

SADFUNC(16, 16, sad)就用sad代替base,16代替x,16代替h

這樣實際調用函數就為 T264_sad_u_16x16(.........)了

?

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

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

相關文章

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;并在子進程中執…

tornado學習筆記day04-執行順序

響應輸出 -> write 原型 self.write()函數 源碼中是這樣定義的 def write(self, chunk: Union[str, bytes, dict]) -> None:作用 將chunk數據寫到緩沖區 刷新緩沖區的四種方式 程序中斷手動刷新緩沖區滿了遇到\n 當你寫了一個print之后,不是直接就顯示在黑屏中斷…

字符串中文判斷

2019獨角獸企業重金招聘Python工程師標準>>> 1、判斷字符串是否全是中文或含有中文 <?php header(Content-type:text/html; charsetutf-8); $str 你好; if(preg_match(/^[\x{4e00}-\x{9fa5}]$/u, $str)>0){ echo 全是中文; …

angular使用動態組件后屬性值_Angular動態加載組件

引言有時候需要根據URL來渲染不同組件&#xff0c;我所指的是在同一個URL地址中根據參數的變化顯示不同的組件&#xff1b;這是利用Angular動態加載組件完成的&#xff0c;同時也會設法讓這部分動態組件也支持AOT。動態加載組件下面以一個Step組件為示例&#xff0c;完成一個3個…

分治2--取余運算

分治2--取余運算 一、心得 二、題目和分析 題目描述 輸入b&#xff0c;p&#xff0c;k的值&#xff0c;求bp mod k的值。其中b&#xff0c;p&#xff0c;k*k為長整型數。輸入 三個整數&#xff0c;分別為b&#xff0c;p&#xff0c;k的值輸出 bp mod k樣例輸入 2 10 9樣例輸出 …

-mysql-鎖機制分為表級鎖和行級鎖

2019獨角獸企業重金招聘Python工程師標準>>> 聲明&#xff1a;本欄目所使用的素材都是凱哥學堂VIP學員所寫&#xff0c;學員有權匿名&#xff0c;對文章有最終解釋權&#xff1b;凱哥學堂旨在促進VIP學員互相學習的基礎上公開筆記。 mysql鎖機制分為表級鎖和行級鎖 …

tornado學習筆記day05-訪問數據庫

模板## 配置模板路徑 這個在之前我們已經配置好了,可以參考前面的文章 settings {# 就像upfile就沒有,你寫了也白扯template_path: os.path.join(BASE_DIR, "templates"), }渲染并返回給客戶端 使用render()方法 class HomeIndexHandler(RequestHandler):def ge…

pythonelectron桌面開發案例_使用Electron開發基于Node.js的桌面應用

最近小編在查看分享資料時&#xff0c;發現一個可以開發跨平臺桌面應用的框架——NW.js(原名&#xff1a;node-webkit)。正當小編興致勃勃的研究NW.js的時候&#xff0c;最基礎的安裝環節出了問題。無論用npm還是cnpm都無法完整下載所依賴的包(具體原因待考察)。鑒于此&#xf…

x264_param_t結構體參數分析

參考網上的一些資料&#xff0c;結合個人的理解&#xff0c;對x264中x264_param_t結構體作了初步的分析&#xff0c;不保證正確。對x264熟悉的朋友可以在這基礎上修改添加typedef struct x264_param_t{/* CPU 標志位 */unsigned int cpu;int i_threads; /* 并行編…

知識點總結

1、把一個類轉換成一個xml&#xff0c;首先&#xff0c;類名前需要加特性&#xff0c;[DataContract(Namespace "http://CYSoft.Services/AuthorizationObject")]&#xff0c;[XmlRoot("Org")]&#xff0c;里邊的名字為根節點的名字&#xff0c;對各個屬性…

tornado學習筆記day06-應用安全

應用安全 cookie 普通cookie 一般我們的用戶表中都有啥呢 你在購物的時候,加入購物車,讓你登錄,那你登錄之后,他怎么知道你登錄了呢 token 這個值是隨機的,存在cookie里面 設置 原型: 設置cookie 的方法 def set_cookie(self,name: str,value: Union[str, bytes],domai…

托福試卷真題_干貨解答考生疑惑,自考真題考過了還會在出嗎?

重視真題&#xff01;重視真題&#xff01;重視真題&#xff01;重要的話要說三遍。想自考的你們一定要注意&#xff0c;對于歷年真題&#xff0c;從來都是“備考必做”的態度。做自考真題&#xff0c;除了可以讓自己盡快熟悉考試題型和考點外&#xff0c;還有什么好處呢&#…

x264 struct學習 1

x264_t 結構體維護著CODEC的諸多重要信息 其中成員frames是一個指示和控制幀編碼過程的結構。其中current是已經準備就緒可以編碼的幀&#xff0c;其類型已經確定&#xff1b;next是尚未確定類型的幀&#xff1b;unused用于回收不使用的frame結構體以備今后再次使用。 struct …

2016 ACM/ICPC Asia Regional Dalian Online

自己還是太菜&#xff0c;補題離不開題解。。。 但還是留個博客&#xff0c;萬一以后忘了。。。 1001 Different Circle Permutation Polya定理&#xff0c;第一次遇見&#xff0c;學習了一下。不旋轉的時候可以得到 f[i]f[i-1]f[i-2] 斐波那契數列&#xff0c;旋轉后就可以通過…

tornado學習筆記day07-同步與異步

同步 概念 同步就是按部就班的依次執行我們的代碼 進階 但是有些情況我們有一些比較耗時的從操作,比如去別的地方拿點資源,去其他網站請求數據,去訪問數據庫,上傳文件等等,所以這里面優點瑕疵,有小編一一道來 比如這樣 本模塊的功能:<同步異步demo># 這個就相等于一個…

關鍵字: on

關鍵字: on 數據庫在通過連接兩張或多張表來返回記錄時&#xff0c;都會生成一張中間的臨時表&#xff0c;然后再將這張臨時表返回給用戶。 在使用left jion時&#xff0c;on和where條件的區別如下&#xff1a; 1、 on條件是在生成臨時表時使用的條件&#xff0c;它不管on中的條…

天融信安全接入客戶端_天融信提示您警惕物聯網設備Ripple20漏洞風險

近日&#xff0c;天融信阿爾法實驗室在JSOF實驗室發布的由Treck公司開發的TCP/IP軟件庫中獲取到一系列0day漏洞。JSOF實驗室發布的這批漏洞共計19個&#xff0c;被JSOF研究人員稱為"Ripple20"。受此軟件庫影響的產品數量估計超過數億&#xff0c;其中包括智能家居設備…

Service-Oriented Architecture,SOA(轉)

http://blog.csdn.net/WOOSHN/article/details/8036910 介紹&#xff1a; IT體系結構已非常成熟&#xff0c;它是一種成功處理典型IT問題的方法。體系結構中一個受到很大重視且相對較新的分支是面向服務的體系結構(SOA)。SOA經常被吹捧為企業用于解決應用程序靈活性和高維護成本…