Как вызвать мой пользовательский декодер в исходном коде Android

Я пытаюсь добавить мой программный HEVC-декодер в исходный код Android. Я хочу создать файл libstagefright.so .

Я упомянул о других подобных вопросах и не очень помог мне. Я не смог получить четкую картину со следующими вопросами или справочным руководством.

1) Интеграция мультимедийной среды Codec в Android.

2) Интеграция пользовательского декодера для одновременного воспроизведения на Android и отображения кадров в секунду.

3) Как зарегистрировать ядро ​​OMX для добавления нового декодера.

Может кто-то, пожалуйста, помогите мне с шагами по интеграции нового пользовательского декодера с Android.

Прямо сейчас, я только что добавил в media_codecs.xml и { "OMX.google.h265.decoder" , "hevcdec" , "video_decoder.hevc" } в файл SoftOMXPlugin.cpp.

Какие другие файлы необходимо отредактировать для нового формата, который будет добавлен в исходный код Android? Какие функции вызывают исходный код моего декодера (вызывает ли исходный файл softomxcplugin мой декодер?).

Из вашего запроса и более ранних обсуждений, пожалуйста, найдите шаги по интеграции компонента HEVC в Android . Поскольку ваш компонент является компонентом SW , вам нужно будет интегрировать его с SoftVideoDecoderOMXComponent .

Что такое SoftVideoDecoderOMXComponent ?

В последних версиях платформы Android Stagefright SW ускоренные кодеки интегрированы в структуру с использованием OMX интерфейса. Раньше это было не так, и у него были некоторые проблемы. Таким образом, Google упростил интеграционную стратегию и обязал, чтобы все SW кодеки использовали интерфейс SoftOMXComponent .

Большинство вызовов OMX IL обрабатываются базовым классом, и, следовательно, реализация нового компонента кодека относительно проста, как описано ниже.

Я хотел бы привести пример интеграции кодеков AVC чтобы предоставить обзор. Настоятельно рекомендуется , чтобы читатель был знаком с спецификацией OMX IL 1.1.2, которая описывает структуру, функционирование и состояние машины компонента видеодекодера OMX IL .

Примечание: HEVC еще не является частью спецификации OMX IL и, следовательно, рекомендация в основном заключается в понимании структуры и функционирования компонента.

Создание компонента SoftHEVC

Пожалуйста, обратитесь к файлу заголовка SoftAVC.h и соответствующему источнику SoftAVC.cpp .

Вам придется реализовать аналогичный набор файлов. Настоятельно рекомендуется повторно использовать общую реализацию AVC из-за некоторых присущих сходств.

Реализация SoftHEVC.cpp

  1. Вам нужно будет определить компонент SoftHEVC.h в SoftHEVC.h который происходит из SoftVideoDecoderOMXComponent . Это гарантирует, что все вызовы OMX обрабатываются базовым классом.

  2. Вам нужно будет определить таблицу комбинаций level profile поддержки, найденную в CodecProfileLevel .

  3. В constructor вы можете инициализировать большинство переменных аналогичным образом. Поскольку это компонент видеодекодера, вам придется инициализировать 2 порта, а именно: input и output . ctor вызывает initDecoder для инициализации компонента. Вам также потребуется реализовать аналогичную функциональность для вашего кодека.

  4. dtor сам объясняет, и, следовательно, я dtor объяснение.

  5. onQueueFilled вызывается, когда для обработки на input порту предоставляется буфер, заполненный фреймовым значением битовых потоков, или для output предоставляется свободный буфер. Это вызывает основную функцию декодирования H264SwDecDecode . Теперь для первого кадра вы можете столкнуться с изменением разрешений по сравнению с первоначально инициализированным разрешением. Это обрабатывается двумя сценариями, как описано в следующем пункте.

  6. Вы бы handlePortSettingsChanged 2 функции handlePortSettingsChanged и handleCropRectEvent . Эти 2 события важны с точки зрения выходного буфера. handlePortSettingsChanged означает изменение размеров выходного буфера по сравнению с первоначально инициализированным размером и, следовательно, обеспечивает обратный вызов для пользователя, чтобы освободить текущее распределение и перераспределить его. handleCropRectEvent указывает, что окно __cropping__, которое сообщается пользователю. Обычно это не требует перераспределения буфера.

  7. drainOneOutputBuffer скопирует декодированный кадр в буфер выходного порта и уведомит вызывающего абонента о доступности декодированного буфера.

  8. В onQueueFilled после успешного декодирования входной буфер, который был использован, также возвращается обратно вызывающему.

  9. Остальные функции очень просты, и я чувствую, что вы можете просто использовать большую часть реализации.

  10. Для регистрации компонента вам необходимо реализовать createSoftOMXComponent который создает компонент SoftHEVC как показано здесь .

Поскольку вы уже обработали зарегистрированный компонент, я пропущу эту часть. Для справки я предполагаю, что вы зарегистрировали компонент в массиве SoftOMXPlugin в SoftOMXPlugin . Кроме того, поскольку HEVC не является известным типом MIME , вам придется регистрировать его. В MediaDefs.cpp произойдут изменения, в которых вам нужно будет ввести новую запись MEDIA_MIMETYPE_VIDEO_HEVC подобную существующим форматам, таким как AVC и поддерживать изменения в OMXCodec.cpp и ACodec.cpp .

С этими шагами я предполагаю, что вы должны быть способны интегрировать ваш SW декодер и сможете реализовать свое воспроизведение.