• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 181  文章 - 15  trackbacks - 0
            <2008年12月>
            30123456
            78910111213
            14151617181920
            21222324252627
            28293031123
            45678910

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            My Tech blog

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            一、 總覽:

            Graph、Filter、Pin、Simple

            Graph:可以理解為媒體處理的流程圖。

            Filter:可以理解為媒體處理流程圖中的一個(gè)步驟。

            Pin:可以理解為媒體處理各個(gè)步驟之間的數(shù)據(jù)流節(jié)點(diǎn)。

            Simple:可以理解為各個(gè)形態(tài)的數(shù)據(jù)。

            Filter的分類:

            · source filter:將數(shù)據(jù)從源(比如媒體文件)引入Graph。

            · transform filter:數(shù)據(jù)流入、改變、流出。

            · Renderer filters:把最終結(jié)果展現(xiàn)給用戶。

            · splitter filter:比如把一個(gè)媒體流分解為視頻和音頻。

            · mux filter:和splitter filter相反。

            1. Graph Manager

            主要對(duì)處于同一個(gè)Graph的Filter(s)進(jìn)行統(tǒng)一的管理。

            比如:

            · 各個(gè)Filter的狀態(tài)切換

            · 建立同步時(shí)鐘

            · 事件回發(fā)

            · 創(chuàng)建

            為什么要統(tǒng)一管理狀態(tài)切換?

            因?yàn)樘幱谕籊raph中的各個(gè)Filter的狀態(tài)切換往往需要遵循嚴(yán)格的先后順序。所以一般通過發(fā)送命令給Graph Manager的方式進(jìn)行各Filter的狀態(tài)變更。

            為什么要建立同步時(shí)鐘?

            比如聲像需要同步。

            2. Media Types

            結(jié)構(gòu)體AM_MEDIA_TYPE定義了媒體類型。

            主要包含如下結(jié)構(gòu):

            · Major type: 由一個(gè)GUID來表示。通常包含音視頻、未知流、MIDI等等。

            · Subtype: 由一個(gè)GUID來表示。Major type為視頻,則子類型可以包括RGB-24, RGB-32, UYVY

            · Format block: 說明圖形尺寸、幀率等信息。如果Major type為視頻,sub type為RGB-24,則Format block的信息會(huì)被自動(dòng)辨識(shí)。

            3. SampleAllocator

            需要注意的是,各個(gè)filter之間并不直接傳送它們各自進(jìn)行處理的數(shù)據(jù)的指針。它們通過一個(gè)暴露IMemAllocator接口的Com組件來分配內(nèi)存。填充了數(shù)據(jù)的內(nèi)存被封裝到Sample里面。各個(gè)Filter真正使用的是Sample。Sample通常包含:

            · 內(nèi)存指針

            · 時(shí)間戳

            · 標(biāo)識(shí)

            · 媒體類型(可選)

            這里當(dāng)一個(gè)Filter使用Sample的時(shí)候,它同時(shí)掌握這個(gè)Sample的引用計(jì)數(shù),這樣就有效杜絕了資源爭用現(xiàn)象的發(fā)生。

            4. Filter Graph中的硬件

            硬件被封裝到Filter中,任何與硬件的交互都轉(zhuǎn)化為與Filter的交互。

            二、 Graph-Building 組件

            Filter Graph Manager.

            Capture Graph Builder:設(shè)計(jì)的初衷是視頻捕獲,但是可以衍生很多用途。

            Filter Mapper and System Device Enumerator:枚舉可用的filter.

            DVD Graph Builder

            Video Control

            1. 智能拼接

            1) 如果在Graph里面有一個(gè)沒有輸入的Filter,那么Graph在完成自己的時(shí)候,就會(huì)考慮這個(gè)Filter。如果有一個(gè)已有的Filter的流出恰好與這個(gè)沒有輸入的Filter的流入相匹配,則將這兩個(gè)Filter連接。

            2) Graph在完成自己的過程中也會(huì)查找所有注冊過的Filter與當(dāng)前非終點(diǎn)Filter的流出進(jìn)行匹配。注冊的Filter會(huì)有一個(gè)權(quán)值,作為Graph進(jìn)行連接嘗試的優(yōu)先級(jí)依據(jù)。

            步驟:

            1) 使用IStreamBuilder(如果pin實(shí)現(xiàn)了這個(gè)接口,但大多數(shù)情況沒有)。(否則2)

            2) 查找被緩存的Filter。(否則3)

            3) 查找Graph現(xiàn)有的Filter。(否則4)

            4) 查找所有注冊了的Filter。

            2. 關(guān)鍵方法

            IFilterGraph::ConnectDirect:直接連接兩個(gè)Filter,如不成功,返回失敗。

            IGraphBuilder::Connect:連接兩個(gè)Filter,如果可能,直接連接,否則通過中間Filter(s)進(jìn)行連接。

            IGraphBuilder::Render:你自己建立了一系列從源開始的Filter,基于這些Filter(s)完成Graph。

            IGraphBuilder::RenderFile:從一個(gè)文件開始完成Graph.

            IFilterGraph::AddFilter:向Graph中添加一個(gè)Filter

            通過這些方法,你可以:

            1、 由Graph Manager建立整個(gè)Graph。(通過RenderFile)

            2、 由Graph Manager建立部分Graph。(比如你想自己寫一個(gè)AVI文件,當(dāng)然也可以通過Render來生成預(yù)覽)

            3、 完全手動(dòng)建立整個(gè)Graph。(需要自己AddFilter,還需要自己Connect)。

            三、 Direct Show 數(shù)據(jù)流概述

            1. 關(guān)鍵接口(方法)

            IMediaSample:對(duì)Filter之間使用的內(nèi)存的封裝。

            IMemAllocator::GetBuffer:從allocator獲取Buffer(即ImediaSimple的實(shí)現(xiàn)對(duì)象)

            摘要:

            由于Render會(huì)按照時(shí)間戳來Render數(shù)據(jù),所以它會(huì)一直占用它的上一級(jí)Filter流入的Simple,直到時(shí)間戳所標(biāo)識(shí)的時(shí)間到達(dá)。所以當(dāng)上一級(jí)Filter用完了allocator的Simple池中的Simple時(shí),會(huì)阻塞而不處理,進(jìn)而反向影響到更上一級(jí)的Filters,從而使它們變?yōu)榈却臓顟B(tài)。同時(shí)由于時(shí)間戳對(duì)于Render的時(shí)間上的要求,所有上級(jí)Render都必須在Simple的時(shí)間戳標(biāo)識(shí)的時(shí)間到達(dá)之前處理完自己對(duì)于該Simple的動(dòng)作。

            2. Transport(傳送)

            · Push Model(推送模型):上層filter(pin-out)將處理好的數(shù)據(jù)推送給下層filter(pin-in)。下層filter在需要數(shù)據(jù)的時(shí)候通過IMemInputPin::Receive來獲取數(shù)據(jù)。

            · Pull Model(抓取模型):下層filter(pin-in)在需要數(shù)據(jù)的時(shí)候,通過IAsyncReader異步向上層filter請求數(shù)據(jù)。(通常用于視頻文件的回放)

            3. Samples and Allocators

            1) 引用計(jì)數(shù)

            上層Filter(pin-out)通過IMemAllocator::GetBuffer向Allocator申請Simple,如果此時(shí)沒有Simple的引用計(jì)數(shù)為0,則說明Allocator的Simple池中沒有可用的Simple,則GetBuffer的調(diào)用會(huì)被阻塞。一旦Simple池中出現(xiàn)可用的Simple,則先前阻塞的GetBuffer放行,并獲取一個(gè)引用計(jì)數(shù)變?yōu)?的Simple。此Simple處理后,傳遞給下層Filter(pin-in),下層Filter如果在Receive方法中處理Simple,則它與上層Filter的處理處于同一線程中,Simple的引用計(jì)數(shù)不會(huì)變化,如果下層Filter需要通過創(chuàng)建線程異步使用上層推入的Simple進(jìn)行處理,則該Simple的引用計(jì)數(shù)會(huì)加1,變?yōu)?.之后如果上層Filter的推送線程結(jié)束,則Simple的引用計(jì)數(shù)減1,變?yōu)?.

            2) 提交和撤銷Allocator

            IMemAllocator::Commit,在被調(diào)用之前,所有的GetBuffer無效,

            調(diào)用IMemAllocator::Decommit之后,所有的GetBuffer調(diào)用無效.

            4. Filter 狀態(tài)變化

            Filter狀態(tài)的變化由Graph Manager進(jìn)行控制。

            所有的狀態(tài)變化都是自低(Render Filter)向上(Source Filter)進(jìn)行的。比如暫停的時(shí)候,Render Filter會(huì)首先暫停,這時(shí)候Render之上的Filter中都會(huì)存有未能推送的Simple,此時(shí)相當(dāng)于在各個(gè)Filter之前都堆積了一些等待處理的數(shù)據(jù)。沿著Render向上的Filter逐個(gè)暫停,直到Source。當(dāng)狀態(tài)從暫停變化為開始的時(shí)候,Render會(huì)首先變化為開始狀態(tài),處理在它之前堆積的數(shù)據(jù),并釋放那些被占用的Simple。然后逐步向上直到Source,Source在能夠獲取Simple之后,數(shù)據(jù)繼續(xù)流入Graph,整個(gè)Graph進(jìn)入開始狀態(tài)。

            posted on 2008-02-22 22:10 littlegai 閱讀(1076) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 我的讀書筆記
            国内精品九九久久久精品| 成人国内精品久久久久一区| 久久91亚洲人成电影网站| 久久精品国产一区二区三区日韩| Xx性欧美肥妇精品久久久久久| 久久精品无码专区免费| 久久综合色老色| av无码久久久久久不卡网站| 久久99精品久久久久久水蜜桃| 伊人色综合久久天天人守人婷 | 亚洲国产精品无码久久一区二区| 久久99精品久久久久子伦| 久久精品无码专区免费| 久久午夜羞羞影院免费观看| 国产亚洲成人久久| 777午夜精品久久av蜜臀| 久久久久国产视频电影| 久久国产色AV免费观看| 亚洲а∨天堂久久精品9966| 97久久超碰成人精品网站| 久久久无码精品亚洲日韩京东传媒 | 99久久国产综合精品五月天喷水 | 三级三级久久三级久久| 狠狠综合久久综合中文88| 999久久久无码国产精品| 无码伊人66久久大杳蕉网站谷歌 | 日韩va亚洲va欧美va久久| 青青草国产成人久久91网| 久久综合狠狠综合久久| 久久精品aⅴ无码中文字字幕不卡| 久久伊人中文无码| 欧美伊人久久大香线蕉综合69| 伊人久久免费视频| 国产精品久久久久天天影视| 欧美激情精品久久久久久| 亚洲精品乱码久久久久久按摩| 人人狠狠综合久久亚洲| 精品久久久久久久久久中文字幕 | 久久精品国产亚洲AV大全| 久久精品午夜一区二区福利| 久久久久亚洲AV成人片|