4

ソフトウェア HEVC デコーダーを Android ソース コードに追加しようとしています。libstagefright.soファイルを生成したいと考えています。

他の同様の質問を参照しましたが、あまり役に立ちませんでした。以下の質問やリファレンス ガイドでは、明確なイメージを得ることができませんでした。

1) コーデックを Android マルチメディア フレームワークに統合します。

2) カスタム デコーダーを統合して、Android で再生し、同時に fps を表示します。

3) 新しいデコーダーを追加するために OMX コアを登録する方法。

新しいカスタム デコーダーを Android に統合する手順を教えてください。

今、media_codecs.xml と{ "OMX.google.h265.decoder" , "hevcdec" , "video_decoder.hevc" }SoftOMXPlugin.cpp ファイルに を追加しました。

新しい形式を Android ソース コードに追加するには、他にどのファイルを編集する必要がありますか? デコーダのソース コードを呼び出す関数はどれですか (softomxcplugin ソース ファイルはデコーダを呼び出しますか?)。

4

1 に答える 1

5

あなたの質問と以前の議論から、HEVCコンポーネントをAndroidフレームワークに統合する手順を見つけてください。コンポーネントはコンポーネントであるためSW、同じものをSoftVideoDecoderOMXComponent.

とはSoftVideoDecoderOMXComponent?

Android Stagefrightフレームワークの最新リリースでは、アクセラレートされたコーデックが同様のインターフェイスSWを使用してフレームワークに統合されています。OMX以前はそうではなく、独自の課題がいくつかありました。そのため、Google は統合戦略を合理化し、すべてのSWコーデックがSoftOMXComponent同様のインターフェースを採用することを義務付けました。

呼び出しの大部分はOMX IL基本クラスによって処理されるため、以下で説明するように、新しいコーデック コンポーネントの実装は比較的簡単です。

AVCコーデック統合の例を挙げて概要を説明します。読者は、ビデオ デコーダ コンポーネントの構造、機能、およびステート マシンを説明する1.1.2 仕様に精通していることが強く推奨されます。OMX ILOMX IL

注: HEVCはまだOMX IL仕様の一部ではないため、主にコンポーネントの構造と機能を理解することをお勧めします。

SoftHEVCコンポーネントの作成

SoftAVC.hのヘッダファイルと対応するソースを参照してくださいSoftAVC.cpp

同様の一連のファイルを実装する必要があります。AVC固有の類似点があるため、実装全体を再利用することを強くお勧めします。

SoftHEVC.cpp実装

  1. から派生するSoftHEVCコンポーネントを定義する必要があります。これにより、すべての呼び出しが基本クラスによって適切に処理されるようになります。SoftHEVC.hSoftVideoDecoderOMXComponentOMX

  2. にあるように、サポートの組み合わせのテーブルを定義する必要がprofileありlevelますCodecProfileLevel

  3. では、constructorほとんどの変数を同様の方法で初期化できます。これはビデオ デコーダ コンポーネントであるため、2 つのポート、つまり と を初期化する必要がありinputますoutputctora を呼び出しinitDecoderてコンポーネントを初期化します。また、コーデックに同様の機能を実装する必要があります。

  4. dtor自明なので、同じ説明はスキップします。

  5. onQueueFilledは、フレームに相当するビットストリーム データで満たされたバッファがinputポート上で処理するために提供されるか、空きバッファが に提供されるときに呼び出されoutputます。これにより、メインのデコード機能が呼び出されますH264SwDecDecode。ここで、最初のフレームで、最初に初期化された解像度と比較して解像度が変化する可能性があります。これは、次のポイントで説明する 2 つのシナリオで処理されます。

  6. handlePortSettingsChangedと の 2 つの関数を観察しhandleCropRectEventます。これら 2 つのイベントは、出力バッファーの観点から重要です。最初に初期化されたサイズと比較して、出力バッファーのサイズが変化したhandlePortSettingsChangedことを示しているため、ユーザーにイベント コールバックを提供して、現在の割り当てを解放し、同じものを再割り当てします。 ユーザーに通知される __cropping window__ であることを示します。通常、これにはバッファの再割り当ては必要ありません。handleCropRectEvent

  7. drainOneOutputBufferデコードされたフレームを出力ポートのバッファーにコピーし、デコードされたバッファーの可用性について呼び出し元に通知します

  8. ではonQueueFilled、デコードが成功した後、消費された入力バッファも呼び出し元に返されます。

  9. 残りの関数は非常に簡単で、実装の大部分を単純に再利用できると思います。

  10. コンポーネントを登録するには、ここに示すようにコンポーネントcreateSoftOMXComponentを作成する実装を行う必要があります。SoftHEVC

すでに登録済みのコンポーネントを処理しているため、その部分はスキップします。kComponents参考までに、配列にコンポーネントを登録していると思いますSoftOMXPlugin。また、HEVC既知のMIMEタイプではないため、同じものを登録する必要があります。および の変更をサポートするなどの既存の形式と同様にMediaDefs.cpp、新しいエントリを導入する必要がある場所に変更が必要になります。MEDIA_MIMETYPE_VIDEO_HEVCAVCOMXCodec.cppACodec.cpp

SWこれらの手順で、デコーダーを統合して再生できるようになるはずです。

于 2014-03-13T00:27:57.603 に答える