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 /media | |
| 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
Diffstat (limited to 'media')
| -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 | 
5 files changed, 74 insertions, 6 deletions
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);      }  | 
