2013-10-03 2 views
17

나는 OpenMAX를 사용하지 않고 라즈베리 파이 에서 비디오를 디코딩하는 예를 직접으로 찾고 있습니다.OpenMAX를 사용하지 않고 Raspberry Pi에서 비디오를 디코딩 하시겠습니까?

이 멀티미디어 소프트웨어의 다른 레이어를 설명 : 여기에 표시되지 않는 추가 계층,이다 "MMAL"레이어 (내가 믿는) OpenMAX 주위에 브로드 래퍼가있다

Raspberry Pi Architecture

. (그렇지 않다면 커널 드라이버 위에 앉아있는 OpenMAX 대안이 될 것입니다.) 예를 들어, raspivid와 raspistill은 MMAL을 사용하여 작성됩니다.

입력이 원시 H.264이고 비디오의 출력이 메모리의 비디오이거나 화면의 비디오 인 비디오 디코딩 예제가 필요합니다. 내가 직접 VCHIQ를 사용하여 을하고 OpenMAX를 사용하지 않기를 바란다.

이 github 저장소 : https://github.com/raspberrypi/userland/에는 위에 표시된 모든 것 (주황색 및 녹색 상자, VCHIQ 자체 소스, VCHIQ 상단의 OpenMAX IL 구현, OpenGL 및 EGL 구현, ...). 이론적으로 시작하기에 충분해야합니다. 문제는 오픈 맥스와 멀티미디어 프레임 워크에 익숙한 사람이라 할지라도 그것을 사용하는 방법이 매우 명백하지 않다는 것입니다.

예 : vchiq_bulk_transmit()은 비디오를 디코더에 보내는 기능입니다. 그러나 형식 VCHIQ_SERVICE_HANDLE_T의 첫 번째 인수를 초기화하는 방법은 무엇입니까? 결과는 프레임 버퍼 또는 결과 핸들에서 어디로 이동합니까?

EDIT 현상금은 어느이 작성 vchiq, 호출 시퀀스를 보여주는 API 연습 (조차하지 않는 실시 예의 비록) 또는 충분한 문서에 대한 포인터를 사용하여 비디오 디코딩의 동작 예를 제공함으로써 회수 할 수있다. 작업 예제는 무거운 여분의 현상금을 얻을 것이다 :)

+1

OpenMAX를 사용하지 않는 특별한 이유가 있습니까? – drahnr

+1

@drahnr : 디코딩 된 데이터를 즉시 얻을 수있는 API가 필요합니다. OpenMAX IL은 많은 버퍼를 가지고 있으며, 구현이 그것으로 무엇을 할 수 있는지에 대한 특별한 제약이 없으며, 잠재적으로 여러 프레임을 버퍼링 할 수 있으며 API를 제어 할 방법이 없습니다. 데이터를 반환하는 데 상당히 느린 구현을 보았습니다 (처리량이 여전히 높고 데이터가 방금 지연됨). ... RPM에서 초당 1/60 초 이내에 OpenMAX를 사용하여 디코딩 된 프레임을 다시 얻는 방법을 보여주는 사람이이 질문에 답을 얻고 싶다면 역시 좋을 것입니다. –

+0

이것은 아마도 듣고 싶지만 H264 디코더를 구현하는 것은 매우 어렵습니다. 무료로 코드를 작성하는 단일 영혼에 대해서는 알지 못합니다 (500 피스 바운티를 넣었더라도). – karlphillip

답변

2

실습 예제가 없지만 API 연습이 있습니다. 의 정렬 ..

Link to the full source code

난 당신이 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); 
0

나는 멀티미디어 처리에서 더 많은 성능을 제공한다고 생각한다. gstreamer 용 파이프 라인을 실행하는이 두 가지 대안의 성능을 비교할 수 있습니다. 이 작업을 위해 프로그래밍이 필요하지 않으며 gst-launch를 사용할 수 있습니다. gstreamer 용 Openmax 플러그인은 'omx'접두어로 시작합니다. 메인 CPU가 무부하 상태에서 omx로 완벽하게 실행되는 코딩 및 디코딩 작업. h264 코딩 또는 디코딩을위한 독자적인 구현은 매우 어려운 문제이며 라이브러리를 사용하지 않고도 오랜 기간 동안 사용할 수 있습니다.

+0

Xuch, 고맙습니다. 질문을 오해 한 것 같습니다. VideoCore 가속화를 사용하여 디코딩하고 싶지만 OpenMAX API 레이어를 거치지 않고 바로 하위 레이어 인 VCHIQ API로 직접 이동하려고합니다. CPU로드는 문제가되지 않습니다. –