あなたの質問と以前の議論から、HEVC
コンポーネントをAndroid
フレームワークに統合する手順を見つけてください。コンポーネントはコンポーネントであるためSW
、同じものをSoftVideoDecoderOMXComponent
.
とはSoftVideoDecoderOMXComponent
?
Android
Stagefright
フレームワークの最新リリースでは、アクセラレートされたコーデックが同様のインターフェイスSW
を使用してフレームワークに統合されています。OMX
以前はそうではなく、独自の課題がいくつかありました。そのため、Google は統合戦略を合理化し、すべてのSW
コーデックがSoftOMXComponent
同様のインターフェースを採用することを義務付けました。
呼び出しの大部分はOMX IL
基本クラスによって処理されるため、以下で説明するように、新しいコーデック コンポーネントの実装は比較的簡単です。
AVC
コーデック統合の例を挙げて概要を説明します。読者は、ビデオ デコーダ コンポーネントの構造、機能、およびステート マシンを説明する1.1.2 仕様に精通していることが強く推奨されます。OMX IL
OMX IL
注: HEVC
はまだOMX IL
仕様の一部ではないため、主にコンポーネントの構造と機能を理解することをお勧めします。
SoftHEVC
コンポーネントの作成
SoftAVC.h
のヘッダファイルと対応するソースを参照してくださいSoftAVC.cpp
。
同様の一連のファイルを実装する必要があります。AVC
固有の類似点があるため、実装全体を再利用することを強くお勧めします。
SoftHEVC.cpp
実装
から派生するSoftHEVC
コンポーネントを定義する必要があります。これにより、すべての呼び出しが基本クラスによって適切に処理されるようになります。SoftHEVC.h
SoftVideoDecoderOMXComponent
OMX
にあるように、サポートの組み合わせのテーブルを定義する必要がprofile
ありlevel
ますCodecProfileLevel
。
では、constructor
ほとんどの変数を同様の方法で初期化できます。これはビデオ デコーダ コンポーネントであるため、2 つのポート、つまり と を初期化する必要がありinput
ますoutput
。ctor
a を呼び出しinitDecoder
てコンポーネントを初期化します。また、コーデックに同様の機能を実装する必要があります。
dtor
自明なので、同じ説明はスキップします。
onQueueFilled
は、フレームに相当するビットストリーム データで満たされたバッファがinput
ポート上で処理するために提供されるか、空きバッファが に提供されるときに呼び出されoutput
ます。これにより、メインのデコード機能が呼び出されますH264SwDecDecode
。ここで、最初のフレームで、最初に初期化された解像度と比較して解像度が変化する可能性があります。これは、次のポイントで説明する 2 つのシナリオで処理されます。
handlePortSettingsChanged
と の 2 つの関数を観察しhandleCropRectEvent
ます。これら 2 つのイベントは、出力バッファーの観点から重要です。最初に初期化されたサイズと比較して、出力バッファーのサイズが変化したhandlePortSettingsChanged
ことを示しているため、ユーザーにイベント コールバックを提供して、現在の割り当てを解放し、同じものを再割り当てします。
ユーザーに通知される __cropping window__ であることを示します。通常、これにはバッファの再割り当ては必要ありません。handleCropRectEvent
drainOneOutputBuffer
デコードされたフレームを出力ポートのバッファーにコピーし、デコードされたバッファーの可用性について呼び出し元に通知します。
ではonQueueFilled
、デコードが成功した後、消費された入力バッファも呼び出し元に返されます。
残りの関数は非常に簡単で、実装の大部分を単純に再利用できると思います。
コンポーネントを登録するには、ここに示すようにコンポーネントcreateSoftOMXComponent
を作成する実装を行う必要があります。SoftHEVC
すでに登録済みのコンポーネントを処理しているため、その部分はスキップします。kComponents
参考までに、配列にコンポーネントを登録していると思いますSoftOMXPlugin
。また、HEVC
既知のMIME
タイプではないため、同じものを登録する必要があります。および の変更をサポートするなどの既存の形式と同様にMediaDefs.cpp
、新しいエントリを導入する必要がある場所に変更が必要になります。MEDIA_MIMETYPE_VIDEO_HEVC
AVC
OMXCodec.cpp
ACodec.cpp
SW
これらの手順で、デコーダーを統合して再生できるようになるはずです。