Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b1302149 authored by Lajos Molnar's avatar Lajos Molnar Committed by android-build-merger
Browse files

stagefright: properly pass metadata buffers into OMX codec

am: d34a8c4d

* commit 'd34a8c4d':
  stagefright: properly pass metadata buffers into OMX codec

Change-Id: Ic5fe0737bf6f12099b414cba4de671540e68aabc
parents d37e1c10 d34a8c4d
Loading
Loading
Loading
Loading
+48 −10
Original line number Diff line number Diff line
@@ -5712,7 +5712,8 @@ void ACodec::BaseState::onInputBufferFilled(const sp<AMessage> &msg) {

                OMX_U32 flags = OMX_BUFFERFLAG_ENDOFFRAME;

                int32_t isCSD;
                MetadataBufferType metaType = mCodec->mInputMetadataType;
                int32_t isCSD = 0;
                if (buffer->meta()->findInt32("csd", &isCSD) && isCSD != 0) {
                    if (mCodec->mIsLegacyVP9Decoder) {
                        ALOGV("[%s] is legacy VP9 decoder. Ignore %u codec specific data",
@@ -5721,6 +5722,7 @@ void ACodec::BaseState::onInputBufferFilled(const sp<AMessage> &msg) {
                        break;
                    }
                    flags |= OMX_BUFFERFLAG_CODECCONFIG;
                    metaType = kMetadataBufferTypeInvalid;
                }

                if (eos) {
@@ -5734,7 +5736,7 @@ void ACodec::BaseState::onInputBufferFilled(const sp<AMessage> &msg) {
                         buffer.get(), info->mCodecData.get());

                    sp<DataConverter> converter = mCodec->mConverter[kPortIndexInput];
                    if (converter == NULL) {
                    if (converter == NULL || isCSD) {
                        converter = getCopyConverter();
                    }
                    status_t err = converter->convert(buffer, info->mCodecData);
@@ -5780,7 +5782,42 @@ void ACodec::BaseState::onInputBufferFilled(const sp<AMessage> &msg) {
                    }
                }
                info->checkReadFence("onInputBufferFilled");
                status_t err2 = mCodec->mOMX->emptyBuffer(

                status_t err2 = OK;
                switch (metaType) {
                case kMetadataBufferTypeInvalid:
                    break;
#ifndef OMX_ANDROID_COMPILE_AS_32BIT_ON_64BIT_PLATFORMS
                case kMetadataBufferTypeNativeHandleSource:
                    if (info->mCodecData->size() >= sizeof(VideoNativeHandleMetadata)) {
                        VideoNativeHandleMetadata *vnhmd =
                            (VideoNativeHandleMetadata*)info->mCodecData->base();
                        err2 = mCodec->mOMX->updateNativeHandleInMeta(
                                mCodec->mNode, kPortIndexInput,
                                NativeHandle::create(vnhmd->pHandle, false /* ownsHandle */),
                                bufferID);
                    }
                    break;
                case kMetadataBufferTypeANWBuffer:
                    if (info->mCodecData->size() >= sizeof(VideoNativeMetadata)) {
                        VideoNativeMetadata *vnmd = (VideoNativeMetadata*)info->mCodecData->base();
                        err2 = mCodec->mOMX->updateGraphicBufferInMeta(
                                mCodec->mNode, kPortIndexInput,
                                new GraphicBuffer(vnmd->pBuffer, false /* keepOwnership */),
                                bufferID);
                    }
                    break;
#endif
                default:
                    ALOGW("Can't marshall %s data in %zu sized buffers in %zu-bit mode",
                            asString(metaType), info->mCodecData->size(),
                            sizeof(buffer_handle_t) * 8);
                    err2 = ERROR_UNSUPPORTED;
                    break;
                }

                if (err2 == OK) {
                    err2 = mCodec->mOMX->emptyBuffer(
                        mCodec->mNode,
                        bufferID,
                        0,
@@ -5788,6 +5825,7 @@ void ACodec::BaseState::onInputBufferFilled(const sp<AMessage> &msg) {
                        flags,
                        timeUs,
                        info->mFenceFd);
                }
                info->mFenceFd = -1;
                if (err2 != OK) {
                    mCodec->signalError(OMX_ErrorUndefined, makeNoSideEffectStatus(err2));