關於FFMPEG的解碼模型
FFMPEG程式碼量很大,所以如果只是看程式碼必然容易從入門到放棄,為了更好的瞭解這座寶庫,我選擇了gdb除錯ffmpeg_g的方式。從實際的效果看,確實能夠比較清晰的順利整個FFMPEG的脈絡。這次我想了解的是ffmpeg到底是如何將h264碼流解碼成yuv的,選用的測試命令如下:
./ffmpeg_g -i test.h264 -vcodec rawvideo -an out.yuv
外部通過avcodec_send_packet呼叫,將需要解碼的pkt包提交給後臺的解碼執行緒,後臺解碼執行緒再呼叫h264解碼回撥函式進行解碼。
解碼執行緒的建立
使用gdb工具,在解碼回撥h264_decode_frame設定斷點,可以得到如下呼叫堆疊。
可以確定,這是一個專門用於解碼的執行緒,從程式碼中索引執行緒工作回撥函式frame_worker_thread,只有建立它的時候有呼叫。
在此行再設定斷點,我們可以知道到底是誰建立了它,以及什麼時候建立的。
從堆疊看就是在呼叫avcodec_open2開啟解碼器的時候,ffmpeg就已經為我們構建瞭解碼模型!
推包
這一部分講一講ffmpeg是如何將包推送給後臺執行緒的。我們注意觀察解碼執行緒,看看它到底是如何接收外界包的
很明顯,外界是將資料裝載到了PerThreadContext::avpkt這個變數中,對於PerThreadContext,我們先按下不表,只需瞭解它就是一個執行緒結構體物件罷了,裝載了各種執行緒所需的資料,包括外界給它的包。換言之,只需按圖索驥跟蹤這個變數,就可以知道是誰,通過什麼樣的方式給它傳資料的。經過一番折騰,我確實找到了一個地方
為了確認,在此處設定斷點,ffmpeg確實在不斷的呼叫此函式推包。而最外層API函式正是我們常用的avcodec_send_packet。
相關文章
- FFmpeg開發筆記(五):ffmpeg解碼的基本流程詳解(ffmpeg3新解碼api)筆記API
- ffmpeg軟解碼遇到的坑
- ffmpeg解碼基本流程
- MediaCodec解碼FFmpeg AvPacket
- FFmpeg音訊解碼音訊
- 關於盒模型相關的問題模型
- AAAI 2020 論文解讀:關於生成模型的那些事AI模型
- ffmpeg記憶體模型記憶體模型
- 模型的威力:基於模型,快速梳理原始碼模型原始碼
- 關於mysql忘記密碼的解決策略MySql密碼
- laravel Eloquent模型 關於模型關聯屬性獲取Laravel模型
- 關於 CSS 盒子模型CSS模型
- FFmpeg開發筆記(九):ffmpeg解碼rtsp流並使用SDL同步播放筆記
- 關於分類的線性模型的討論模型
- ffmpeg入門到實戰-ffmpeg是怎麼轉碼的?
- FFmpeg開發筆記(二十)Linux環境給FFmpeg整合AVS3解碼器筆記LinuxS3
- FFmpeg開發筆記(八):ffmpeg解碼音訊並使用SDL同步音訊播放筆記音訊
- FFmpeg命令影片音訊轉碼引數詳解音訊
- FFmpeg開發筆記(二十四)Linux環境給FFmpeg整合AV1的編解碼器筆記Linux
- FFmpeg學習之一(FFmpeg原始碼編譯)原始碼編譯
- 關於密碼密碼
- 關於建立3D線框模型的解答3D模型
- Mysql 關於event的詳解MySql
- 關於模型關聯 獲取不到關聯資訊 求教模型
- JavaCV FFmpeg AAC編碼Java
- FFmpeg開發筆記(十九)FFmpeg開啟兩個執行緒分別解碼音影片筆記執行緒
- FFmpeg開發筆記(二十一)Windows環境給FFmpeg整合AVS3解碼器筆記WindowsS3
- 關於原碼,反碼,補碼
- 快手關於海量模型資料處理的實踐模型
- [提問交流]關於onethink模型這塊的討論模型
- 基於路徑的實體圖關係抽取模型模型
- Windows 關於Robocopy的使用詳解Windows
- 關於SSL裝置的詳解
- Mysql關於procedure、function的詳解MySqlFunction
- 關於Java中的@Deprecated註解Java
- 自編碼器及其相關模型模型
- 圖解Linux的IO模型和相關技術圖解Linux模型
- 關於malloc原始碼中的bin_at巨集定義的個人見解原始碼