scan8確實不好理解,解答如下:
static const int x264_scan8[16+2*4] =
{
? ? /* Luma */
? ? 4+1*8, 5+1*8, 4+2*8, 5+2*8,
? ? 6+1*8, 7+1*8, 6+2*8, 7+2*8,
? ? 4+3*8, 5+3*8, 4+4*8, 5+4*8,
? ? 6+3*8, 7+3*8, 6+4*8, 7+4*8,
? ? /* Cb */
? ? 1+1*8, 2+1*8,
? ? 1+2*8, 2+2*8,
? ? /* Cr */
? ? 1+4*8, 2+4*8,
? ? 1+5*8, 2+5*8,
};
/*
? ?0 1 2 3 4 5 6 7
0
1? ? B B? ?L L L L
2? ? B B? ?L L L L
3? ?? ?? ?? ? L L L L
4? ? R R? ?L L L L
5? ? R R
*/
上面這兩個對應起來看就可以了。
?
scan8是為了便于訪問 諸如mv_cache, ref_cache, non_zero_count_cache以及mvd_cache等內存,而填充好的一個數組,里面放置的都是上述內存中特定的索引序號 比如scan8[0]=12,這個12就是上述內存中,一般針對macroblock而言的左上角數值,無論是mv,還是non_zero_count,所以只有充分搞懂上述內存結構,那么所有問題就迎刃而解了 |
?
?
?
attachment中是以前針對某個問題,分析后的筆記
ffmepg中,幾個比較重要的cache,大致都是按照此思路進行設置的
希望對于cache理解有幫助!
?
?
1.請問色度為什么和Luma度是同一矩陣值? 2.h->block_offset是求什么的值? - for(i=0; i<16; i++){??
- ? ?? ???h->block_offset[i]= 4*((scan8[i] - scan8[0])&7) + 4*s->linesize*((scan8[i] - scan8[0])>>3);
- ? ?? ???h->block_offset[24+i]= 4*((scan8[i] - scan8[0])&7) + 8*s->linesize*((scan8[i] - scan8[0])>>3);
- ? ? }
- ? ? for(i=0; i<4; i++){
- ? ?? ???h->block_offset[16+i]=
- ? ?? ???h->block_offset[20+i]= 4*((scan8[i] - scan8[0])&7) + 4*s->uvlinesize*((scan8[i] - scan8[0])>>3);
- ? ?? ???h->block_offset[24+16+i]=
- ? ?? ???h->block_offset[24+20+i]= 4*((scan8[i] - scan8[0])&7) + 8*s->uvlinesize*((scan8[i] - scan8[0])>>3);
- ? ? }
復制代碼 1、應該是為了節約內存,同時方便在一個數組中索引同一個MB的亮色度的預測模式。不知這樣解釋是否正確,希望高人指正 2、block_offset,看名字就知道是block的偏移量啊? ? 16+8,就更加明顯啦,16個亮度,兩個(8,各為4)色度 ? ? 如果沒記錯的話,這個偏移應該是用在yuv像素存儲索引的 | 感謝Juanny 的文檔,對于理解x264_scan8中的元素值很有幫組,這主要是一個中間的尋址矩陣,通過它可以很方便的找到MB的色度、亮度4x4塊在對應的cache,zero_count中的位置 ? ? ? ? ? ? scan8[]實際上是4x4塊的掃描順序及存儲的位置,把scan8放在8x8的矩陣中就能看出其作用了,其中T表示當前塊的上面的塊,L表示當前塊左邊的塊,它們是用來預測當前塊的幀內預測模式(Intra prediction mode)和運動向量之類的,起到一個緩存的作用。可以看到這種設計比JM節約內存,而且非常巧妙。程序中的其他緩存設計都與此類似。 ? ? ? ? ? | T ? ? | T ? ? | ? ? ? | T ? ? | T ? ? | T ? ? | T ? ? | L ? ? | 16 ? ? | 17 ? ? | L ? ? | 0 ? ? | 1 ? ? | 4 ? ? | 5 ? ? | L ? ? | 18 ? ? | 19 ? ? | L ? ? | 2 ? ? | 3 ? ? | 6 ? ? | 7 ? ? | ? ? ? | T ? ? | T ? ? | L ? ? | 8 ? ? | 9 ? ? | 12 ? ? | 13 ? ? | L ? ? | 20 ? ? | 21 ? ? | L ? ? | 10 ? ? | 11 ? ? | 14 ? ? | 15 ? ? | L ? ? | 22 ? ? | 23 ? ? | ? ? ? | ? ? ? | ? ? ? | ? ? ? | ? ? ? | ? ? ? | ? ? ? | ? ? ? | ? ? ? | ? ? ? | ? ? ? | ? ? ? | ? ? ? | ? ? ? | ? ? ? | ? ? ? | ? ? ? | ? ? ? | ? ? ? | ? ? ? | ? ? ? | | |