ICS Video Render 과정

Android : 2012. 4. 20. 23:00
반응형

AwesomePlayer.cpp


AwesomeNativeWindowRenderer

가 있고 

AwesomeLocalRenderer

가 있다.



AwesomeLocalRenderer 는 소프트웨어이고


AwesomeNativeWindowRenderer 이게 하드웨어 쓰는거다.


void AwesomePlayer::initRenderer_l() {   에 보면

디코딩시에 OMX. 로 시작하는 라이브러리를 로딩하면 AwesomeNativeWindowRenderer  로 돈다.

그렇지 않을 경우에는 AwesomeLocalRenderer 로 돈다.



AwesomeNativeWindowRenderer  에서


    virtual void render(MediaBuffer *buffer) {

        int64_t timeUs;

        CHECK(buffer->meta_data()->findInt64(kKeyTime, &timeUs));

        native_window_set_buffers_timestamp(mNativeWindow.get(), timeUs * 1000);

        status_t err = mNativeWindow->queueBuffer(

                mNativeWindow.get(), buffer->graphicBuffer().get());

        if (err != 0) {

            ALOGE("queueBuffer failed with error %s (%d)", strerror(-err),

                    -err);

            return;

        }


이렇게 동작 하는데


중요한것은 buffer->graphicBuffer().get() 이다. 여기에 데이터 주소가 올라오는거 같다.


이 buffer가 render 의 파라메터로 들어오는 거니까 이 render가 사용되는 곳을 보도록 하자.



void AwesomePlayer::onVideoEvent() { 함수안에


다음과 같은 부분이 있다.


    if (mVideoRenderer != NULL) {

        mSinceLastDropped++;

        mVideoRenderer->render(mVideoBuffer);

    }


여기에 보면 render를 쓰는데 파라메터가 mVideoBuffer 이다. 이게 위에서 본 buffer 인것이다.



이 mVideoBuffer 는 어디서 나오는거냐?


void AwesomePlayer::onVideoEvent() { 에 보면


        for (;;) {

            status_t err = mVideoSource->read(&mVideoBuffer, &options);

            options.clearSeekTo();


            if (err != OK) {


이렇게 되어 있는데 mVideoBuffer 는 mVideoSource 에서 나온것이다.



mVideoSource 는 OMXCodec 에서 디코딩 된 소스이다. 이것을 읽는 곳을 찾아보자.



OMXCodec.cpp


이쪽으로 넘어온다.


status_t OMXCodec::read(

        MediaBuffer **buffer, const ReadOptions *options) {

    status_t err = OK;

    *buffer = NULL;



중략 ....


    BufferInfo *info = &mPortBuffers[kPortIndexOutput].editItemAt(index);

    CHECK_EQ((int)info->mStatus, (int)OWNED_BY_US);

    info->mStatus = OWNED_BY_CLIENT;


    info->mMediaBuffer->add_ref();

    *buffer = info->mMediaBuffer;


    return OK;

}


이런 함수가 있다.


첫번째 파라메터 MediaBuffer 에 들어오는 것이 mVideoBuffer 이다. 


그리고 read 함수 맨 마지막 부분에 보면 BufferInfo 의 mMediaBuffer 값이 buffer로 들어간다.


그리고 이 값은 mPortBuffers 가 넘어간 것이다.




mPortBuffers 는 무엇인가 알아보자


Vector<BufferInfo> mPortBuffers[2]; 로 선언되어 있다.


Vector로 되어 있고 2개가 왔다 갔다 하면서 사용되고 있는 것일 거라 생각된다. 배열 2개니까.



일단 여기까지 봤다.


그리고 예전 Overlay 사용하던 것처럼 만들기 위해서는 window.h 에 있는 


native_window_set_ 씨리즈를 사용하여 세팅하여야 한다.






반응형

'Android' 카테고리의 다른 글

android OMX Plug-in 추적  (0) 2012.04.23
Android Surface ICS에서 변경된 부분. native media  (0) 2012.03.16
android make update-api  (0) 2012.03.15
Posted by Real_G