close

OpenCore的另外一個常用的稱呼是PacketVideo,它是Android的多媒體核心。PacketVideo是一家公司的名稱,OpenCore是這套多媒體框架的軟體層的名稱。在Android的開發者層次看,二者的含義基本相同。對比Android的其他程式程式庫,OpenCore的程式碼非常龐大,它是一個基于C++的實現,定義了全功能的作業系統移植層,各種基本的功能均被封裝成類的形式,各層次之間的介面多使用繼承等方式。OpenCore是一個多媒體的框架,從巨集觀上來看,它主要包含了兩大方面的內容:

  * PVPlayer:提供媒體播放器的功能,完成各種聲訊(Audio)、視訊(Video)流的重播(Playback)功能

  * PVAuthor:提供媒體流記錄的功能,完成各種聲訊(Audio)、視訊(Video)流的以及靜態影像擷取功能

 

  PVPlayerPVAuthorSDK的形式提供給開發者,可以在這個SDK之上搆建多種應用程式和服務。比如在移動終端機中常常使用的多媒體應用程式,例如媒體播放器、照相機、錄像機、錄音機等等。

  為了更好的組織整體的架搆,OpenCore在軟體層次在巨集觀上分成几個層次:

  * OSCLOperating System Compatibility Library (作業系統相容程式庫),包含了一些作業系統底層的作業,為了更好地在不同作業系統移植。包含了基本資料類別、配置、字串工具、IO、錯誤處理、執行緒等內容,類似一個基礎的C++程式庫。

  * PVMFPacketVideo Multimedia Framework(PV多媒體框架),在框架內實現一個檔案解析(parser)和組成(composer)、編解碼的NODE,也可以繼承其通用的介面,在用戶層實現一些NODE

  * PVPlayer EnginePVPlayer引擎。

  * PVAuthor EnginePVAuthor引擎。

 

  事實上,OpenCore中包含的內容非常多:從播放的角度,PVPlayer的匯入(Source)是檔案或者網路媒體流,匯出(Sink) 是聲訊視訊的匯出裝置,其基本功能包含了媒體流控制、檔案解析、聲訊視訊流的解碼(Decode)等方面的內容。除了從檔案中播放媒體檔案之外,還包含了與網路相關的RTSP(Real Time Stream Protocol,實時流協定)。在媒體流記錄的方面,PVAuthor的匯入(Source)是照相機、麥克風等裝置,匯出(Sink)是各種檔案,包含了流的同步、聲訊視訊流的編碼(Encode)以及檔案的寫入等功能。

  在使用OpenCoreSDK的時候,有可能需要在應用程式層實現一個配接卡(Adaptor),然后在配接卡之上實現具體的功能,對于PVMFNODE也可以基于通用的介面,在上層實現,以插件的形式使用。


第二部分 OpenCore的程式碼架構

  2.1 程式碼架構

  以開源Android的程式碼為例,OpenCore的程式碼在以下目錄中:external/opencore/。這個目錄是OpenCore的根目錄,其中包含的子目錄如下所示:

  * android 這裡面是一個上層的程式庫,它基于PVPlayerPVAuthorSDK實現了一個為Android使用的PlayerAuthor

  * baselibs 包含資料架構和執行緒安全等內容的底層程式庫

  * codecs_v2 這是一個內容較多的程式庫,主要包含編解碼的實現,以及一個OpenMAX的實現

  * engines 包含PVPlayerPVAuthor引擎的實現

  * extern_libs_v2 包含了khronosOpenMAX的標頭檔案

  * fileformats 檔案格式的解析(parser)工具

  * nodes 提供一些PVMFNODE,主要是編解碼和檔案解析方面的。

  * oscl 作業系統相容程式庫

  * pvmi: 匯入匯出控制的抽象介面

  * protocols 主要是與網路相關的RTSPRTPHTTP等協定的相關內容

  * tools_v2 編譯工具以及一些可註冊的模組。

 

  在external/opencore/目錄中還有2個檔案,如下所示:

  * Android.mk 全域的編譯檔案

  * pvplayer.conf 配置檔案

 

  在external/opencore/的各個子檔案夾中包含了眾多的Android.mk檔案,它們之間還存在着“遞迴”的關係。例如根目錄下的Android.mk,就包含了如下的內容片斷:

  include $(PV_TOP)/engines/player/test/Android.mk

  include $(PV_TOP)/engines/author/test/Android.mk

  include $(PV_TOP)/engines/2way/test/Android.mk

 

  這表示了要參照若干檔案夾下面的Android.mk檔案。external/opencore/的各個Android.mk檔案可以按照排列組合進行使用,將几個Android.mk內容合併在一個程式庫當中。

 

  2.2 編譯架構

  1.程式庫的層次關係:在Android的開源版本中編譯出來的內容,OpenCore編譯出來的各個程式庫如下所示:

  * libopencorecommon.so OpenCore底層的公用程式庫

  * libopencoredownloadreg.so :下載註冊程式庫

  * libopencoredownload.so 下載功能實現程式庫

  * libopencoremp4reg.so MP4註冊程式庫

  * libopencoremp4.so MP4功能實現程式庫

  * libopencorenet_support.so 網路支援程式庫

      * libopencoreplayer.so OpenCorePlayer程式庫

  * libopencoreauthor.so OpenCoreAuthor程式庫

  * libopencorertspreg.so RTSP註冊程式庫

  * libopencorertsp.so RTSP功能實現程式庫

 

  OpenCore的各個程式庫之間具有如下的關係:

  libopencorecommon.so 是所有的程式庫的依賴程式庫,提供了公用的功能;

  libopencoreplayer.so libopencoreauthor.so是兩個并立的程式庫,分別用于重播和記錄,而且這兩個程式庫是OpenCore對外的介面程式庫;

  libopencorenet_support.so 提供網路支援的功能;

  一些功能以插件(Plug-In)的方式擺入Player中使用,每個功能使用兩個程式庫,一個實現具體功能,一個用于註冊。

 

  2.libopencorecommon.so程式庫的架構

  libopencorecommon.so是整個OpenCore的核心程式庫,它的編譯控制的檔案的路徑為pvcommon/Android.mk,這個檔案使用遞迴的方式搜尋子檔案:

  include $(BUILD_SHARED_LIBRARY)

  include $(PV_TOP)//oscl/oscl/osclbase/Android.mk

  include $(PV_TOP)//oscl/oscl/osclerror/Android.mk

  include $(PV_TOP)//oscl/oscl/osclmemory/Android.mk

  include $(PV_TOP)//oscl/oscl/osclutil/Android.mk

  include $(PV_TOP)//oscl/pvlogger/Android.mk

  include $(PV_TOP)//oscl/oscl/osclproc/Android.mk

  include $(PV_TOP)//oscl/oscl/osclio/Android.mk

  include $(PV_TOP)//oscl/oscl/osclregcli/Android.mk

  include $(PV_TOP)//oscl/oscl/osclregserv/Android.mk

  include $(PV_TOP)//oscl/unit_test/Android.mk

  include $(PV_TOP)//oscl/oscl/oscllib/Android.mk

  include $(PV_TOP)//pvmi/pvmf/Android.mk

  include $(PV_TOP)//baselibs/pv_mime_utils/Android.mk

  include $(PV_TOP)//nodes/pvfileoutputnode/Android.mk

  include $(PV_TOP)//baselibs/media_data_structures/Android.mk

  include $(PV_TOP)//baselibs/threadsafe_callback_ao/Android.mk

  include $(PV_TOP)//codecs_v2/utilities/colorconvert/Android.mk

  include $(PV_TOP)//codecs_v2/audio/gsm_amr/amr_nb/common/Android.mk

  include $(PV_TOP)//codecs_v2/video/avc_h264/common/Android.mk

 

這些被包含的Android.mk檔案真正指定需要編譯的檔案,這些檔案在Android.mk的目錄及其子目錄中。事實上,在libopencorecommon.so程式庫中包含了以下內容:

  * OSCL的所有內容

  * Pvmf框架部分的內容(pvmi/pvmf/Android.mk)

  * 基礎程式庫中的一些內容(baselibs)

  * 編解碼的一些內容

  * 檔案匯出的node(nodes/pvfileoutputnode/Android.mk)

 

  從程式庫的架構中可以看出,最終生成程式庫的架構與OpenCore的層次關係并非完全重合。libopencorecommon.so程式庫中就包含了底層的OSCL的內容、PVMF的框架以及Node和編解碼的工具。

 

  3.libopencoreplayer.so程式庫的架構

 

  libopencoreplayer.so是用于播放的功能程式庫,它的編譯控制的檔案的路徑為pvplayer/Android.mk,它包含了以下的內容:

  include $(BUILD_SHARED_LIBRARY)

  include $(PV_TOP)//engines/player/Android.mk

  include $(PV_TOP)//codecs_v2/audio/aac/dec/util/getactualaacconfig/Android.mk

  include $(PV_TOP)//codecs_v2/video/avc_h264/dec/Android.mk

  include $(PV_TOP)//codecs_v2/audio/aac/dec/Android.mk

  include $(PV_TOP)//codecs_v2/audio/gsm_amr/amr_nb/dec/Android.mk

  include $(PV_TOP)//codecs_v2/audio/gsm_amr/amr_wb/dec/Android.mk

  include $(PV_TOP)//codecs_v2/audio/gsm_amr/common/dec/Android.mk

  include $(PV_TOP)//codecs_v2/audio/mp3/dec/Android.mk

  include $(PV_TOP)//codecs_v2/utilities/m4v_config_parser/Android.mk

  include $(PV_TOP)//codecs_v2/utilities/pv_video_config_parser/Android.mk

  include $(PV_TOP)//codecs_v2/omx/omx_common/Android.mk

  include $(PV_TOP)//codecs_v2/omx/omx_queue/Android.mk

  include $(PV_TOP)//codecs_v2/omx/omx_h264/Android.mk

  include $(PV_TOP)//codecs_v2/omx/omx_aac/Android.mk

  include $(PV_TOP)//codecs_v2/omx/omx_amr/Android.mk

  include $(PV_TOP)//codecs_v2/omx/omx_mp3/Android.mk

  include $(PV_TOP)//codecs_v2/omx/factories/omx_m4v_factory/Android.mk

  include $(PV_TOP)//codecs_v2/omx/omx_proxy/Android.mk

include $(PV_TOP)//nodes/common/Android.mk

  include $(PV_TOP)//pvmi/content_policy_manager/Android.mk

  include $(PV_TOP)//pvmi/content_policy_manager/plugins/oma1/passthru/Android.mk

  include $(PV_TOP)//pvmi/content_policy_manager/plugins/common/Android.mk

  include $(PV_TOP)//pvmi/media_io/pvmiofileoutput/Android.mk

  include $(PV_TOP)//fileformats/common/parser/Android.mk

  include $(PV_TOP)//fileformats/id3parcom/Android.mk

  include $(PV_TOP)//fileformats/rawgsmamr/parser/Android.mk

  include $(PV_TOP)//fileformats/mp3/parser/Android.mk

  include $(PV_TOP)//fileformats/mp4/parser/Android.mk

  include $(PV_TOP)//fileformats/rawaac/parser/Android.mk

  include $(PV_TOP)//fileformats/wav/parser/Android.mk

  include $(PV_TOP)//nodes/pvaacffparsernode/Android.mk

  include $(PV_TOP)//nodes/pvmp3ffparsernode/Android.mk

  include $(PV_TOP)//nodes/pvamrffparsernode/Android.mk

  include $(PV_TOP)//nodes/pvmediaoutputnode/Android.mk

  include $(PV_TOP)//nodes/pvomxvideodecnode/Android.mk

  include $(PV_TOP)//nodes/pvomxaudiodecnode/Android.mk

  include $(PV_TOP)//nodes/pvwavffparsernode/Android.mk

  include $(PV_TOP)//pvmi/recognizer/Android.mk

  include $(PV_TOP)//pvmi/recognizer/plugins/pvamrffrecognizer/Android.mk

  include $(PV_TOP)//pvmi/recognizer/plugins/pvmp3ffrecognizer/Android.mk

  include $(PV_TOP)//pvmi/recognizer/plugins/pvwavffrecognizer/Android.mk

  include $(PV_TOP)//engines/common/Android.mk

  include $(PV_TOP)//engines/adapters/player/framemetadatautility/Android.mk

  include $(PV_TOP)//protocols/rtp_payload_parser/util/Android.mk

  include $(PV_TOP)//android/Android.mk

  include $(PV_TOP)//android/drm/oma1/Android.mk

  include $(PV_TOP)//tools_v2/build/modules/linux_rtsp/core/Android.mk

include $(PV_TOP)//tools_v2/build/modules/linux_rtsp/node_registry/Android.mk

  include $(PV_TOP)//tools_v2/build/modules/linux_net_support/core/Android.mk

  include $(PV_TOP)//tools_v2/build/modules/linux_download/core/Android.mk

  include $(PV_TOP)//tools_v2/build/modules/linux_download/node_registry/Android.mk

  include $(PV_TOP)//tools_v2/build/modules/linux_mp4/core/Android.mk

  include $(PV_TOP)//tools_v2/build/modules/linux_mp4/node_registry/Android.mk

 

  libopencoreplayer.so中包含了以下內容:

 

  * 一些解碼工具

  * 檔案的解析器(mp4)

  * 解碼工具對應的Node

  * player的引擎部分(engines/player/Android.mk)

  * Androidplayer配接卡(android/Android.mk)

  * 識別工具(pvmi/recognizer)

  * 編解碼工具中的OpenMax部分(codecs_v2/omx)

  * 對應几個插件Node的註冊

 

  libopencoreplayer.so中的內容較多,其中主要為各個檔案解析器和解碼器,PVPlayer的核心功能在engines/player /Android.mk當中,而android/Android.mk的內容比對特殊,它是在PVPlayer之上搆建的一個為Android使用的播放器。

 

  4.libopencoreauthor.so程式庫的架構

  libopencoreauthor.so是用于媒體流記錄的功能程式庫,它的編譯控制的檔案的路徑為pvauthor/Android.mk,它包含了以下的內容:

  include $(BUILD_SHARED_LIBRARY)

  include $(PV_TOP)//engines/author/Android.mk

  include $(PV_TOP)//codecs_v2/video/m4v_h263/enc/Android.mk

  include $(PV_TOP)//codecs_v2/audio/gsm_amr/amr_nb/enc/Android.mk

  include $(PV_TOP)//codecs_v2/video/avc_h264/enc/Android.mk

  include $(PV_TOP)//fileformats/mp4/composer/Android.mk

  include $(PV_TOP)//nodes/pvamrencnode/Android.mk

  include $(PV_TOP)//nodes/pvmp4ffcomposernode/Android.mk

  include $(PV_TOP)//nodes/pvvideoencnode/Android.mk

  include $(PV_TOP)//nodes/pvavcencnode/Android.mk

  include $(PV_TOP)//nodes/pvmediainputnode/Android.mk

    include $(PV_TOP)//android/author/Android.mk

 

  libopencoreauthor.so中包含了以下內容:

  * 一些編碼工具(視訊流H263H264,聲訊流Amr)

  * 檔案的組成器(mp4)

  * 編碼工具對應的Node

  * 表示媒體匯入的Node(nodes/pvmediainputnode/Android.m)

  * author的引擎部分(engines/author/Android.mk)

  * Androidauthor配接卡(android/author/Android.mk)

  libopencoreauthor.so中主要為各個檔案編碼器和檔案組成器,PVAuthor的核心功能在engines/author /Android.mk當中,而android/author/Android.mk是在PVAuthor之上搆建的一個為Android使用的媒體記錄器。

 

  5.其他程式庫

  另外的几個程式庫的Android.mk檔案的路徑如下所示:

  網路支援程式庫libopencorenet_support.so

  tools_v2/build/modules/linux_net_support/core/Android.mk

 

  MP4功能實現程式庫libopencoremp4.so和註冊程式庫libopencoremp4reg.so

  tools_v2/build/modules/linux_mp4/core/Android.mk

  tools_v2/build/modules/linux_mp4/node_registry/Android.mk

 

  RTSP功能實現程式庫libopencorertsp.so和註冊程式庫libopencorertspreg.so

  tools_v2/build/modules/linux_rtsp/core/Android.mk

  tools_v2/builddrm/om#

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 moukyo 的頭像
    moukyo

    Hello! HCI++

    moukyo 發表在 痞客邦 留言(1) 人氣()