4

내 소프트웨어 HEVC 디코더를 안드로이드 소스 코드에 추가하려고합니다. libstagefright.so 파일을 생성하고 싶습니다.안드로이드 소스 코드에서 내 사용자 정의 디코더를 호출하는 방법

다른 유사한 질문을 언급했지만 나에게 많은 도움이되지 못했습니다. 다음 질문이나 참조 가이드로 명확한 그림을 얻을 수 없었습니다.

1) 코덱을 Android 멀티미디어 프레임 워크에 통합.

2) 동시에 맞춤형 디코더를 통합하여 android 및 fps를 재생할 수 있습니다.

3) 새로운 디코더를 추가하기 위해 OMX 코어를 등록하는 방법.

누군가가 새로운 맞춤식 디코더를 Android와 통합하는 단계를 도와 줄 수 있습니까?

지금 막 SoftOMXPlugin.cpp 파일에 media_codecs.xml 및 { "OMX.google.h265.decoder" , "hevcdec" , "video_decoder.hevc" }을 추가했습니다.

새로운 형식을 Android 소스 코드에 추가하려면 어떤 파일을 편집해야합니까? 내 디코더 소스 코드를 호출하는 함수 (softmxcplugin 소스 파일이 내 디코더를 호출합니까?).

답변

5

쿼리 및 이전 토론에서 HEVC 구성 요소를 Android 프레임 워크에 통합하는 단계를 찾아보십시오. 구성 요소가 SW 구성 요소이기 때문에 SoftVideoDecoderOMXComponent과 같은 구성 요소를 통합해야합니다.

SoftVideoDecoderOMXComponent은 무엇입니까? AndroidStagefright 프레임 워크의 최신 릴리스에서는

SW 가속 코덱 인터페이스와 같은 OMX를 사용하여 프레임 워크에 통합되어 있습니다. 이전에는 이것이 사실이 아니며 자체의 일부 도전 과제가있었습니다. 따라서 Google은 통합 전략을 간소화했으며 모든 SW 코덱은 SoftOMXComponent 인터페이스를 채택 할 것을 요구했습니다.

OMX IL 호출의 다수는 기본 클래스에 의해 처리되므로 새로운 코덱 구성 요소의 구현은 아래에 설명 된 것처럼 비교적 쉽습니다.

개요를 제공하기 위해 AVC 코덱 통합 예제를 사용합니다. ,이 독자가 OMX IL 1.1.2 specification을 잘 알고 있으며 OMX IL 비디오 디코더 구성 요소의 구조, 기능 및 상태를 설명하는 것이 좋습니다.

참고HEVC 아직 OMX IL 명세서의 일부가 아니며, 따라서, 추천 구성 요소의 구조와 기능을 이해하는 중심이다.

창조 구성 요소 SoftHEVC

SoftAVC.h의 헤더 파일과 해당 소스 SoftAVC.cpp를 참조하십시오.

비슷한 파일 집합을 구현해야합니다. 일부 유사한 점 때문에 전체 구현을 AVC에서 다시 사용하는 것이 좋습니다.

SoftHEVC.cpp 구현

  1. 당신은 SoftVideoDecoderOMXComponent에서 파생 SoftHEVC.hSoftHEVC 구성 요소를 정의해야합니다. 이렇게하면 모든 OMX 호출이 기본 클래스에 의해 적절하게 처리됩니다.

  2. CodecProfileLevel에있는 지원 profile - level 조합을 정의해야합니다.

  3. constructor에서 대부분의 변수를 비슷한 방식으로 초기화 할 수 있습니다. 이것은 비디오 디코더 구성 요소이므로 inputoutput의 두 포트를 초기화해야합니다. ctorinitDecoder을 호출하여 구성 요소를 초기화합니다. 코덱에도 비슷한 기능을 구현해야합니다.

  4. dtor은 자체 설명이므로 생략하겠습니다.

  5. onQueueFilled은 비트 스트림 데이터의 가치가있는 프레임으로 채워진 버퍼가 input 포트에서 처리하기 위해 제공되거나 프리 버퍼가 output에 제공 될 때 호출됩니다. 그러면 기본 디코딩 기능 H264SwDecDecode이 호출됩니다. 이제 첫 번째 프레임에서는 원래 초기화 된 해상도와 비교하여 해상도가 변경 될 수 있습니다. 이것은 다음 요점에서 설명하는 두 시나리오에 의해 처리됩니다.

  6. 두 개의 함수 handlePortSettingsChangedhandleCropRectEvent을 관찰 할 것입니다. 이 2 가지 이벤트는 출력 버퍼의 관점에서 중요합니다. handlePortSettingsChanged은 원래 초기화 된 크기와 비교하여 출력 버퍼 크기가 인 경우 변경을 의미하므로 현재 할당을 해제하고 동일한 할당량을 재 할당하기위한 이벤트 콜백을 사용자에게 제공합니다. handleCropRectEvent은 사용자에게 전달되는 __cropping 창을 나타냅니다. 일반적으로 버퍼 재 할당이 필요하지 않습니다.

  7. drainOneOutputBuffer은 디코딩 된 프레임을 출력 포트의 버퍼에 복사하고 notify the caller about the availability은 디코딩 된 버퍼를 복사합니다.

  8. onQueueFilled에서 성공적으로 디코딩 한 후 input buffer which has been consumed is also returned back을 호출자에게 보냅니다.

  9. 나머지 기능은 매우 간단하며 대부분의 구현을 재사용 할 수 있다고 생각합니다.

  10. 구성 요소를 등록하려면 here과 같이 SoftHEVC 구성 요소를 생성하는 createSoftOMXComponent을 구현해야합니다.

등록 된 구성 요소를 이미 처리 했으므로 그 부분을 건너 뜁니다. 참고로, kComponents 배열의 구성 요소를 SoftOMXPlugin에 등록했다고 가정합니다. 또한 HEVC은 알려진 MIME 유형이 아니므로 동일한 유형으로 등록해야합니다. MediaDefs.cpp에는 AVC과 같은 기존 형식과 비슷한 MEDIA_MIMETYPE_VIDEO_HEVCOMXCodec.cppACodec.cpp과 같은 새로운 항목을 추가해야 할 곳이 있습니다.

위 단계를 통해 SW 디코더를 통합하고 재생을 실현할 수 있어야한다고 생각합니다.

+0

답장을 보내 주셔서 감사합니다. 제공된 단계를 따라 libstagefright_hevc_decoder.so를 생성 할 수있었습니다. 이제 소프트웨어 디코더가 완벽하게 통합되었는지 여부를 알 수 없습니다. 태블릿에서 테스트하기 전에 libstagefright 파일을 테스트하기위한 옵션을 찾으려고합니다. 하드웨어를 플래시/포맷해야하는 것과 같이 libstagefright를 제 하드웨어와 통합하는 단계를 도와 줄 수 있다면 고맙겠습니다. – sayedjuned

+0

@sayedjuned .. 스트림의 모습은 어떻습니까? 기본 스트림입니까, 아니면 컨테이너 형식입니까? 컨테이너 형식이라면 inbuilt'stagefright' 실행 파일을 사용하여 테스트 할 수 있습니다. 기본 스트림 인 경우이를 처리 할 수있는 새로운 '스테이지 프리 (Stagefright)'실행 파일을 다시 빌드해야합니다. 이 단계들은 화면에 디스플레이를 보장하지 않으며, 같은 것에 관심이 있다면'MediaPlayer '로 테스트해야합니다. 확인하고 싶은 경로를 공유하십시오 – Ganesh

+0

내 스트림이 기본 스트림이고 장치에 비디오를 표시하고 싶습니다. 기본 스트림 테스트를위한 libstagefright 실행 파일에 필요한 변경 사항을 알려주십시오. – sayedjuned