android中openMax的實現

2021-08-04 12:26:20 字數 3134 閱讀 9026

2.source 主要是和協議打交道,demux 分解容器部分,大多數的容器格式的分解是不需要通過硬體來支援。只是ts流這種格式最可能用到硬體的支援。因為ts格式比較特殊,單包的大小太小了,只有188位元組。所以也是為什麼現在常見的解碼晶元都會提供硬體ts demux 的支援。

所以openmax 中硬體抽象的編譯碼是最為常用的,也是為什麼android中只用它來抽象code。

2.omxcodec通過iomx 依賴binder機制 獲得 omx服務,omx服務 才是openmax 在android中 實現。

3. omx把軟編譯碼和硬體編譯碼統一看作外掛程式的形式管理起來。

**分析:

awesomeplayer 中有個變數 

[cpp]view plain

copy

print?

omxclient mclient;  

omxclient mclient;
讓我們看看   omxclient 

[cpp]view plain

copy

print?

class omxclient   

private:  

spmomx;  

omxclient(const omxclient &);  

omxclient &operator=(const omxclient &);  

};  

class omxclient 

private:

spmomx;

omxclient(const omxclient &);

omxclient &operator=(const omxclient &);

};

omxclient 有個iomx 的變數 momx ,這個就是和omx服務進行binder通訊的。

在 awesomeplayer 的建構函式中會呼叫 

[cpp]view plain

copy

print?

check_eq(mclient.connect(), (status_t)ok);  

check_eq(mclient.connect(), (status_t)ok);
[cpp]view plain

copy

print?

status_t omxclient::connect()   

return ok;  

}  

status_t omxclient::connect() 

return ok;

}

[cpp]view plain

copy

print?

spmediaplayerservice::getomx()   

return momx;  

}  

spmediaplayerservice::getomx() 

return momx;

}

omxclient::connect函式是通過binder機制 獲得到mediaplayerservice,然後通過mediaplayerservice來建立omx的例項。這樣omxclient就獲得到了omx的入口,接下來

就可以通過binder機制來獲得omx提供的服務。

也就是說omxclient 是android中 openmax 的入口。

也就是說乙個

awesomeplayer對應著 乙個iomx 變數,

[cpp]view plain

copy

print?

spinte***ce()   

spinte***ce()
[cpp]view plain

copy

print?

maudiosource = omxcodec::create(  

mclient.inte***ce(), maudiotrack->getformat(),  

false, // createencoder

maudiotrack);  

maudiosource = omxcodec::create(

mclient.inte***ce(), maudiotrack->getformat(),

false, // createencoder

maudiotrack);

[cpp]view plain

copy

print?

mvideosource = omxcodec::create(  

mclient.inte***ce(), mvideotrack->getformat(),  

false, // createencoder

mvideotrack,  

null, flags, use_su***ce_alloc ? mnativewindow : null);  

mvideosource = omxcodec::create(

mclient.inte***ce(), mvideotrack->getformat(),

false, // createencoder

mvideotrack,

null, flags, use_su***ce_alloc ? mnativewindow : null);

[cpp]view plain

copy

print?

OpenMax 資料總結

最近在研究android 上的硬解,主要是了解openmax 的一些介面和呼叫時序,研究的過程中參考了以下資料,醉月的blog中opencore and omx core component interaction 一 二 鏈結,醉月翻譯的比較好,呼叫流程寫的很詳細,雖然寫的是opencore呼叫o...

OpenMax的介面與實現

openmax il層的介面定義由若干個標頭檔案組成,這也是實現它需要實現的內容,它們的基本描述如下所示。omx types.h openmax il的資料型別定義 omx core.h openmax il核心的api omx other.h 其他資料結構 包括a v 同步 omx index.h...

android 中layout weight的作用

layout weight 用於給乙個線性布局中的諸多檢視的重要度賦值。所有的檢視都有乙個layout weight值,預設為零,意思是需要顯示多大的檢視就佔據多大的螢幕空 間。若賦乙個高於零的值,則將父檢視中的可 用空間分割,分割大小具體取決於每乙個檢視layout weight 值以及該值在當前...