ICS Video Render 과정
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 |