VLC播放主要流程

前言

VLC 播放流程大概是先加載解封裝器,然后通過es_out控制所有的stream。然后會加載decoder。最終通過resource文件的方法交給輸出 模塊。下面簡要介紹。

正文

播放器主要分為三層。主要通過兩個接口實現了功能隔離。分別是es_out.c和decoder.c的實現了:

//控制解封裝后的的數據,通過send增加數據
static const struct es_out_callbacks es_out_cbs =
{.add = EsOutAdd,.send = EsOutSend,.del = EsOutDel,.control = EsOutControl,.destroy = EsOutDelete,.priv_control = EsOutPrivControl,
};//解封裝后的數據傳給輸出
static const struct decoder_owner_callbacks dec_video_cbs =
{.video = {.get_device = ModuleThread_GetDecoderDevice,.format_update = ModuleThread_UpdateVideoFormat,.buffer_new = ModuleThread_NewVideoBuffer,.queue = ModuleThread_QueueVideo,.queue_cc = ModuleThread_QueueCc,.get_display_date = ModuleThread_GetDisplayDate,.get_display_rate = ModuleThread_GetDisplayRate,},.get_attachments = InputThread_GetInputAttachments,
};
static const struct decoder_owner_callbacks dec_audio_cbs =
{.audio = {.format_update = ModuleThread_UpdateAudioFormat,.queue = ModuleThread_QueueAudio,},.get_attachments = InputThread_GetInputAttachments,
};

解封裝部分主要通過Run方法開啟的線程實現多線程的解封裝。

int input_Start( input_thread_t *p_input )
{void *(*func)(void *) = Run;/* Create thread and wait for its readiness. */priv->is_running = !vlc_clone( &priv->thread, func, priv );
}static void *Run( void *data )
{if( !Init( p_input ) ){MainLoop( p_input, true ); /* FIXME it can be wrong (like with VLM) */End( p_input );}
}

這是核心問題,主要是初始化,加載讀取存儲截至的資源(比如網絡資源,硬盤等)加載stream filter(比如緩存控制等),最后加載解封裝器。然后通過MainLoop,的MainLoopDemux的demux_Demux。本質上就是調用demux模塊的demux_pf的。
拿到的結果交給第二部分。EsOutSend。最終交給decoder。然后返回給dec.c中。
第三部分則通過ModuleThread_QueueAudio。拿到解碼后的數據,然后調用audiofilter,處理聲音,最終交給aout 的play函數,最終初始化audiotrack,播放數據。

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

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

相關文章

算法練習-搜索 相關

文章目錄 迷宮問題 迷宮問題 定義一個二維數組 m行 * n列 ,如 4 5 數組下所示: int arr[5][5] { 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, }; 它表示一個迷宮,1表示墻壁,0表示可以走的路,只…

Synchronized八鎖

/** * Description: 8 鎖 * 1 標準訪問,先打印短信還是郵件 ------sendSMS ------sendEmail 2 停 4 秒在短信方法內,先打印短信還是郵件 ------sendSMS ------sendEmail 3 新增普通的 hello 方法,是先打短信還是 hello ------getHello ------…

Idea中使用statement接口對象,顯示mysql版本號,所有庫和表名

使用statement 接口對象,進行以下操作: 顯示數據庫版本號顯示所有庫顯示所有庫中的table表 顯示數據庫版本號: public class StatementDemo {Testvoid showall(){try{Statement st conn.createStatement();ResultSet rs st.executeQuery(…

pytest fixture 常用參數

fixture 常用的參數 參數一:autouse,作用:自動運行,無需調用 舉例一:我們在類中定義一個function 范圍的fixture; 設置它自動執行autouseTrue,那么我們看下它執行結果 輸出: 說明:…

Leetcode-每日一題【劍指 Offer 12. 矩陣中的路徑】

題目 單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內的字母不允許被重復使用。 例如,在下面的 34 的矩陣中包含單詞 "ABCCED"(單詞中的字母…

CUDA執行模型

一、CUDA執行模型概述 二、線程束執行 1. 線程束與線程塊 線程束是SM中基本的執行單元。 當一個線程塊的網格被啟動后,網格中的線程塊分布在SM中。 一旦線程塊被調度到一個SM中,線程塊中的線程會被進一步劃分成線程束。 一個線程束由32個連續的線程…

【Express.js】數據庫初始化

數據庫初始化 在軟件開發階段和測試階段,為了方便調試,我們通常會進行一系列的數據庫初始化操作,比如重置數據表,插入記錄等等,或者在部署階段進行數據初始化的操作 根據前面章節介紹過的 knex.js 和 sequelize.js&…

基于自適應曲線閾值和非局部稀疏正則化的壓縮感知圖像復原研究【自適應曲線閾值去除加性穩態白/有色高斯噪聲】(Matlab代碼實現)

💥💥💞💞歡迎來到本博客????💥💥 🏆博主優勢:🌞🌞🌞博客內容盡量做到思維縝密,邏輯清晰,為了方便讀者。 ??座右銘&a…

什么是媒體代發布?媒體代發布注意事項

傳媒如春雨,潤物細無聲,大家好,我是51媒體網胡老師。 媒體代發布是指將新聞稿或其他宣傳內容委托給專業的媒體代理機構或公司進行發布和推廣的活動。這些機構通常擁有豐富的媒體資源、人脈和經驗,能夠更好地將信息傳遞給目標受眾…

C語言 指針與內存之間的關系

一、內存與字節 一個內存單元一個字節一個地址 整型 int 類型中int類型的字節數是4 且一個字節表示八個bite位 一個二進制數位有著32個bite 所以又可以表示為:一個字節 8個比特位 32位數的二進制數位的八分之一 例如: int a 10; 該表達式…

項目實戰 — 消息隊列(9){編寫demo程序}

消息隊列服務器核心功能就是,提供了虛擬主機,交換機, 隊列,消息等概念的管理,實現三種典型的消息轉發方式,可以實現跨主機/服務器之間的生產者消費模型。 這里,就編寫一個demo,實現…

【實戰講解】數據血緣落地實施

?在復雜的社會分工協作體系中,我們需要明確個人定位,才能更好的發揮價值,數據也是一樣,于是,數據血緣應運而生。 今天這篇文章會全方位的講解數據血緣,并且給出具體的落地實施方案。 一、數據血緣是什么…

JAVA多線程和并發基礎面試問答(翻譯)

JAVA多線程和并發基礎面試問答(翻譯) java多線程面試問題 1. 進程和線程之間有什么不同? 一個進程是一個獨立(self contained)的運行環境,它可以被看作一個程序或者一個應用。而線程是在進程中執行的一個任務。Java運行環境是一個包含了不同的類和程序…

蘇州OV泛域名RSA加密算法https

RSA加密算法是一種非對稱加密算法,它被廣泛應用于信息安全領域。與對稱加密算法不同,RSA加密算法使用了兩個密鑰,一個公鑰和一個私鑰。公鑰可以公開,任何人都可以使用它加密信息,但只有私鑰的持有者才能解密信息。RSA加…

php如何對接偽原創api

在了解偽原創api的各種應用形態之后,我們繼續探討智能寫作背后的核心技術。需要說明的是,智能寫作和自然語言生成、自然語言理解、知識圖譜、多模算法等各類人工智能算法都有緊密的關聯,在百度的智能寫作實踐中,常根據實際需求將多…

全球勞動力革命,Papaya Global 打破薪資界限

員工需求和勞動力結構的進一步變化,只會增加對更加自動化和全面的全球薪資解決方案的需求。 遠程工作潮流與全球勞動力的蓬勃發展,使得企業在全球范圍內,尋找最優秀的人才成為可能。然而,隨之而來的復雜薪資管理挑戰,也…

優雅地處理RabbitMQ中的消息丟失

目錄 一、異常處理 二、消息重試機制 三、錯誤日志記錄 四、死信隊列 五、監控與告警 優雅地處理RabbitMQ中的消息丟失對于構建可靠的消息系統至關重要。下面將介紹一些優雅處理消息丟失的方案,包括異常處理、重試機制、錯誤日志記錄、死信隊列和監控告警等。…

BUUCTF題目Web部分wp(持續更新)

關于SQL注入的一些通用辦法 可以訪問哪些表 如有權限,查詢當前用戶可以訪問的所有表 --Oracle查詢當前用戶可訪問的所有表 select owner, table_name from all_tables order by table_name; --MySQL查詢用戶可訪問的所有數據庫和表 select table_sche…

爬蟲017_urllib庫_get請求的quote方法_urlencode方法_---python工作筆記036

按行來看get請求方式 比如這個地址 上面這個地址復制粘貼過來以后 可以看到周杰倫變成了一堆的Unicode編碼了 所以這個時候我們看,我們說https這里,用了UA反爬,所以這里 我們構建一個自定義的Request對象,里面要包含Us

電腦mfc140u.dll丟失的怎么辦呢?這個方法親測可以解決

修復mfc140u.dll是我最近遇到的一個技術問題,雖然在解決過程中遇到了一些困難,但最終的成功修復讓我對技術的力量有了更深的體會。 首先,我想談談遇到問題時的困惑。當我嘗試運行一個應用程序時,突然彈出一個錯誤提示,…