summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLajos Molnar <lajos@google.com>2015-06-25 17:04:09 -0700
committerLajos Molnar <lajos@google.com>2015-06-26 17:09:42 -0700
commitc93a13669ce1b5a9e6527b4c86c9d8f5e92be828 (patch)
tree5fb41cc9ed232bdf147470e50d6411bfe435f2d4
parent064b2bf712788d30928b9a8bafecd0f3308d7aa4 (diff)
downloadframeworks_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.h3
-rw-r--r--include/media/stagefright/MetaData.h4
-rw-r--r--media/libstagefright/ACodec.cpp16
-rw-r--r--media/libstagefright/CameraSource.cpp10
-rw-r--r--media/libstagefright/MediaCodecSource.cpp29
-rw-r--r--media/libstagefright/omx/GraphicBufferSource.cpp14
-rw-r--r--media/libstagefright/omx/SoftVideoEncoderOMXComponent.cpp11
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);
}