編碼幀的輸入順序是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...