ffplay分析 (視頻從Frame(解碼后)隊列取數據到SDL輸出)

《ffplay的數據結構分析》
《ffplay分析(從啟動到讀取線程的操作)》
《ffplay分析(視頻解碼線程的操作)》
《ffplay分析(音頻解碼線程的操作)》
《ffplay 分析(音頻從Frame(解碼后)隊列取數據到SDL輸出)》
《ffplay分析 (音視頻同步:主時鐘為音頻)》
《ffplay分析 (暫停 / 播放處理)》
《ffplay分析 (seek操作處理)》
《ffplay源碼(版本:ffmpeg-4.2.1)》

ffplay分析 (視頻從解碼后隊列取數據到SDL輸出)

  • 一、分析:
    • 1、main():在main()函數開始時有創建SDL窗口的處理
    • 2、read_thread():開啟讀取線程后,在read_thread()讀取數據線程中設置視頻流時調用set_default_window_size()設置顯示窗口的默認大小和渲染區域大小
    • 3、set_default_window_size():判斷命令行是否有指定寬高沒有就使用幀寬高,作為窗口寬高調用calculate_display_rect()計算渲染區域
    • 4、calculate_display_rect():使用像素比例計算實際寬高比
    • 5、calculate_display_rect():首先使用高度為基準計算渲染區域,如果寬度大于實際窗口再以寬度為基準重新計算
    • 6、calculate_display_rect():計算保存返回上層的渲染區域參數
    • 7、event_loop():SDL的事件循環調用了refresh_loop_wait_event()進行更新顯示和獲取SDL事件(在主線程更新,event_loop()在主線程調用)
    • 8、refresh_loop_wait_event():調用SDL_PumpEvents()、SDL_PeepEvents()、獲取SDL事件。如果沒有事件才進入while更新畫面,否則返回上一層處理相應事件。
    • 9、refresh_loop_wait_event():調用usleep()等待同步和設置remaining_time默認等待時間
    • 10、refresh_loop_wait_event():調用video_refresh()進行視頻更新
    • 11、video_refresh():判斷是否是實時流操作
    • 12、video_refresh():判斷是否是音頻流顯示操作
    • 13、video_refresh():視頻流顯示操作,如果沒有數據就什么不做
    • 14、video_refresh():獲取上一幀顯示的幀和將要顯示的一幀,用來計算同步時間操作
    • 15、video_refresh():判斷將要顯示的一幀的序列與現在解碼的不同就直接拋棄,重新獲取
    • 16、video_refresh():判斷是否是新的播放序列,重置is->frame_timer
    • 17、video_refresh():判斷是否暫停,直接保持顯示
    • 18、video_refresh():計算上一幀持續顯示的時長
    • 19、video_refresh():根據計算得到的delay判斷是否繼續顯示上一幀還是往下走繼續更新
    • 20、video_refresh():根據is->frame_timer用于下一輪的操作
    • 21、video_refresh():更新當前的視頻時鐘
    • 22、video_refresh():判斷是否進行丟幀處理
    • 23、video_refresh():調用frame_queue_next()移動到下一幀
    • 24、video_refresh():調用video_display()真正開始渲染畫面的操作
    • 25、video_display():判斷是視頻流調用video_image_display()顯示
    • 26、video_image_display():獲取將要顯示的這一幀![在這里插入圖片描述](https://img-blog.csdnimg.cn/20210128164947276.png)
    • 27、video_image_display():調用calculate_display_rect()根據窗口比例計算渲染區域(圖像)的寬高,調用upload_texture()將frame的yuv更新到is->vid_texture(SDL_Texture)
    • 28、video_display():video_image_display()結束后,返回到video_display()最終調用SDL_RenderPresent()顯示畫面

一、分析:

1、main():在main()函數開始時有創建SDL窗口的處理

在這里插入圖片描述

2、read_thread():開啟讀取線程后,在read_thread()讀取數據線程中設置視頻流時調用set_default_window_size()設置顯示窗口的默認大小和渲染區域大小

在這里插入圖片描述

3、set_default_window_size():判斷命令行是否有指定寬高沒有就使用幀寬高,作為窗口寬高調用calculate_display_rect()計算渲染區域

在這里插入圖片描述

4、calculate_display_rect():使用像素比例計算實際寬高比

在這里插入圖片描述

5、calculate_display_rect():首先使用高度為基準計算渲染區域,如果寬度大于實際窗口再以寬度為基準重新計算

在這里插入圖片描述

6、calculate_display_rect():計算保存返回上層的渲染區域參數

在這里插入圖片描述

7、event_loop():SDL的事件循環調用了refresh_loop_wait_event()進行更新顯示和獲取SDL事件(在主線程更新,event_loop()在主線程調用)

在這里插入圖片描述

8、refresh_loop_wait_event():調用SDL_PumpEvents()、SDL_PeepEvents()、獲取SDL事件。如果沒有事件才進入while更新畫面,否則返回上一層處理相應事件。

在這里插入圖片描述

9、refresh_loop_wait_event():調用usleep()等待同步和設置remaining_time默認等待時間

在這里插入圖片描述

10、refresh_loop_wait_event():調用video_refresh()進行視頻更新

在這里插入圖片描述

11、video_refresh():判斷是否是實時流操作

在這里插入圖片描述

12、video_refresh():判斷是否是音頻流顯示操作

在這里插入圖片描述

13、video_refresh():視頻流顯示操作,如果沒有數據就什么不做

在這里插入圖片描述

14、video_refresh():獲取上一幀顯示的幀和將要顯示的一幀,用來計算同步時間操作

在這里插入圖片描述

15、video_refresh():判斷將要顯示的一幀的序列與現在解碼的不同就直接拋棄,重新獲取

在這里插入圖片描述

16、video_refresh():判斷是否是新的播放序列,重置is->frame_timer

在這里插入圖片描述

17、video_refresh():判斷是否暫停,直接保持顯示

在這里插入圖片描述

18、video_refresh():計算上一幀持續顯示的時長

在這里插入圖片描述

19、video_refresh():根據計算得到的delay判斷是否繼續顯示上一幀還是往下走繼續更新

在這里插入圖片描述

20、video_refresh():根據is->frame_timer用于下一輪的操作

在這里插入圖片描述

21、video_refresh():更新當前的視頻時鐘

在這里插入圖片描述

22、video_refresh():判斷是否進行丟幀處理

在這里插入圖片描述

23、video_refresh():調用frame_queue_next()移動到下一幀

在這里插入圖片描述

24、video_refresh():調用video_display()真正開始渲染畫面的操作

在這里插入圖片描述

25、video_display():判斷是視頻流調用video_image_display()顯示

在這里插入圖片描述

26、video_image_display():獲取將要顯示的這一幀在這里插入圖片描述

27、video_image_display():調用calculate_display_rect()根據窗口比例計算渲染區域(圖像)的寬高,調用upload_texture()將frame的yuv更新到is->vid_texture(SDL_Texture)

在這里插入圖片描述

28、video_display():video_image_display()結束后,返回到video_display()最終調用SDL_RenderPresent()顯示畫面

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/379010.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/379010.shtml
英文地址,請注明出處:http://en.pswp.cn/news/379010.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

線性結構節點類型(三)

一、線性結構 特點 第一個數據元素沒有前驅最后一個數據元素沒有后繼1:1邏輯上相鄰、物理上也相鄰 類型 線性表(就是一張二維表)(為主研究對象)棧隊列 學習方法 畫邏輯結構—>定義存儲結構—>實現相應的操作 二、線性表 線性結構 邏輯上的1:1存儲結構 順序存儲結…

PL/SQL詳細介紹

PL/SQL筆記PL/SQL塊中只能直接嵌入SELECT,DML(INSERT,UPDATE,DELETE)以及事務控制語句(COMMIT,ROLLBACK,SAVEPOINT),而不能直接嵌入DDL語句(CREATE,ALTER,DROP)和DCL語句(GRANT,REVOKE) 1.檢索單行數據 1.1使用標量變量接受數據 v_ename emp.ename%type; v_sal emp.sal%…

redis 備份導出rdb_Redis數據遷移利器之redisshake

“當需要進行Redis實例或集群數據遷移時,我們可以采用導出/導入的方式進行數據遷移,但當需要做數據異地災備或雙活時,再使用傳統的方式就不合適了,我們需要借助工具(如redis-port/redis-shake)來完成。”redis-shake介紹redis-sha…

從Live Space搬家到這里

聽說Live Space很快要關閉了,所以從http://peking2toronto.spaces.live.com/搬家到這里。轉載于:https://www.cnblogs.com/pentest/archive/2010/08/29/1811726.html

java 方法 示例_Java Collectionsfrequency()方法與示例

java 方法 示例集合類的frequency()方法 (Collections Class frequency() method) frequency() method is available in java.util package. frequency()方法在java.util包中可用。 frequency() method is used to return the frequency of the given Object (obj) to the give…

線性結構常規操作(四)

定義存儲結構(以單向鏈表為主) 對于鏈表的定義,通過結構體進行定義,包括兩部分,一是數據域,另一個就是指針,用于指向下一個節點。 1,創建鏈表 定義鏈表: struct nodesq{int data;//數據域&a…

ffplay分析 (暫停 / 播放處理)

《ffplay的數據結構分析》 《ffplay分析(從啟動到讀取線程的操作)》 《ffplay分析(視頻解碼線程的操作)》 《ffplay分析(音頻解碼線程的操作)》 《ffplay 分析(音頻從Frame(解碼后)隊列取數據到…

源碼 狀態機_[源碼閱讀] 阿里SOFA服務注冊中心MetaServer(1)

[源碼閱讀] 阿里SOFA服務注冊中心MetaServer(1)0x00 摘要0x01 服務注冊中心1.1 服務注冊中心簡介1.2 SOFARegistry 總體架構1.3 為什么要分層0x02 MetaServer2.1簡介2.2 問題0x03 代碼結構0x04 啟動運行4.1 集成部署4.2 獨立部署0x05 總體邏輯5.1 程序主體5.2 配置0x06 啟動6.1…

HttpService遠程校驗

今天學了下HttpService,和大家分享一下。HttpService是用來讀取遠程數據的一個對象,數據格式為XML。 我做了一個登陸校驗的功能,主要是通過HttpService將服務器端的用戶數據得到,然后在客戶端判斷輸入的用戶名和密碼是否存在。 主…

免費開源FTP Server軟件FileZilla Server

很多朋友在實際應用中都可能需要用到FTP Server類的軟件,這類軟件有很多,比較知名的有Serv-U、G6等,這里向大家介紹一下FileZilla Server,Windows平臺下一款不錯的FTP Server軟件,而且是免費的、開源的。 S…

Java BigDecimal floatValue()方法與示例

BigDecimal類floatValue()方法 (BigDecimal Class floatValue() method) floatValue() method is available in java.math package. floatValue()方法在java.math包中可用。 floatValue() method is used to convert a BigDecimal to a float value and when this BigDecimal m…

明明的隨機數(快排)

明明想在學校中請一些同學一起做一項問卷調查,為了實驗的客觀性,他先用計算機生成了N個1到1000之間的隨機整數(N≤100),對于其中重復的數字,只保留一個,把其余相同的數去掉,不同的數…

ffplay分析 (seek操作處理)

《ffplay的數據結構分析》 《ffplay分析(從啟動到讀取線程的操作)》 《ffplay分析(視頻解碼線程的操作)》 《ffplay分析(音頻解碼線程的操作)》 《ffplay 分析(音頻從Frame(解碼后)隊列取數據到…

android 代碼設置 鍵盤適應_硬核軟件,能在電腦上控制iPhone和Android手機

在電腦上控制手機大概已經不是什么新鮮操作,小米、華為都為自家手機和電腦的聯動推出了同屏操作之類的功能,此外也可以通過開源軟件Scrcpy來在Windows或者macOS上實現對安卓手機的控制,這些基本都只針對安卓手機。近期,奇客君發現…

網址出現error.aspx?aspxerrorpath=404.htm?aspxerrorpath=的原因及解決辦法轉

網址出現aspxerrorpath的問題描述 1.網頁打不開了,輸入網址后就提示error.aspx?aspxerrorpath/about-us.html,到底是什么原因啊? 2.ASP網站自定義了404錯誤頁,但訪問不存在的網址時網址錯誤頁后面總多出aspxerrorpath參數,怎么解…

ruby hash方法_Ruby中帶有示例的Hash.default(key = nil)方法

ruby hash方法Hash.default(key nil)方法 (Hash.default(keynil) Method) In this article, we will study about Hash.default(keynil) Method. The working of this method can be predicted with the help of its name but it is not as simple as it seems. Well, we will…

回文數、括號匹配(棧操作)

回文數 “xyzyx”是一個回文字符串,所謂回文字符串就是指正讀反讀均相同的字符序列,如“席主席”、“記書記”、“aha”和“ahaha”均是回文,但“ahah”不是回文。輸入一行字符(僅包含小寫英文字母a~z)請判斷這行字符…

ijkplayer 消息循環處理過程分析

ijkplayer 消息循環處理過程分析簡介一、消息隊列初始化1、 initWithContentURLString函數2、 ijkmp_ios_create函數3、 ijkmp_create函數二、消息隊列的消息循環處理函數啟動1、prepareToPlay函數2、ijkmp_prepare_async函數3、ijkmp_prepare_async_l函數4、ijkmp_msg_loop函數…

json解析對應的value為null_徒手擼一個JSON解析器

Java大聯盟致力于最高效的Java學習關注作者 | 田小波cnblogs.com/nullllun/p/8358146.html1、背景JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。相對于另一種數據交換格式 XML,JSON 有著諸多優點。比如易讀性更好,占用空間更少等。在 …

[一]設計模式初探

模式,顧名思義,就是做一種事情的方法歸納,就經驗來說,做什么事情有個好的方法來應對都是可以事半功倍的,在軟件開發中何謂好的模式? 我認為好的模式簡單來說就是保證你應對需求變化的時候不用做更多的代碼修改&#x…