2009年8月22日 星期六

trace h.264 in ffmpeg II

目前開始trace decode_frame這個function
現在trace到decode_nal_units這個重要的function
我現在知道nalu這是引進網路的概念
我也去翻了spec了 大概在200901的這一份的p.84 有10幾種的type

不過我實在不懂 到底每個是什麼 所以說我就上網找了教學文章
現在我大概知道nulu分成兩種 一種是VCL-NAL-unit跟non-VCL NAL-unit
VCL-NAL-unit是真正存影片的內容
non-VCL NAL-unit則是存其他的metadata 像是影片的參數sequenc跟slice header之類的參數
還有另一項是sei這是存關於影片的簡介跟版權之類的 不關影片的編碼的參數

好我終於知道什麼事CAVLC是什麼東西了 這是一種特殊的編碼技巧 會根據先在影片symbol出現的特性來改變
現在的variable length code table

接下來我開始trace nalu在我code中的使用
我發現主要用的的ualu的type只有幾種 7 8 5 1
6的話只用了一次 反正應該是影片的簡介吧
7是sequence parameter
8是picture parameter
5是沒有reference其他picture的picture
1是有reference其他picture的picture
雖然這邊1跟5是叫做coded clice of a non-IDR picture跟coded slice of an IDR picture
但是我看的結果 1跟5解出來就已經是一個frame了
不知道是為什麼

我看了一篇wiki上面附的H.264介紹的paper 我覺得寫得還不錯
全名是overview of the H.264/AVC video coding standard
他有寫到picture parameter set的功用 是要用在一個或多個picture上 所以說
這篇paper也有說到frame中可以多個slice group 為什麼會有很多個slice group勒
是因為他要有FMO的功能 flexiable macroblock ordering
這就是說slice不一定要從最左上角的macroblock開始 可以從任一個macroblock開始
這裡的frame跟picture是一樣的 就是一個畫面 好
然後field是一半的frame frame分成top field跟bottom field
這個意思就是偶數行是top field 奇數行是bottom field
如果是沒有分兩個field的frame 就是progressive field(根本就沒用)

我現在總算懂了什麼事residual了 這就是要decode的frame減掉reference的frame

接下來算是比較有進展 我發現有關macroblock的decode的東西都集中在hl_decode_mb_internal這個function
對 然後我知道h.264的idct是特別的idct雖然說要用dspContext中的h.264 idct function
不過這些function全部寫在(ffmpeg top)/libavcodec/h264idct.c中
不過沒發現quantization的function 有發現dc_dequantization_idct

接下來是deblock的相關內容是在hl_decode_mb_internal的最後幾行
沒仔細看 先看到這裡 快看完了 加油

沒有留言:

張貼留言