2.18.2009

AVPicture structure 的內容 - 還是 convert_yuv420_rgb565.S

tyedef struct AVPicture {
uint8_t *data[4];
int linesize[4];
} AVPicture;

是給說明一個 frame 的資料內容。
data 是 channel data.
linesize 是channel 的 linesize (寬度).

所以最多有 4 個 channel 資料 (? 哪一種 format 會有四個 channel ?).
以 YUV420 為例,320 x 240 的圖檔,有 Y.U.V 三個 channel,Y 的 linesize 是 320。U, V 的 linesize 都是 160.
所以用到 data[0]~data[3],linesize[0]~linesize[3]。

以 bgr565為例,一個 pixel 一個 word:bgr565,所以沒有分開 channel。所以只有用到 data[0] 和 linesize[0]。

所以 convert _yuv420_rgb565.S 的一開始的 argument 處裡:

ldr r7, [r0, #0] ; Y ptr
ldr r9, [r0, #4] ; U ptr
ldr r10, [r0, #8] ; V ptr
subs r10, r10, r9 ; V ptr - U ptr
ldr r8, [r0, #12]
add r8, r8, r7 ; Y + stride_Y
ldr r4, [r0, #12] ; Stride_Y
mov r4, r4, lsl #1
sub r4, r4, r2 ; (2 * Stride_Y) - width
ldr r5, [r0, #16] ; Stride_U
sub r5, r5, r2, lsr #1 ; Stride_U - (width / 2)
ldr r6, [r0, #20] ; Stride_V
sub r6, r6, r2, lsr #1 ; Stride_V - (width / 2)
add r0, r1, r2, lsl #1 ; RGB + 1
stmdb sp!, { r0-r10 }
; Stack description :
; (sp+ 0) RGB + one line
; (sp+ 4) RGB
; (sp+ 8) width (save)
; (sp+12) height
; (sp+16) (2 * stride_Y) - width
; (sp+20) stride_U - (width / 2)
; (sp+24) stride_V - (width / 2) !!! UNUSED !!!
; (sp+28) Y ptr
; (sp+32) Y ptr + one line
; (sp+36) U ptr
; (sp+40) V - U
就是分別取出
data[0] : Y, data[1] : U, data[2] : V

linesize[0] : stride_Y, linesize[1] : stride_U, linesize[2] : stride[V].
convert_yuv420_rgb565(AVPicture *pic,unsigned char *out,int width,int height)
的參數 width, 和 Stride_Y 有什麼不一樣?

Stride_Y 是 source 影像的寬度。
width 是你要顯示的寬度 (clip)。

有一張 1024x768 的圖,你可以只顯示 800x768 (左邊部份)。

所以不一樣.

從 assembly 看,AVPicture 的 structure 好像不是這樣,他用的好像是:
struct AVPicture{
char *data[3];
int linesize[3];
} AVPicture;
實際上...也是用這個 structure Run 起來的...

沒有留言: