日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

FFMPEG解码多线程

發(fā)布時(shí)間:2023/12/13 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 FFMPEG解码多线程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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級和Slice級兩種,Slice級多線程同時(shí)解碼一幀中不同的部分。Frame級多線程同時(shí)接受多幀碼流,實(shí)現(xiàn)并行解碼,當(dāng)前幀處于顯示狀態(tài)時(shí),未來的幾幀已經(jīng)在其他線程中被解碼。

1.???????? Slice Threading

???????? FFmpeg中,dvvideo_decoder, ffv1_decoder, h264_decoder, mpeg2_video_decoder和mpeg_video_decoder均支持了Slice Threading。

實(shí)現(xiàn)方法是:首先為codecContext注冊注冊多線程處理函數(shù)excute(),Codec解碼過程中處理Slice時(shí)調(diào)用avctx->excute()。excute()啟動(dòng)Slice解碼工作線程開始多線程解碼,同時(shí)快速返回開始下一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ù);用戶必須能處理多線程帶來的延時(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)容不能寫。

???????? 每個(gè)線程都有以下四個(gè)狀態(tài)。如圖2所示,為了保證線程安全,若Codec未實(shí)現(xiàn)update_thread_context()和線程安全的get_buffer(),則必須在解碼完成后才能將狀態(tài)轉(zhuǎn)換為STATUS_SETUP_FINISHED,意味著下一個(gè)線程只能在當(dāng)前線程解碼完成后才能開始解碼。

而如圖3所示,如果Codec實(shí)現(xiàn)update_thread_context()和線程安全的get_buffer(),線程狀態(tà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)換

???????? 解碼主線程通過調(diào)用submit_packet()將碼流交給對應(yīng)的解碼線程。主線程和解碼線程的同步如圖4所示。

圖4 Frame Threading主線程和解碼線程的同步

總結(jié)

以上是生活随笔為你收集整理的FFMPEG解码多线程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。