x264中關於編碼幀訪問lookahead的操作

2021-10-25 13:24:25 字數 3163 閱讀 8176

編碼幀的輸入順序是i b b b b p,設定4個b幀。

這裡假設每次最多能快取5幀影象,即lookahead的列表中能存5幀影象。編碼的第一幀影象是i幀或者idr幀,首先將第一幀影象存入h->lookahead->next->list中,它的size加1,接著依次存入四幀影象,它的size為5,此時h->lookahead->next->list中的影象是:

接著對列表中的影象進行依次編碼,首先取索引為0的幀,確定幀型別為idr幀,然後將此幀賦值給h->lookahead->last_nonb,具體操作如下:

h-

>lookahead-

>last_nonb=h-

>lookahead-

>next-

>list[0]

;

然後確定要移動的幀數shift_frames=1;

然後將這一幀移到另乙個列表中,具體操作如下:

h-

>lookahead-

>ofbuf-

>list[0]

=h->lookahead-

>next-

>list[0]

;

h->lookahead->ofbuf.size加1,h->lookahead->next.size減1,h->lookahead->next->list中後面的幾幀依次向前移,

h->lookahead->next->list移動之後的情況

h->lookahead->ofbuf->list新增一幀之後的情況

然後又從h->lookahead->ofbuf->list中將這一幀取出存入到h->frames.current中

此時,h->frames.current中存入一幀,h->lookahead->ofbuf->list中為空。然後編碼的時候從h->frames.current中取索引為0的幀作為當前編碼幀。此時只有一幀,,不需要移動其他幀。

這乙個idr幀編碼完後,又向h->lookahead->next->list中加入新的一幀,加到列表的最後,此時還是存5幀。

接著編碼第二幀,第二幀一般是p幀。取第二幀之前要先確定這些幀的幀型別。

這些幀的型別是:

然後調整p幀b幀順序,調整前:

調整後:

對其進行重新排序:

此時h->lookahead->next->list中的順序就是重新排序後的順序。

確定要移動的幀數shift_frames=5;

將h->lookahead->next->list中的5幀依次移到h->lookahead->ofbuf->list中,順序保持不變,移動後h->lookahead->next的size為0,h->lookahead->ofbuf的size為5.

然後再將h->lookahead->ofbuf->list中的5幀依次移到h->frames.current中,順序保持不變,移動後h->lookahead->ofbuf的size為0.

編碼的時候是從h->frames.current中依次取,編完一幀,就將這幀從h->frames.current中移除,根據先入先出原則,所以總是取索引為0的幀。

當這些幀編碼完後,又會重新存入5幀到h->lookahead->next->list中。重新執行這些操作。

**如下:

int

x264_encoder_encode

( x264_t *h,

x264_nal_t *

*pp_nal,

int*pi_nal,

x264_picture_t *pic_in,

x264_picture_t *pic_out )

void

x264_lookahead_get_frames

( x264_t *h )

else

}void

x264_slicetype_decide

( x264_t *h )

elseif(

(h->param.i_bframe && h-

>param.i_bframe_adaptive)

|| h-

>param.i_scenecut_threshold

|| h-

>param.rc.b_mb_tree

||(h->param.rc.i_vbv_buffer_size && h-

>param.rc.i_lookahead)

)x264_slicetype_analyse

( h,0)

;//幀型別分析..

....

/* insert a bref into the sequence */

if( h-

>param.i_bframe_pyramid && bframes >1&&

!brefs )..

...if

( bframes )

;for

(int i =

0; i < bframes; i++

)//調整p幀b幀順序

frames[0]

= h-

>lookahead-

>next.list[bframes]

; frames[0]

->i_reordered_pts = h-

>lookahead-

>next.list[0]

->i_pts;

memcpy

( h-

>lookahead-

>next.list, frames,

(bframes+1)

*sizeof

(x264_frame_t*))

;//重排序}.

....

.}

ps:暫時理解這麼多。

X264的參考幀設定

1 以r1884為例 r,ref 整數 reference frame,即參考幀,決定最多可能的參考幀數。有效範圍值1 16。該值越大,壓縮率越高 但大於6後對壓縮率的貢獻很低 可以看壓制完後x264 info ref 項,例如上圖p l0那行,71.0 表示p幀參考自己,4.2 表示參考隔壁1個幀...

x264多執行緒編碼

x264有兩種並行模式,slice並行和frame並行。slice並行把一幀劃分為多個矩形slice,在這多個slice之間並行處理,是一種非延時性的並行模式,多slice會稍微降低編碼效能。frame並行是同時開啟多幀編碼,x264在n個frame並行的時候需要集齊n幀再開始一起編碼,因此x264...

x264多執行緒編碼

x264有兩種並行模式,slice並行和frame並行。slice並行把一幀劃分為多個矩形slice,在這多個slice之間並行處理,是一種非延時性的並行模式,多slice會稍微降低編碼效能。frame並行是同時開啟多幀編碼,x264在n個frame並行的時候需要集齊n幀再開始一起編碼,因此x264...