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:在看編碼解碼的框圖的時候,如果你以幀為輸入單位來看,可能你會看不懂,所以應(yīng)該以宏塊為輸入單位來看,因為編碼解碼都是以宏塊為單位,逐個宏塊編解碼,然后組合為一幀圖像的。這樣你就能看明白了。所以個人認為編解碼應(yīng)該是以宏塊為單位進行的。
Q:為何在cavlc編碼的時候,第一個負數(shù)要加1?
A:如果拖尾小于3,說明第一個level的絕對值值肯定大于1。因此,level為正時,減1;為負時加1??山档痛a流
Q: YCrCb 4:2:0是什么?像4:4:4和4:2:2一樣表示 Y:Cr:Cb是4:2:0嗎?
A: 不要讓它騙了,我覺得它所表達意思應(yīng)該是4:1:1,還有如果你看得是像http://www.cs.sfu.ca/CC/365/li/material/notes/Chap3/Chap3.4/Chap3.4.html 里面這樣的對4:2:0的說明的爛圖的話,可能看半天也不明白,建議看 <Video Codec Design>里面相應(yīng)的圖。里面的說明也很詳細:
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ù)語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的出現(xiàn)其實是相當(dāng)于向解碼器發(fā)出了一個清理reference buffer的信號吧,上面說前于這一幀的所有已編碼幀不能為inter做參考幀了。
Q:CABAC中開始時各字符出現(xiàn)的概率是怎么得到的?
A:基于查表實現(xiàn)的
Q:我們可以從一幅圖像的自相關(guān)函數(shù)圖中得到不同圖像之間的相似程度.在中點處的最頂點表示圖像未經(jīng)移動時的圖像.當(dāng)空域移動拷貝被從原始圖像的任一個方向移除的時候,這個函數(shù)值就會急驟下降,就這說明了一個圖像采樣值的鄰域內(nèi)是高度相關(guān)的.
我想問一下,空域移動拷貝被從原始圖像的任一個方向移除的時候,這是一個什么過程
A:空域移動就表示平移,求自相關(guān)函數(shù)就包含平移這個過程.你看一維的 R(t,delta)=E[X(t)*X(t+delta)] ,二維不過平移多個方向而已
A:only the central decoder is standardized什么意思Q:意思是說264標(biāo)準只定義了碼流的格式? 編碼器實現(xiàn)是各公司自己的事,只要形成的碼流符合標(biāo)準就行? 解碼器必須按照這個格式來,這樣任何符合標(biāo)準的碼流都可以解出來
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:如果不用率失真最優(yōu)化, 為什么選擇SATD+delta×r(mv,mode)作為模式選擇的依據(jù)?為什么運動估計中,整象素搜索用SAD,而亞象素用SATD?為什么幀內(nèi)模式選擇要用SATD?
A:
?? SAD即絕對誤差和,僅反映殘差時域差異,影響PSNR值,不能有效反映碼流的大小。SATD即將殘差經(jīng)哈德曼變換的4×4塊的預(yù)測殘差絕對值總和,可以將其看作簡單的時頻變換,其值在一定程度上可以反映生成碼流的大小。因此,不用率失真最優(yōu)化時,可將其作為模式選擇的依據(jù)。
?? 一般幀內(nèi)要對所有的模式進行檢測,幀內(nèi)預(yù)測選用SATD的原因同上。
?? 在做運動估計時,一般而言,離最優(yōu)匹配點越遠,匹配誤差值SAD越大,這就是有名的單一平面假設(shè),現(xiàn)有的運動估計快速算法大都利用該特性。但是,轉(zhuǎn)換后SATD值并不滿足該條件,如果在整象素中運用SATD搜索,容易陷入局部最優(yōu)點。而在亞象素中,待搜索點不多,各點處的SAD差異相對不大,可以用SATD選擇碼流較少的匹配位置。
Q:RDO模型用來干什么?RQ模型又用來干什么?
A:RDO用來確定編碼模式的,保證碼率比特數(shù)和圖像失真的最佳權(quán)衡點,而RQ是在上一層碼率數(shù)一定的情況下用來確定下一層分配的比特數(shù)。RQ先于RDO進行。
Q:幀,場,圖像的聯(lián)系與區(qū)別是什么?
A:在分析標(biāo)準時要分清幀(frame)、場(field)、圖像(picture)很關(guān)鍵。
frame;逐行掃描圖像
field:隔行掃描圖像,偶數(shù)行成為頂場行,奇數(shù)行稱為為底場行,所有頂場行稱為頂場,同樣所有底場行稱為底場。
pictue:場和幀都可認為是圖像
[注:SUPERPUMA語]
頂?shù)讏龇謩e編碼,對應(yīng)位置的宏塊叫做宏塊對。頂場對已編碼的頂/底場預(yù)測編碼。底場一般對頂場預(yù)測編碼
Q:如何在VC下編譯JM
A:編碼步驟:
打開tml.dsw,依次選擇project->settings,在settings for那一欄中選中l(wèi)encod,在右邊的debug選項卡做如下填寫:
Executable for debug session: 和tml.dsw同一文件夾,我填的是/JM/bin/lencod.exe,具體有什么講究我沒有研究,應(yīng)該沒很大關(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填的路徑和編碼時應(yīng)一樣,Program arguments填decoder.cfg,build->set active configurations中選擇ldecod-Win32 debug,其他不變。之后compile、build、execute,解碼完成!
還有一點需要注意:編碼的yuv圖像要放在bin文件夾中!
Q:關(guān)于H264 ASIC設(shè)計的難點。
A:
? 1)怎樣設(shè)計一個高效的Memory(SDRAM or DDR)系統(tǒng)是其中最大的挑戰(zhàn)。MC最少的單元是4x4,因為在一行中只有4個Pixel,必然會導(dǎo)致memory miss rate的增加,從而降低memory BW的利用率。也許可以利用圖像的空間相關(guān)性,設(shè)計一個類似于CACHE的結(jié)構(gòu)。但CACHE的大小是一個值得探討的問題。
? 2)怎樣用相同的硬件結(jié)構(gòu)來實現(xiàn)幀內(nèi)預(yù)測和幀間預(yù)測。
? 3)怎樣用一套硬件結(jié)構(gòu)來同時實現(xiàn)mpeg2/4,WMV.因為核心的算法,例如DCT都不一樣。
? 4)怎樣降低熵解碼的復(fù)雜度。
? 5)可以最多允許多少個reference Frame的問題。這對整個硬件構(gòu)架沒有任何影響。但直接影響成本,也就是片外要用多少M memory的問題。
A:? IDR幀與I幀的區(qū)別Q:因為264采用了多幀預(yù)測,就有可能在display order下I幀后的P會參考I幀前的幀,這樣在random access時如果只找I幀,隨后的幀的參考幀可能unavailable,IDR就是這樣一種特殊
的I幀,把它定義為確保后面的P一定不參考其前面的幀,可以放心地random access。
Q:對于幀間編碼,在一個宏塊內(nèi),可以同時存在的模式?
A:在同一宏塊內(nèi),如果用模式16*8,那么宏塊分為兩塊,均為16*8;8*16類似.如果用p8*8模式,對于8*4和4*8把一個8*8塊分為兩個塊,對于4*4則分為4個.
Q:
幀間預(yù)測時,MV,MVp,MVD分別是什么?
A:
me得到的是mv
預(yù)測得到的是mvp
差值是mvd
MV:運動向量,參考幀中相對于當(dāng)前幀的偏移
MVp:參考運動向量
MVD:兩個向量間的差別
Q: I幀和P幀的概念比較好懂,B幀的概念有些模糊,只知道加了B幀圖像質(zhì)量會更好,請問對B幀該怎么理解?
A: B 幀在 MPEG-4 中有四種參考模式,如果是同時參考前后的畫面壓縮,則記錄的是 和 (前畫面 pixel 值 + 后畫面 pixel 值)/2 的差值,也就是 和 「前后畫面的平均」的差值。所以記錄的差值個數(shù)和 P 幀一樣,只有一個,沒有增加。而因為 B 幀位于前后畫面的中間,以「前后畫面的平均」,也就是「前后畫面的中間值」來作為預(yù)測數(shù)值(預(yù)測 B 幀的 pixel 數(shù)值為多少?如果有誤差,再記錄差值),這樣這個預(yù)測數(shù)值會比單獨使用前一個畫面來預(yù)測,更接近目前真正的 B 幀的數(shù)值,可想而知,如此所需要記錄的差值就會很小甚至可以根本不用記錄,所以便可以省下很多的 bits,提高壓縮率。
除了壓縮率以外,B 幀對畫質(zhì)的影響也是有的,因為 B 幀這種參考前后畫面的特性,等于有內(nèi)插(interpolation)的效果,所以可以減少噪訊。
Golomb 用于運動矢量,模式類型,頭信息等編碼
CAVLC用于殘差編碼
CABAC都可以
Q:rdp(user data packet protocol) 和 (rtp)real-time transport protocol有什么區(qū)別?
A:RTP是為了實時傳輸而在源數(shù)據(jù)上加了一些時間控制信息
UDP只是為了傳輸數(shù)據(jù),udp的包可以加上rtp的頭,成為一個rtp的數(shù)據(jù)包
rtp3984 拆分3種包:
單一NALU包
聚合包
分割包
經(jīng)過測試發(fā)現(xiàn),無線網(wǎng)絡(luò)下,一包大小不能超過1400,只能傳QCIF,QP35
Q:相對PAFF,MBAFF的作用大不大?
A:有優(yōu)勢,但不明顯。只有當(dāng)圖像運動劇烈的時候,優(yōu)勢才會比較明顯。
Q:
變換量化公式: |Zij|=(|Wij|.MF+f)>>qbits? 中的f是什么?
A:
f是一個修正參數(shù),對于幀內(nèi)編碼宏塊f=(2^qbits)/3,對于幀間編碼宏塊f=(2^qbits)/6。
Q:
整數(shù)DCT變換之后,為什么還要對直流分量進行哈達瑪變換??有什么意義?
A:
因為在幀內(nèi)編碼宏塊中大多數(shù)的能量都集中在直流系數(shù)上,這種變換有利于進一步壓縮4×4的亮度直流信號的相關(guān)性。
Q:white paper中給出幀內(nèi)預(yù)測9種模式,vertical和horizontal容易理解,不知其他模式是依據(jù)怎樣的算法來進行預(yù)測的。
A:標(biāo)準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,>>為無符號數(shù)右移操作。
Q:關(guān)于對除開拖尾系數(shù)以外的非零系數(shù)Level編碼
A:
level的編碼和AVS一樣,查6個表,表也和AVS的一樣
JM有算法,可以參看
writeSyntaxElement_Level_VLCN
函數(shù)。.
這個算法就是生成6個表的算法。
Q:h264在網(wǎng)絡(luò)上以udp方式傳輸問題
在mpeg4標(biāo)準中,都是通過rtp協(xié)議把視頻幀分成一個個的包加上rtp頭再發(fā)送,在h264中,是由nal直接分片成包的還是要通過rtp分呢?要不要加rtp頭
Q:FMO的優(yōu)處和劣處?
A:劣處是FMO模式打亂了原宏塊順序,降低了編碼效率,增加了時延;
優(yōu)處是增強了抗誤碼性能。
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塊;運動補償?shù)?*4的幀間預(yù)測塊)
其中亮度4*4DC系數(shù)組成塊和色度2*2的直流系數(shù)組成的塊僅僅在16*16的幀內(nèi)預(yù)測模式下會出現(xiàn)。
Q:在進行運動估計和運動補償時,所用的塊匹配快速算法有哪些?匹配準則又有哪幾種?
A:塊匹配快速算法有:正交搜索算法(OSA)、交叉搜索算法(CSA)、共軛方向搜索(CDS)、三步搜索(TSS)、二維對數(shù)(TDL)和全搜索(FS)、鉆石算法等等。匹配準則一般有:歸一化互相關(guān)函數(shù)(NCCF)、均方誤差(MSE)、絕對誤差和(SAD)等等。SAD最常用。
Q:jm各個版本之間的代碼做了些什么改動,有沒有說明這些的文檔啊?
A:每個版本源代碼的根目錄下都有一個 change.txt 文件,里面詳細記錄了所有版本的更新。
補充:為何已經(jīng)有了 JM 10.2,大家仍偏好用 8.6 呢 ?
風(fēng)輕回答:針對對象不同,jm90以上全部是針對高保真的視頻的。86基本上可以滿足一般處理的所有要求。
Q: PicAFF和MbAFF的區(qū)別是什么?
A: PicAFF和MBAFF是決定壓縮場的兩種方式,PicAff(picture adaptive field frame)是在圖像層來說的,此時幀被分成兩個場,并且這兩個場單獨壓縮,這兩個場在分別分成16*16的宏塊,然后對宏塊進行編碼,編碼的時候?qū)鲋械暮陦K單獨編碼,在某個場編碼完后,才會編另一個場的碼。
而MBAFF(MicroBlock Adaptive Filed/Frame)是在宏塊層(16*32)上進行編碼,它將該宏塊層即可以按單獨的場,也可以將兩個場合并成一個進行編碼,在分成兩個單獨的宏塊(16*16)編碼的時候,是先編碼一個場的宏塊,再編碼另一個場的宏塊,這和PicAFF的區(qū)別就是對于整個圖像來說各個場的宏塊還是交叉編碼的;在合并成單獨的一個宏塊編碼時,在一個宏塊(16*16)內(nèi),即包括奇數(shù)場的元素,也包括偶數(shù)場的元素,即宏塊對,同時同一幅圖像值(就算是上一場)也不能做參考。
Q:用h264設(shè)計的解碼器是不是可以解任意編碼器編的碼?是根據(jù)檔次設(shè)計解碼器嗎?
A:不可以解任意編碼器編的碼。也不是根據(jù)檔次來設(shè)計編解碼器。要根據(jù)具體的情況。
如果是按照H.264的標(biāo)準來設(shè)計編解碼器,便是通用的;若編解碼器的設(shè)計有自己的特點,便不能成為通用的編解碼器。
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ù),沒有任何附加數(shù)據(jù)
RBSP:在SODB的基礎(chǔ)上加了rbsp_stop_ont_bit(bit 值為1),并用0按字節(jié)補位對齊,字節(jié)對齊后,后面還有可能存在若干組16bits的0x0000(參考標(biāo)準中的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ù)流存儲在介質(zhì)上時,此時讀取用GetAnnexbNALU (nalu);
否則,數(shù)據(jù)流應(yīng)該來自分組交換網(wǎng)絡(luò),此時讀取用GetRTPNALU (nalu)
二者的區(qū)別:
碼流格式為Byte stream format時,調(diào)用函數(shù)GetAnnexbNALU(nalu);此時碼流中包含起始碼前綴(start_code_prefix_one_3bytes),3個字節(jié),值為0x00 00 01。并可能包含連續(xù)若干字節(jié)的0(leading_zero_8bit),拖尾字節(jié)0。起始碼前綴是為了表明碼流的開始,與AVS相似。因為可能存在填充bit 0,所以也可能包含有l(wèi)eading_zero_8bit,即起始碼前綴的表現(xiàn)形式可能是0x00 00 00 01或其他值。但這些值必須包含0x00 00 01。對原始碼流提取后,這些值均被丟棄。
如果碼流是按RTP協(xié)議傳輸,則調(diào)用GetRTPNALU(nalu)。并對RTP包進行拆封。在H.264中,對RTP包頭的各段的值進行了限制,這些被限制的值必須滿足條件,否則認為出錯。
A:MBAFF的問題
Q:幀模式下的MBAFF,每個宏塊對由本幀的宏塊組成。
場模式下的MBAFF,把兩場組成一幀后,在按照幀的方式來組成宏塊對。實際上是每個宏塊對由頂場的一個宏塊和底場的一個宏塊組成。
Q;CAVLC,Exp-Golomb的區(qū)別
A:Exp-Golomb的前綴和后綴根據(jù)階數(shù)K的不同,可能是對稱,后綴比前綴的長度多1等情況。
負數(shù)的情況下,通過公式(–1)k+1 Ceil( k÷2 ),把解析出來的哥倫布碼值還原為原始的語法元素值;正數(shù)也有相應(yīng)的對應(yīng)方法。
CAVLC的前綴和后綴可能對稱,也可能不對稱,(大多數(shù)情況下都是不對稱的)而且后綴還可以不存在,后綴的長度也是根據(jù)上下文環(huán)境來判斷的,后綴的取值是根據(jù)編碼表查詢的,
對于正數(shù),編碼后的后綴部分的最后1 bit一定是0(若存在后綴);對于負數(shù),其一定是1(若存在后綴)。
CAVLC與Exp-Golomb的前綴的表現(xiàn)形式都是1,01,001,0001......
Q:CAVLC的過程
A:
編碼
4×4的殘差塊通過Zig-Zag掃描,得到一系列字符,如:0,3,0,1,-1,-1,0,1,0......
由此序列推導(dǎo)出以下變量:TotalCoeffs(全部的非零系數(shù),包括拖尾系數(shù)),TotalZeros(最后一個非零系數(shù)前面的所有0的個數(shù),方向為從左到右,比如上面的序列中,最后一個非零系數(shù)為1),TrailingOnes(托尾系數(shù)的個數(shù),并規(guī)定不能超過3個),然后通過NC值查表,把
TotalCoeffs ,和TrailingOnes的組合進行編碼,稱為編碼元素coeff_token。接下來,對每個拖尾系數(shù)的符合編碼,0表示+,1表示負。再接下來,對剩下的非零系數(shù)編碼(此時拖尾系數(shù)已經(jīng)被編碼了,不再包括),編碼方向為從右到左,比如上面的序列中,先編碼1,再編碼3。這些系數(shù)被編碼后,是由level_prefix和level_suffix兩部分組成的。level_prefix的值通過查表得出,level_suffix是由若干個0組成,0的個數(shù)由suffixLength決定。再接著對TotalZeros的值編碼。然后對RunBefore(每個非零系數(shù)前零的個數(shù))進行編碼,這個方向也是從右到左,并且最后一個(從左邊數(shù)的第一個)非零系數(shù)前零的個數(shù)不需要編碼,因為后面的編過后,剩下多少個0只有一個存放位置,就是最前面。
解碼
由計算出的bit串長度讀出相應(yīng)的bits,通過查表得到TotalCoeffs和TrailingOnes的值,此時無輸出,接著讀取拖尾系數(shù)的符合,由編碼的順序知,先讀到的是最后一個拖尾系數(shù)。解碼完拖尾系數(shù)并依次輸出,接下來是剩下的非零系數(shù)的值,通過查表解碼并輸出。然后解碼TotalZeros,此時輸出不變,仍為以前的解碼值。接下來解碼RunBefore,因為編碼時是從右往左編的,故第一個解碼出來的RunBefore應(yīng)該插到第一個解碼出的拖尾系數(shù)的前面,即插入的方向也是從右到左,最后一步時,剩下的RunBefore都插入到最前面。
Q:哪位能講一下標(biāo)準里面的坐標(biāo)的問題,分不清到底指的是塊,宏塊,尤其是MBAFF時?比如第6章逆掃描時的這兩個公式:y = yO + ( mbAddr % 2 ) * 16(幀),
y = yO + ( mbAddr % 2 ) (場)
A:這是計算像素坐標(biāo)的計算公式,MBADDR時是以宏塊對出現(xiàn)的,MBADDR是宏塊對的號碼,所以場模式下是不要乘16的,TOP FIELD和BOTTON FIELD的像素是獨立計算的。表達可能不大準確,也可能有誤,希望各位指點。
Q:為什么要在計算楨內(nèi)DC預(yù)測模式時要+2,+4?
A:16*16和4*4的楨內(nèi)DC預(yù)測模式中+2,+4的目的是為了四舍五入,使預(yù)測值更精確~~~
如(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: 為什么量化系數(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ù)變換中的乘法運算可以與量化過程的除法運算糅合起來,這樣就產(chǎn)生了你所提到的quant_coef[6][4][4]。第一個分量取6,是因為量化階每隔6就增加一倍,因此只需要記錄下量化階為0-5時的各個系數(shù)的大小,而后兩個分量取4則是為了與整數(shù)變換的大小相匹配
Q: int cof[4][6][4][4];?????? //!< correction coefficients from predicted
這個變量是干什么用的啊?
A:這個變量用來存儲解碼并且逆量化之后的系數(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作為運動估計的參考picture.