FFMPEG解码多线程
FFMPEG多線程解碼
FFMPEG多線程編碼器一般以在Slice內(nèi)分功能模塊進(jìn)行多線程編碼,如h263,h263P,msmpeg(v1, v2, v3),wmv1。包含以下幾個(gè)線程:(1)Pre_estimation_motion_thread運(yùn)動(dòng)估計(jì)前的準(zhǔn)備;(2)Estimation_motion_thread運(yùn)動(dòng)估計(jì);(3)Mb_var_thread宏塊其他變量;(4)Encode_thread編碼主線程。當(dāng)然也有例外,如FFV1編碼器按Slice為線程單位進(jìn)行多線程編碼。
FFMPEG多線程解碼器分為Frame級(jí)和Slice級(jí)兩種,Slice級(jí)多線程同時(shí)解碼一幀中不同的部分。Frame級(jí)多線程同時(shí)接受多幀碼流,實(shí)現(xiàn)并行解碼,當(dāng)前幀處于顯示狀態(tài)時(shí),未來(lái)的幾幀已經(jīng)在其他線程中被解碼。
1.???????? Slice Threading
???????? FFmpeg中,dvvideo_decoder, ffv1_decoder, h264_decoder, mpeg2_video_decoder和mpeg_video_decoder均支持了Slice Threading。
實(shí)現(xiàn)方法是:首先為codecContext注冊(cè)注冊(cè)多線程處理函數(shù)excute(),Codec解碼過(guò)程中處理Slice時(shí)調(diào)用avctx->excute()。excute()啟動(dòng)Slice解碼工作線程開(kāi)始多線程解碼,同時(shí)快速返回開(kāi)始下一Slice的解析和解碼。
Frame Threading主線程和解碼線程的同步如圖1所示。
圖1 Frame Threading主線程和解碼線程的同步
2.???????? Frame Threading
???????? 目前為止支持Frame Threading的解碼器有h264_decoder, huffyuv_decoder, ffvhuff_decoder, mdec_decoder, mimic_decoder, mpeg4_decoder, theora_decoder, vp3_decoder和vp8_decoder。
???????? Frame Threading有如下限制:用戶函數(shù)draw_horiz_band()必須是線程安全的;為了提升性能,用戶應(yīng)該為codec提供線程安全的get_buffer()回調(diào)函數(shù);用戶必須能處理多線程帶來(lái)的延時(shí)。另外,支持Frame Threading的codec要求每個(gè)包包含一個(gè)完整幀。Buffer內(nèi)容在ff_thread_await_progress()調(diào)用之前不能讀,同樣,包括加邊draw_edges()在內(nèi)的處理,在ff_thread_report_progress()調(diào)用之后,Buffer內(nèi)容不能寫(xiě)。
???????? 每個(gè)線程都有以下四個(gè)狀態(tài)。如圖2所示,為了保證線程安全,若Codec未實(shí)現(xiàn)update_thread_context()和線程安全的get_buffer(),則必須在解碼完成后才能將狀態(tài)轉(zhuǎn)換為STATUS_SETUP_FINISHED,意味著下一個(gè)線程只能在當(dāng)前線程解碼完成后才能開(kāi)始解碼。
而如圖3所示,如果Codec實(shí)現(xiàn)update_thread_context()和線程安全的get_buffer(),線程狀態(tài)可以在解碼開(kāi)始之前轉(zhuǎn)換為STATUS_SETUP_FINISHED,這樣,下一個(gè)線程就可能與當(dāng)前線程并行。
圖2 Codec未實(shí)現(xiàn)update_thread_context()和線程安全的get_buffer(),線程狀態(tài)轉(zhuǎn)換
圖3 Codec實(shí)現(xiàn)update_thread_context()和線程安全的get_buffer(),線程狀態(tài)轉(zhuǎn)換
???????? 解碼主線程通過(guò)調(diào)用submit_packet()將碼流交給對(duì)應(yīng)的解碼線程。主線程和解碼線程的同步如圖4所示。
圖4 Frame Threading主線程和解碼線程的同步
總結(jié)
以上是生活随笔為你收集整理的FFMPEG解码多线程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 公积金多久可以提现出来 公积金交了多长时
- 下一篇: arm 开发工具比较(ADS vs Re