diff options
author | Lajos Molnar <lajos@google.com> | 2015-06-25 17:04:09 -0700 |
---|---|---|
committer | Lajos Molnar <lajos@google.com> | 2015-06-26 17:09:42 -0700 |
commit | c93a13669ce1b5a9e6527b4c86c9d8f5e92be828 (patch) | |
tree | 5fb41cc9ed232bdf147470e50d6411bfe435f2d4 | |
parent | 064b2bf712788d30928b9a8bafecd0f3308d7aa4 (diff) | |
download | frameworks_av-c93a13669ce1b5a9e6527b4c86c9d8f5e92be828.zip frameworks_av-c93a13669ce1b5a9e6527b4c86c9d8f5e92be828.tar.gz frameworks_av-c93a13669ce1b5a9e6527b4c86c9d8f5e92be828.tar.bz2 |
stagefright: ask for flex-YUV camera buffers for software encoders
Bug: 13222807
Change-Id: I854b73a63cf9239311729598241725d84e8513aa
-rw-r--r-- | include/media/stagefright/MediaCodecSource.h | 3 | ||||
-rw-r--r-- | include/media/stagefright/MetaData.h | 4 | ||||
-rw-r--r-- | media/libstagefright/ACodec.cpp | 16 | ||||
-rw-r--r-- | media/libstagefright/CameraSource.cpp | 10 | ||||
-rw-r--r-- | media/libstagefright/MediaCodecSource.cpp | 29 | ||||
-rw-r--r-- | media/libstagefright/omx/GraphicBufferSource.cpp | 14 | ||||
-rw-r--r-- | media/libstagefright/omx/SoftVideoEncoderOMXComponent.cpp | 11 |
7 files changed, 80 insertions, 7 deletions
diff --git a/include/media/stagefright/MediaCodecSource.h b/include/media/stagefright/MediaCodecSource.h index a991b02..71f58a9 100644 --- a/include/media/stagefright/MediaCodecSource.h +++ b/include/media/stagefright/MediaCodecSource.h @@ -108,6 +108,9 @@ private: bool mStarted; bool mStopping; bool mDoMoreWorkPending; + bool mSetEncoderFormat; + int mEncoderFormat; + int mEncoderDataSpace; sp<AMessage> mEncoderActivityNotify; sp<IGraphicBufferProducer> mGraphicBufferProducer; sp<IGraphicBufferConsumer> mGraphicBufferConsumer; diff --git a/include/media/stagefright/MetaData.h b/include/media/stagefright/MetaData.h index ca80123..726b197 100644 --- a/include/media/stagefright/MetaData.h +++ b/include/media/stagefright/MetaData.h @@ -70,7 +70,9 @@ enum { kKeyDriftTime = 'dftT', // int64_t (usecs) kKeyAnchorTime = 'ancT', // int64_t (usecs) kKeyDuration = 'dura', // int64_t (usecs) - kKeyColorFormat = 'colf', + kKeyPixelFormat = 'pixf', // int32_t + kKeyColorFormat = 'colf', // int32_t + kKeyColorSpace = 'cols', // int32_t kKeyPlatformPrivate = 'priv', // pointer kKeyDecoderComponent = 'decC', // cstring kKeyBufferID = 'bfID', diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp index bb53ce6..c6e45af 100644 --- a/media/libstagefright/ACodec.cpp +++ b/media/libstagefright/ACodec.cpp @@ -1639,6 +1639,14 @@ status_t ACodec::configureCodec( if (mInputMetadataType == kMetadataBufferTypeGrallocSource) { mInputMetadataType = kMetadataBufferTypeCameraSource; } + + uint32_t usageBits; + if (mOMX->getParameter( + mNode, (OMX_INDEXTYPE)OMX_IndexParamConsumerUsageBits, + &usageBits, sizeof(usageBits)) == OK) { + inputFormat->setInt32( + "using-sw-read-often", !!(usageBits & GRALLOC_USAGE_SW_READ_OFTEN)); + } } int32_t prependSPSPPS = 0; @@ -5748,6 +5756,14 @@ status_t ACodec::LoadedState::setupInputSurface() { } } + uint32_t usageBits; + if (mCodec->mOMX->getParameter( + mCodec->mNode, (OMX_INDEXTYPE)OMX_IndexParamConsumerUsageBits, + &usageBits, sizeof(usageBits)) == OK) { + mCodec->mInputFormat->setInt32( + "using-sw-read-often", !!(usageBits & GRALLOC_USAGE_SW_READ_OFTEN)); + } + return OK; } diff --git a/media/libstagefright/CameraSource.cpp b/media/libstagefright/CameraSource.cpp index 2606e44..bc34bcf 100644 --- a/media/libstagefright/CameraSource.cpp +++ b/media/libstagefright/CameraSource.cpp @@ -670,9 +670,13 @@ status_t CameraSource::start(MetaData *meta) { mNumInputBuffers = nBuffers; } - // TODO: Read in format/dataspace from somewhere - // Uncomment to test SW encoders until TODO is resolved - // mEncoderFormat = HAL_PIXEL_FORMAT_YCbCr_420_888; + // apply encoder color format if specified + if (meta->findInt32(kKeyPixelFormat, &mEncoderFormat)) { + ALOGV("Using encoder format: %#x", mEncoderFormat); + } + if (meta->findInt32(kKeyColorSpace, &mEncoderDataSpace)) { + ALOGV("Using encoder data space: %#x", mEncoderDataSpace); + } } status_t err; diff --git a/media/libstagefright/MediaCodecSource.cpp b/media/libstagefright/MediaCodecSource.cpp index e089c46..7f9f824 100644 --- a/media/libstagefright/MediaCodecSource.cpp +++ b/media/libstagefright/MediaCodecSource.cpp @@ -39,6 +39,9 @@ namespace android { +const int kDefaultSwVideoEncoderFormat = HAL_PIXEL_FORMAT_YCbCr_420_888; +const int kDefaultSwVideoEncoderDataSpace = HAL_DATASPACE_BT709; + struct MediaCodecSource::Puller : public AHandler { Puller(const sp<MediaSource> &source); @@ -341,6 +344,9 @@ MediaCodecSource::MediaCodecSource( mStarted(false), mStopping(false), mDoMoreWorkPending(false), + mSetEncoderFormat(false), + mEncoderFormat(0), + mEncoderDataSpace(0), mGraphicBufferConsumer(consumer), mFirstSampleTimeUs(-1ll), mEncoderReachedEOS(false), @@ -438,6 +444,18 @@ status_t MediaCodecSource::initEncoder() { } } + sp<AMessage> inputFormat; + int32_t usingSwReadOften; + mSetEncoderFormat = false; + if (mEncoder->getInputFormat(&inputFormat) == OK + && inputFormat->findInt32("using-sw-read-often", &usingSwReadOften) + && usingSwReadOften) { + // this is a SW encoder; signal source to allocate SW readable buffers + mSetEncoderFormat = true; + mEncoderFormat = kDefaultSwVideoEncoderFormat; + mEncoderDataSpace = kDefaultSwVideoEncoderDataSpace; + } + err = mEncoder->start(); if (err != OK) { @@ -632,8 +650,17 @@ status_t MediaCodecSource::onStart(MetaData *params) { resume(startTimeUs); } else { CHECK(mPuller != NULL); + sp<MetaData> meta = params; + if (mSetEncoderFormat) { + if (meta == NULL) { + meta = new MetaData; + } + meta->setInt32(kKeyPixelFormat, mEncoderFormat); + meta->setInt32(kKeyColorSpace, mEncoderDataSpace); + } + sp<AMessage> notify = new AMessage(kWhatPullerNotify, mReflector); - err = mPuller->start(params, notify); + err = mPuller->start(meta.get(), notify); if (err != OK) { return err; } diff --git a/media/libstagefright/omx/GraphicBufferSource.cpp b/media/libstagefright/omx/GraphicBufferSource.cpp index 31c6975..19f0a37 100644 --- a/media/libstagefright/omx/GraphicBufferSource.cpp +++ b/media/libstagefright/omx/GraphicBufferSource.cpp @@ -23,6 +23,7 @@ #include "GraphicBufferSource.h" #include <OMX_Core.h> +#include <OMX_IndexExt.h> #include <media/stagefright/foundation/ADebug.h> #include <media/stagefright/foundation/AMessage.h> @@ -152,7 +153,18 @@ GraphicBufferSource::GraphicBufferSource( BufferQueue::createBufferQueue(&mProducer, &mConsumer); mConsumer->setConsumerName(name); - mConsumer->setConsumerUsageBits(GRALLOC_USAGE_HW_VIDEO_ENCODER); + + // query consumer usage bits from encoder, but always add HW_VIDEO_ENCODER + // for backward compatibility. + uint32_t usageBits; + status_t err = mNodeInstance->getParameter( + (OMX_INDEXTYPE)OMX_IndexParamConsumerUsageBits, &usageBits, sizeof(usageBits)); + if (err != OK) { + usageBits = 0; + } + usageBits |= GRALLOC_USAGE_HW_VIDEO_ENCODER; + mConsumer->setConsumerUsageBits(usageBits); + mInitCheck = mConsumer->setMaxAcquiredBufferCount(bufferCount); if (mInitCheck != NO_ERROR) { ALOGE("Unable to set BQ max acquired buffer count to %u: %d", diff --git a/media/libstagefright/omx/SoftVideoEncoderOMXComponent.cpp b/media/libstagefright/omx/SoftVideoEncoderOMXComponent.cpp index 9dd26fb..8ea7a6e 100644 --- a/media/libstagefright/omx/SoftVideoEncoderOMXComponent.cpp +++ b/media/libstagefright/omx/SoftVideoEncoderOMXComponent.cpp @@ -34,6 +34,8 @@ #include <ui/GraphicBuffer.h> #include <ui/GraphicBufferMapper.h> +#include <OMX_IndexExt.h> + namespace android { const static OMX_COLOR_FORMATTYPE kSupportedColorFormats[] = { @@ -293,7 +295,7 @@ OMX_ERRORTYPE SoftVideoEncoderOMXComponent::internalSetParameter( OMX_ERRORTYPE SoftVideoEncoderOMXComponent::internalGetParameter( OMX_INDEXTYPE index, OMX_PTR param) { - switch (index) { + switch ((int)index) { case OMX_IndexParamVideoErrorCorrection: { return OMX_ErrorNotImplemented; @@ -343,6 +345,13 @@ OMX_ERRORTYPE SoftVideoEncoderOMXComponent::internalGetParameter( return OMX_ErrorNone; } + case OMX_IndexParamConsumerUsageBits: + { + OMX_U32 *usageBits = (OMX_U32 *)param; + *usageBits = GRALLOC_USAGE_SW_READ_OFTEN; + return OMX_ErrorNone; + } + default: return SimpleSoftOMXComponent::internalGetParameter(index, param); } |