17

OpenMAX を使用せずに、 Raspberry Pi でビデオを直接デコードする例を探しています。

これは、マルチメディア ソフトウェアのさまざまなレイヤーについて説明しています。

ラズベリーパイのアーキテクチャ

ここには示されていない追加のレイヤーがあります。これは、OpenMAX の Broadcom ラッパーである (私が信じている) " MMAL " レイヤーです。(そうでない場合は、カーネル ドライバーの上にある OpenMAX の代替になります) たとえば、raspivid と raspistill は MMAL を使用して記述されます。

入力が生のH.264で、出力がメモリ内のビデオまたは画面上のビデオのいずれかであるビデオデコードの例が必要です。OpenMAXを使用せずに、VCHIQを直接使用してこれを行いたいです。(主にパフォーマンスと柔軟性の理由から)

この github リポジトリ: https://github.com/raspberrypi/userland/には、上記のすべてのソース (オレンジと緑のボックス、VCHIQ 自体のソース、VCHIQ 上の OpenMAX IL 実装、OpenGL および EGL 実装、. ..)。したがって、理論的には、始めるのに十分なはずです。問題は、OpenMAX や一般的なマルチメディア フレームワークに精通している場合でも、その使用方法が非常にわかりにくいことです。

例: vchiq_bulk_transmit () は、ビデオをデコーダーに送信するために使用する関数のようです。しかし、 type の最初の引数を初期化する方法はVCHIQ_SERVICE_HANDLE_T? フレームバッファ、結果ハンドル、または...?

EDIT報奨金は、vchiq を使用したビデオ デコードの実例、呼び出しシーケンスを示す API ウォークスルー (実例ではありませんが)、またはこれを書くのに十分なドキュメントへのポインタを提供することによって収集できます。実際の例では、多額の追加の報奨金が得られます:)

4

2 に答える 2

2

実際の例はありませんが、API ウォークスルーがあります。一種の..

完全なソース コードへのリンク

呼び出す方法を示す次の関数を見つけましたvchiq_bulk_transmit

int32_t vchi_bulk_queue_transmit(VCHI_SERVICE_HANDLE_T handle,
    void *data_src,
    uint32_t data_size,
    VCHI_FLAGS_T flags,
    void *bulk_handle)
{
    SHIM_SERVICE_T *service = (SHIM_SERVICE_T *)handle;
    ..
    status = vchiq_bulk_transmit(service->handle, data_src,
        data_size, bulk_handle, mode);
    ..
    return vchiq_status_to_vchi(status);
}
EXPORT_SYMBOL(vchi_bulk_queue_transmit);

作成する機能がありますVCHI_SERVICE_HANDLE_T

int32_t vchi_service_create(VCHI_INSTANCE_T instance_handle,
    SERVICE_CREATION_T *setup,
    VCHI_SERVICE_HANDLE_T *handle)
{
    VCHIQ_INSTANCE_T instance = (VCHIQ_INSTANCE_T)instance_handle;
    SHIM_SERVICE_T *service = service_alloc(instance, setup);

    *handle = (VCHI_SERVICE_HANDLE_T)service;
    ..
    return (service != NULL) ? 0 : -1;
}
EXPORT_SYMBOL(vchi_service_create);

ただし、VCHI_INSTANCE_Tここで初期化できる が必要です

int32_t vchi_initialise(VCHI_INSTANCE_T *instance_handle)
{
    VCHIQ_INSTANCE_T instance;
    VCHIQ_STATUS_T status;

    status = vchiq_initialise(&instance);

    *instance_handle = (VCHI_INSTANCE_T)instance;

    return vchiq_status_to_vchi(status);
}
EXPORT_SYMBOL(vchi_initialise);
于 2016-02-03T19:03:36.037 に答える
0

マルチメディア処理では、openmax の方がパフォーマンスが高いと思います。gstreamer のそれぞれのパイプラインを実行するだけで、この 2 つの代替案のパフォーマンスを比較できます。このアクションにはプログラミングは必要なく、この目的のために gst-launch を使用できます。gstreamer の Openmax プラグインは、'omx' プレフィックスで始まります。メインCPUに負荷がかからない間、omxで完全に実行されるコーディングおよびデコード操作。h264 コーディングまたはデコードの独自の実装は非常に困難な問題であり、ライブラリを使用しなければ、何年も費やすことができます。

于 2014-01-11T15:44:18.603 に答える