diff options
| -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);      }  | 
