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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

H.264中的一些易混淆概念

發(fā)布時(shí)間:2023/12/18 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 H.264中的一些易混淆概念 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Q:PSNR

峰值信噪比

Q:是根據(jù)它來(lái)取qp是不是?

A:不是, 和QP沒(méi)有直接關(guān)系, 但是QP的選擇會(huì)影響到PSNR

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

A: SAD即絕對(duì)誤差和,僅反映殘差時(shí)域差異,影響PSNR值,不能有效反映碼流的大小。SATD即將殘差經(jīng)哈德曼變換的4×4塊的預(yù)測(cè)殘差絕對(duì)值總和,可以 將其看作簡(jiǎn)單的時(shí)頻變換,其值在一定程度上可以反映生成碼流的大小。因此,不用率失真最優(yōu)化時(shí),可將其作為模式選擇的依據(jù)。一般幀內(nèi)要對(duì)所有的模式進(jìn)行檢 測(cè),幀內(nèi)預(yù)測(cè)選用SATD的原因同上。

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

//-----------------------------------------------------------------------------------------?

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

A

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

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

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

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

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

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

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:編解碼是以什么為單位進(jìn)行的?

A:在看編碼解碼的框圖的時(shí)候,如果你以幀為輸入單位來(lái)看,可能你會(huì)看不懂,所以應(yīng)該以宏塊為輸入單位來(lái)看,因?yàn)榫幋a解碼都是以宏塊為單位,逐個(gè)宏塊編解碼,然后組合為一幀圖像的。這樣你就能看明白了。所以個(gè)人認(rèn)為編解碼應(yīng)該是以宏塊為單位進(jìn)行的。

Q:為何在cavlc編碼的時(shí)候,第一個(gè)負(fù)數(shù)要加1?

A:如果拖尾小于3,說(shuō)明第一個(gè)level的絕對(duì)值值肯定大于1。因此,level為正時(shí),減1;為負(fù)時(shí)加1??山档痛a流

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

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

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中,術(shù)語(yǔ)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.

也就是說(shuō),IDR的出現(xiàn)其實(shí)是相當(dāng)于向解碼器發(fā)出了一個(gè)清理reference buffer的信號(hào)吧,上面說(shuō)前于這一幀的所有已編碼幀不能為inter做參考幀了。

Q:CABAC中開(kāi)始時(shí)各字符出現(xiàn)的概率是怎么得到的?

A:基于查表實(shí)現(xiàn)的

Q:我們可以從一幅圖像的自相關(guān)函數(shù)圖中得到不同圖像之間的相似程度.在中點(diǎn)處的最頂點(diǎn)表示圖像未經(jīng)移動(dòng)時(shí)的圖像.當(dāng)空域移動(dòng)拷貝被從原始圖像的任一個(gè)方向移除的時(shí)候,這個(gè)函數(shù)值就會(huì)急驟下降,就這說(shuō)明了一個(gè)圖像采樣值的鄰域內(nèi)是高度相關(guān)的.

我想問(wèn)一下,空域移動(dòng)拷貝被從原始圖像的任一個(gè)方向移除的時(shí)候,這是一個(gè)什么過(guò)程

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

Q:only the central decoder is standardized什么意思

A:意思是說(shuō)264標(biāo)準(zhǔn)只定義了碼流的格式 編碼器實(shí)現(xiàn)是各公司自己的事,只要形成的碼流符合標(biāo)準(zhǔn)就行 解碼器必須按照這個(gè)格式來(lái),這樣任何符合標(biāo)準(zhǔn)的碼流都可以解出來(lái)

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模型用來(lái)干什么?RQ模型又用來(lái)干什么?

A:RDO用來(lái)確定編碼模式的,保證碼率比特?cái)?shù)和圖像失真的最佳權(quán)衡點(diǎn),而RQ是在上一層碼率數(shù)一定的情況下用來(lái)確定下一層分配的比特?cái)?shù)。RQ先于RDO進(jìn)行。

Q:幀,場(chǎng),圖像的聯(lián)系與區(qū)別是什么?

A:在分析標(biāo)準(zhǔn)時(shí)要分清幀(frame)、場(chǎng)(field)、圖像(picture)很關(guān)鍵。

frame;逐行掃描圖像

field:隔行掃描圖像,偶數(shù)行成為頂場(chǎng)行,奇數(shù)行稱為為底場(chǎng)行,所有頂場(chǎng)行稱為頂場(chǎng),同樣所有底場(chǎng)行稱為底場(chǎng)。

pictue:場(chǎng)和幀都可認(rèn)為是圖像

[注:SUPERPUMA語(yǔ)]

頂?shù)讏?chǎng)分別編碼,對(duì)應(yīng)位置的宏塊叫做宏塊對(duì)。頂場(chǎng)對(duì)已編碼的頂/底場(chǎng)預(yù)測(cè)編碼。底場(chǎng)一般對(duì)頂場(chǎng)預(yù)測(cè)編碼

Q:如何在VC下編譯JM

A:編碼步驟:

打開(kāi)tml.dsw,依次選擇project->settings,在settings for那一欄中選中l(wèi)encod,在右邊的debug選項(xiàng)卡做如下填寫(xiě):

Executable for debug session: 和tml.dsw同一文件夾,我填的是/JM/bin/lencod.exe,具體有什么講究我沒(méi)有研究,應(yīng)該沒(méi)很大關(guān)系。

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,在這些之后,就完成了編碼的工作。

解碼步驟:

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

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

Q:關(guān)于H264 ASIC設(shè)計(jì)的難點(diǎn)。

A:

1)怎樣設(shè)計(jì)一個(gè)高效的Memory(SDRAM or DDR)系統(tǒng)是其中最大的挑戰(zhàn)。MC最少的單元是4x4,因?yàn)樵谝恍兄兄挥?個(gè)Pixel,必然會(huì)導(dǎo)致memory miss rate的增加,從而降低memory BW的利用率。也許可以利用圖像的空間相關(guān)性,設(shè)計(jì)一個(gè)類似于CACHE的結(jié)構(gòu)。但CACHE的大小是一個(gè)值得探討的問(wèn)題。

2)怎樣用相同的硬件結(jié)構(gòu)來(lái)實(shí)現(xiàn)幀內(nèi)預(yù)測(cè)和幀間預(yù)測(cè)。

3)怎樣用一套硬件結(jié)構(gòu)來(lái)同時(shí)實(shí)現(xiàn)mpeg2/4,WMV.因?yàn)楹诵牡乃惴?#xff0c;例如DCT都不一樣。

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

5)可以最多允許多少個(gè)reference Frame的問(wèn)題。這對(duì)整個(gè)硬件構(gòu)架沒(méi)有任何影響。但直接影響成本,也就是片外要用多少M(fèi) memory的問(wèn)題。

A: IDR幀與I幀的區(qū)別Q:因?yàn)?64采用了多幀預(yù)測(cè),就有可能在display order下I幀后的P會(huì)參考I幀前的幀,這樣在random access時(shí)如果只找I幀,隨后的幀的參考幀可能unavailable,IDR就是這樣一種特殊的I幀,把它定義為確保后面的P一定不參考其前面的 幀,可以放心地random access。

Q:對(duì)于幀間編碼,在一個(gè)宏塊內(nèi),可以同時(shí)存在的模式?

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

Q:幀間預(yù)測(cè)時(shí),MV,MVp,MVD分別是什么?

A:me得到的是mv ,預(yù)測(cè)得到的是mvp ,差值是mvd

MV:運(yùn)動(dòng)向量,參考幀中相對(duì)于當(dāng)前幀的偏移

MVp:參考運(yùn)動(dòng)向量

MVD:兩個(gè)向量間的差別

Q: I幀和P幀的概念比較好懂,B幀的概念有些模糊,只知道加了B幀圖像質(zhì)量會(huì)更好,請(qǐng)問(wèn)對(duì)B幀該怎么理解?

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

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

Golomb 用于運(yùn)動(dòng)矢量,模式類型,頭信息等編碼

CAVLC用于殘差編碼

CABAC都可以

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

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

UDP只是為了傳輸數(shù)據(jù),udp的包可以加上rtp的頭,成為一個(gè)rtp的數(shù)據(jù)包

rtp3984 拆分3種包:

單一NALU包

聚合包

分割包

經(jīng)過(guò)測(cè)試發(fā)現(xiàn),無(wú)線網(wǎng)絡(luò)下,一包大小不能超過(guò)1400,只能傳QCIF,QP35

Q:相對(duì)PAFF,MBAFF的作用大不大?

A:有優(yōu)勢(shì),但不明顯。只有當(dāng)圖像運(yùn)動(dòng)劇烈的時(shí)候,優(yōu)勢(shì)才會(huì)比較明顯。

Q:

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

A:

f是一個(gè)修正參數(shù),對(duì)于幀內(nèi)編碼宏塊f=(2^qbits)/3,對(duì)于幀間編碼宏塊f=(2^qbits)/6。

Q:

整數(shù)DCT變換之后,為什么還要對(duì)直流分量進(jìn)行哈達(dá)瑪變換??有什么意義?

A:

因?yàn)樵趲瑑?nèi)編碼宏塊中大多數(shù)的能量都集中在直流系數(shù)上,這種變換有利于進(jìn)一步壓縮4×4的亮度直流信號(hào)的相關(guān)性。

Q:white paper中給出幀內(nèi)預(yù)測(cè)9種模式,vertical和horizontal容易理解,不知其他模式是依據(jù)怎樣的算法來(lái)進(jìn)行預(yù)測(cè)的。

A:標(biāo)準(zhǔn)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,>>為無(wú)符號(hào)數(shù)右移操作。

Q:關(guān)于對(duì)除開(kāi)拖尾系數(shù)以外的非零系數(shù)Level編碼

A:

level的編碼和AVS一樣,查6個(gè)表,表也和AVS的一樣

JM有算法,可以參看

writeSyntaxElement_Level_VLCN

函數(shù)。.

這個(gè)算法就是生成6個(gè)表的算法。

Q:h264在網(wǎng)絡(luò)上以u(píng)dp方式傳輸問(wèn)題

在mpeg4標(biāo)準(zhǔn)中,都是通過(guò)rtp協(xié)議把視頻幀分成一個(gè)個(gè)的包加上rtp頭再發(fā)送,在h264中,是由nal直接分片成包的還是要通過(guò)rtp分呢?要不要加rtp頭

Q:FMO的優(yōu)處和劣處?

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

優(yōu)處是增強(qiáng)了抗誤碼性能。

Q:block的類型包括幾種?

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

block的類型包括1、亮度的4*4直流系數(shù)組成的塊;2、色度的2*2的直流系數(shù)組成的 塊;3、其它類型的塊(包括亮度的4*4交流系數(shù)組成的塊(在DC系數(shù)的位置設(shè)為0);色度的4*4交流系數(shù)組成的塊(在DC系數(shù)的位置設(shè)為0);采用 4*4幀內(nèi)編碼模式的4*4塊;運(yùn)動(dòng)補(bǔ)償?shù)?*4的幀間預(yù)測(cè)塊)

其中亮度4*4DC系數(shù)組成塊和色度2*2的直流系數(shù)組成的塊僅僅在16*16的幀內(nèi)預(yù)測(cè)模式下會(huì)出現(xiàn)。

Q:在進(jìn)行運(yùn)動(dòng)估計(jì)和運(yùn)動(dòng)補(bǔ)償時(shí),所用的塊匹配快速算法有哪些?匹配準(zhǔn)則又有哪幾種?

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

Q:jm各個(gè)版本之間的代碼做了些什么改動(dòng),有沒(méi)有說(shuō)明這些的文檔啊?

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

補(bǔ)充:為何已經(jīng)有了 JM 10.2,大家仍偏好用 8.6 呢 ?

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

Q: PicAFF和MbAFF的區(qū)別是什么?

A: PicAFF和MBAFF是決定壓縮場(chǎng)的兩種方式,PicAff(picture adaptive field frame)是在圖像層來(lái)說(shuō)的,此時(shí)幀被分成兩個(gè)場(chǎng),并且這兩個(gè)場(chǎng)單獨(dú)壓縮,這兩個(gè)場(chǎng)在分別分成16*16的宏塊,然后對(duì)宏塊進(jìn)行編碼,編碼的時(shí)候?qū)?chǎng)中 的宏塊單獨(dú)編碼,在某個(gè)場(chǎng)編碼完后,才會(huì)編另一個(gè)場(chǎng)的碼。

而MBAFF(MicroBlock Adaptive Filed/Frame)是在宏塊層(16*32)上進(jìn)行編碼,它將該宏塊層即可以按單獨(dú)的場(chǎng),也可以將兩個(gè)場(chǎng)合并成一個(gè)進(jìn)行編碼,在分成兩個(gè)單獨(dú)的宏塊 (16*16)編碼的時(shí)候,是先編碼一個(gè)場(chǎng)的宏塊,再編碼另一個(gè)場(chǎng)的宏塊,這和PicAFF的區(qū)別就是對(duì)于整個(gè)圖像來(lái)說(shuō)各個(gè)場(chǎng)的宏塊還是交叉編碼的;在合 并成單獨(dú)的一個(gè)宏塊編碼時(shí),在一個(gè)宏塊(16*16)內(nèi),即包括奇數(shù)場(chǎng)的元素,也包括偶數(shù)場(chǎng)的元素,即宏塊對(duì),同時(shí)同一幅圖像值(就算是上一場(chǎng))也不能做 參考。

Q:用h264設(shè)計(jì)的解碼器是不是可以解任意編碼器編的碼?是根據(jù)檔次設(shè)計(jì)解碼器嗎?

A:不可以解任意編碼器編的碼。也不是根據(jù)檔次來(lái)設(shè)計(jì)編解碼器。要根據(jù)具體的情況。

如果是按照H.264的標(biāo)準(zhǔn)來(lái)設(shè)計(jì)編解碼器,便是通用的;若編解碼器的設(shè)計(jì)有自己的特點(diǎn),便不能成為通用的編解碼器。

Q:在VC環(huán)境下是如何讀入*.yuv序列的?

A:把*.yuv文件當(dāng)作一般的文件讀就可以了。

如下:

#include <stdio.h>

#include <malloc.h>

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的區(qū)別

A:SODB:最原始的編碼數(shù)據(jù),沒(méi)有任何附加數(shù)據(jù)

RBSP:在SODB的基礎(chǔ)上加了rbsp_stop_ont_bit(bit 值為1),并用0按字節(jié)補(bǔ)位對(duì)齊,字節(jié)對(duì)齊后,后面還有可能存在若干組16bits的0x0000(參考標(biāo)準(zhǔn)中的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的基礎(chǔ)上增加了防止偽起始碼字節(jié)(0X03)

Q:碼流的讀取位置

A:當(dāng)數(shù)據(jù)流存儲(chǔ)在介質(zhì)上時(shí),此時(shí)讀取用GetAnnexbNALU (nalu);

否則,數(shù)據(jù)流應(yīng)該來(lái)自分組交換網(wǎng)絡(luò),此時(shí)讀取用GetRTPNALU (nalu)

二者的區(qū)別:

碼流格式為Byte stream format時(shí),調(diào)用函數(shù)GetAnnexbNALU(nalu);此時(shí)碼流中包含起始碼前綴(start_code_prefix_one_3bytes),3 個(gè)字節(jié),值為0x00 00 01。并可能包含連續(xù)若干字節(jié)的0(leading_zero_8bit),拖尾字節(jié)0。起始碼前綴是為了表明碼流的開(kāi)始,與AVS相似。因?yàn)榭赡艽嬖谔?充bit 0,所以也可能包含有l(wèi)eading_zero_8bit,即起始碼前綴的表現(xiàn)形式可能是0x00 00 00 01或其他值。但這些值必須包含0x00 00 01。對(duì)原始碼流提取后,這些值均被丟棄。

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

A:MBAFF的問(wèn)題

Q:幀模式下的MBAFF,每個(gè)宏塊對(duì)由本幀的宏塊組成。

場(chǎng)模式下的MBAFF,把兩場(chǎng)組成一幀后,在按照幀的方式來(lái)組成宏塊對(duì)。實(shí)際上是每個(gè)宏塊對(duì)由頂場(chǎng)的一個(gè)宏塊和底場(chǎng)的一個(gè)宏塊組成。

Q;CAVLC,Exp-Golomb的區(qū)別

A:Exp-Golomb的前綴和后綴根據(jù)階數(shù)K的不同,可能是對(duì)稱,后綴比前綴的長(zhǎng)度多1等情況。

負(fù)數(shù)的情況下,通過(guò)公式(–1)k+1 Ceil( k÷2 ),把解析出來(lái)的哥倫布碼值還原為原始的語(yǔ)法元素值;正數(shù)也有相應(yīng)的對(duì)應(yīng)方法。

CAVLC的前綴和后綴可能對(duì)稱,也可能不對(duì)稱,(大多數(shù)情況下都是不對(duì)稱的)而且后綴還可以不存在,后綴的長(zhǎng)度也是根據(jù)上下文環(huán)境來(lái)判斷的,后綴的取值是根據(jù)編碼表查詢的,

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

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

Q:CAVLC的過(guò)程

A:

編碼

4×4的殘差塊通過(guò)Zig-Zag掃描,得到一系列字符,如:0,3,0,1,-1,-1,0,1,0......

由此序列推導(dǎo)出以下變量:TotalCoeffs(全部的非零系數(shù),包括拖尾系 數(shù)),TotalZeros(最后一個(gè)非零系數(shù)前面的所有0的個(gè)數(shù),方向?yàn)閺淖蟮接?#xff0c;比如上面的序列中,最后一個(gè)非零系數(shù)為 1),TrailingOnes(托尾系數(shù)的個(gè)數(shù),并規(guī)定不能超過(guò)3個(gè)),然后通過(guò)NC值查表,把TotalCoeffs ,和TrailingOnes的組合進(jìn)行編碼,稱為編碼元素coeff_token。接下來(lái),對(duì)每個(gè)拖尾系數(shù)的符合編碼,0表示+,1表示負(fù)。再接下來(lái), 對(duì)剩下的非零系數(shù)編碼(此時(shí)拖尾系數(shù)已經(jīng)被編碼了,不再包括),編碼方向?yàn)閺挠业阶?#xff0c;比如上面的序列中,先編碼1,再編碼3。這些系數(shù)被編碼后,是由 level_prefix和level_suffix兩部分組成的。level_prefix的值通過(guò)查表得出,level_suffix是由若干個(gè)0組 成,0的個(gè)數(shù)由suffixLength決定。再接著對(duì)TotalZeros的值編碼。然后對(duì)RunBefore(每個(gè)非零系數(shù)前零的個(gè)數(shù))進(jìn)行編碼,這 個(gè)方向也是從右到左,并且最后一個(gè)(從左邊數(shù)的第一個(gè))非零系數(shù)前零的個(gè)數(shù)不需要編碼,因?yàn)楹竺娴木庍^(guò)后,剩下多少個(gè)0只有一個(gè)存放位置,就是最前面。

解碼

由計(jì)算出的bit串長(zhǎng)度讀出相應(yīng)的bits,通過(guò)查表得到TotalCoeffs和 TrailingOnes的值,此時(shí)無(wú)輸出,接著讀取拖尾系數(shù)的符合,由編碼的順序知,先讀到的是最后一個(gè)拖尾系數(shù)。解碼完拖尾系數(shù)并依次輸出,接下來(lái)是 剩下的非零系數(shù)的值,通過(guò)查表解碼并輸出。然后解碼TotalZeros,此時(shí)輸出不變,仍為以前的解碼值。接下來(lái)解碼RunBefore,因?yàn)榫幋a時(shí)是 從右往左編的,故第一個(gè)解碼出來(lái)的RunBefore應(yīng)該插到第一個(gè)解碼出的拖尾系數(shù)的前面,即插入的方向也是從右到左,最后一步時(shí),剩下的 RunBefore都插入到最前面。

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

y = yO + ( mbAddr % 2 ) (場(chǎng))

A:這是計(jì)算像素坐標(biāo)的計(jì)算公式,MBADDR時(shí)是以宏塊對(duì)出現(xiàn)的,MBADDR是宏塊對(duì)的號(hào)碼,所以場(chǎng)模式下是不要乘16的,TOP FIELD和BOTTON FIELD的像素是獨(dú)立計(jì)算的。表達(dá)可能不大準(zhǔn)確,也可能有誤,希望各位指點(diǎn)。

Q:為什么要在計(jì)算楨內(nèi)DC預(yù)測(cè)模式時(shí)要+2,+4?

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

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

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

這樣誤差就會(huì)大些

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

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

這樣保證了精確性~~~

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

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

|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位置的系數(shù)需要乘aa,p11、p13、 p31、p33的系數(shù)需要乘bb/4,其余的系數(shù)需要乘ab/2,這里a = 0.5,b = sqrt(0.4),c = 0.5。然而整數(shù)變換中的乘法運(yùn)算可以與量化過(guò)程的除法運(yùn)算糅合起來(lái),這樣就產(chǎn)生了你所提到的quant_coef[6][4][4]。第一個(gè)分量取6, 是因?yàn)榱炕A每隔6就增加一倍,因此只需要記錄下量化階為0-5時(shí)的各個(gè)系數(shù)的大小,而后兩個(gè)分量取4則是為了與整數(shù)變換的大小相匹配

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

這個(gè)變量是干什么用的啊?

A:這個(gè)變量用來(lái)存儲(chǔ)解碼并且逆量化之后的系數(shù),其中cof[4][6]的內(nèi)容如下:

|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作為運(yùn)動(dòng)估計(jì)的參考picture.

//------------------------------------------------------------------------------------------------------

PartitionMotionSearch函數(shù)里面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]是子塊的坐標(biāo) 。0模式就是指skip或direct模式

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

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

常用的測(cè)試序列選擇:

Coastguard :為物體的相對(duì)運(yùn)動(dòng)和鏡頭移動(dòng)

flower :為物體的劇烈運(yùn)動(dòng)和鏡頭的快速移動(dòng)

garphone :為物體的快速轉(zhuǎn)換

foreman :為物體轉(zhuǎn)換和鏡頭移動(dòng)

mobile&calendar :為物體的多種運(yùn)動(dòng)和鏡頭移動(dòng)

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

Q:為什么幀內(nèi)預(yù)測(cè)要用未濾波的圖像而不是濾波后的圖像呢?

A:幀內(nèi)預(yù)測(cè)只能用濾波前的值,因?yàn)閹瑑?nèi)預(yù)測(cè)的時(shí)候邊界濾波還不能進(jìn)行,幀內(nèi)預(yù)測(cè)所需要的象 素點(diǎn)的邊界的濾波不能進(jìn)行,因?yàn)樾枰鹊疆?dāng)前宏塊解完后才開(kāi)始,但是你現(xiàn)在就在解當(dāng)前宏塊,所以為了避免預(yù)測(cè)和濾波的耦合 應(yīng)該分開(kāi)來(lái)單獨(dú)做,prediction的時(shí)候保存一個(gè)line buffer就解決問(wèn)題了

----這樣的解釋對(duì)嗎?

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

X264_ANALYSE_I4x4|X264_ANALYSE_I8x8;

為什么這么做啊?

A:幀間要遍歷所有模塊,可以去掉一下選項(xiàng),就是說(shuō),你可以不搜索一些模式,他默認(rèn)是都要搜索的,比如你編碼P幀的時(shí)候,不想搜索的那么精細(xì),可以去掉ANALYSE_PSUB8x8

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

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 )函數(shù)中:

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];

}

第二個(gè)式子為什么*16?

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

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

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

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

A:為0才對(duì),因?yàn)楸緛?lái)定義[4][4],現(xiàn)在要線性訪問(wèn)16個(gè)成員,就必須[0]了

?

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

Q:關(guān)于skip模式的問(wèn)題

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 就是說(shuō)只計(jì)算參考楨中的mv,傳輸?shù)氖?數(shù)據(jù),直接把參考中的匹配宏塊拿過(guò)來(lái)就行了,skip模式只傳送mb_type,其他信息都是從參考楨中獲取,在 解碼端計(jì)算MV及恢復(fù)殘差數(shù)據(jù),MV不是從參考幀獲得的,是在解碼端計(jì)算,mv是根據(jù)周?chē)南噜弶K的mv進(jìn)行計(jì)算,好像是取中間值,有點(diǎn)像MV在運(yùn)動(dòng)估計(jì) 時(shí)候的預(yù)測(cè),是只傳送mb_type,其他信息都可以計(jì)算出來(lái) ,這就是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

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

?

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

NumberBFrames,就是兩個(gè)編碼幀中間B幀的數(shù)目,該數(shù)必須小于FrameSkip

FramesToBeEncoded,總共要編碼的幀數(shù),不包括B幀.因?yàn)樵诰幋a過(guò)程中 b幀對(duì)其他幀并不產(chǎn)生影響,而且在實(shí)時(shí)編碼中,如果負(fù)擔(dān)過(guò)重;或帶寬有限,可以有選擇的丟棄b幀

IntraPeriod,每IntraPeriod幀(I/P幀)有一個(gè)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...

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

h264標(biāo)準(zhǔn)里為什么有PAFF和MBAFF兩種編碼模式,都是出于編碼效率的考慮嗎?

還是PAFF編碼還考慮了逐行隔行顯示的問(wèn)題

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

P_Skip的特別之處在于碼流中不傳輸MVD數(shù)據(jù),預(yù)測(cè)塊的大小肯定史16*16。當(dāng)下面四個(gè)條件滿足任意一個(gè)時(shí),當(dāng)前宏塊的MV預(yù)測(cè)值直接置為(0,0),不滿足時(shí)當(dāng)作普通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

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

?

#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); /

}

這種宏定義無(wú)論是在t264,x264或是jm代碼中都比較常見(jiàn)

使用這樣的宏定義后,函數(shù)名字可以根據(jù)宏定義進(jìn)行改變,也就是說(shuō),函數(shù)名也有宏定義。

相鄰兩個(gè)##之間的內(nèi)容用調(diào)用時(shí)的()內(nèi)的相應(yīng)的內(nèi)容進(jìn)行代替,例如:

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

這樣實(shí)際調(diào)用函數(shù)就為T(mén)264_sad_u_16x16(.........)了

總結(jié)

以上是生活随笔為你收集整理的H.264中的一些易混淆概念的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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