IOMX: add dataspace to createInputSurface
Bug: 25684127
Change-Id: Ibe746d7d077f32b0f2ecfb8494f415a6bf0bd673
diff --git a/include/media/IOMX.h b/include/media/IOMX.h
index 3f211bf..316513c 100644
--- a/include/media/IOMX.h
+++ b/include/media/IOMX.h
@@ -121,7 +121,7 @@
// This will set *type to resulting metadata buffer type on OMX error (not on binder error) as
// well as on success.
virtual status_t createInputSurface(
- node_id node, OMX_U32 port_index,
+ node_id node, OMX_U32 port_index, android_dataspace dataSpace,
sp<IGraphicBufferProducer> *bufferProducer,
MetadataBufferType *type = NULL) = 0;
diff --git a/media/libmedia/IOMX.cpp b/media/libmedia/IOMX.cpp
index e6b4347..1ac098c 100644
--- a/media/libmedia/IOMX.cpp
+++ b/media/libmedia/IOMX.cpp
@@ -313,13 +313,14 @@
}
virtual status_t createInputSurface(
- node_id node, OMX_U32 port_index,
+ node_id node, OMX_U32 port_index, android_dataspace dataSpace,
sp<IGraphicBufferProducer> *bufferProducer, MetadataBufferType *type) {
Parcel data, reply;
status_t err;
data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
data.writeInt32((int32_t)node);
data.writeInt32(port_index);
+ data.writeInt32(dataSpace);
err = remote()->transact(CREATE_INPUT_SURFACE, data, &reply);
if (err != OK) {
ALOGW("binder transaction failed: %d", err);
@@ -908,10 +909,11 @@
node_id node = (node_id)data.readInt32();
OMX_U32 port_index = data.readInt32();
+ android_dataspace dataSpace = (android_dataspace)data.readInt32();
sp<IGraphicBufferProducer> bufferProducer;
MetadataBufferType type = kMetadataBufferTypeInvalid;
- status_t err = createInputSurface(node, port_index, &bufferProducer, &type);
+ status_t err = createInputSurface(node, port_index, dataSpace, &bufferProducer, &type);
if ((err != OK) && (type == kMetadataBufferTypeInvalid)) {
android_errorWriteLog(0x534e4554, "26324358");
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp
index def9e25..0e258e1 100644
--- a/media/libstagefright/ACodec.cpp
+++ b/media/libstagefright/ACodec.cpp
@@ -6105,9 +6105,11 @@
sp<AMessage> notify = mCodec->mNotify->dup();
notify->setInt32("what", CodecBase::kWhatInputSurfaceCreated);
+ android_dataspace dataSpace = HAL_DATASPACE_UNKNOWN;
+
sp<IGraphicBufferProducer> bufferProducer;
status_t err = mCodec->mOMX->createInputSurface(
- mCodec->mNode, kPortIndexInput, &bufferProducer, &mCodec->mInputMetadataType);
+ mCodec->mNode, kPortIndexInput, dataSpace, &bufferProducer, &mCodec->mInputMetadataType);
if (err == OK) {
err = setupInputSurface();
diff --git a/media/libstagefright/OMXClient.cpp b/media/libstagefright/OMXClient.cpp
index 8e72405..a523d0e 100644
--- a/media/libstagefright/OMXClient.cpp
+++ b/media/libstagefright/OMXClient.cpp
@@ -112,7 +112,7 @@
const sp<GraphicBuffer> &graphicBuffer, buffer_id buffer);
virtual status_t createInputSurface(
- node_id node, OMX_U32 port_index,
+ node_id node, OMX_U32 port_index, android_dataspace dataSpace,
sp<IGraphicBufferProducer> *bufferProducer, MetadataBufferType *type);
virtual status_t createPersistentInputSurface(
@@ -388,10 +388,10 @@
}
status_t MuxOMX::createInputSurface(
- node_id node, OMX_U32 port_index,
+ node_id node, OMX_U32 port_index, android_dataspace dataSpace,
sp<IGraphicBufferProducer> *bufferProducer, MetadataBufferType *type) {
status_t err = getOMX(node)->createInputSurface(
- node, port_index, bufferProducer, type);
+ node, port_index, dataSpace, bufferProducer, type);
return err;
}
diff --git a/media/libstagefright/include/OMX.h b/media/libstagefright/include/OMX.h
index c715939..9726741 100644
--- a/media/libstagefright/include/OMX.h
+++ b/media/libstagefright/include/OMX.h
@@ -94,7 +94,7 @@
const sp<GraphicBuffer> &graphicBuffer, buffer_id buffer);
virtual status_t createInputSurface(
- node_id node, OMX_U32 port_index,
+ node_id node, OMX_U32 port_index, android_dataspace dataSpace,
sp<IGraphicBufferProducer> *bufferProducer,
MetadataBufferType *type);
diff --git a/media/libstagefright/include/OMXNodeInstance.h b/media/libstagefright/include/OMXNodeInstance.h
index b1cb91d..4220358 100644
--- a/media/libstagefright/include/OMXNodeInstance.h
+++ b/media/libstagefright/include/OMXNodeInstance.h
@@ -80,7 +80,8 @@
OMX::buffer_id buffer);
status_t createInputSurface(
- OMX_U32 portIndex, sp<IGraphicBufferProducer> *bufferProducer,
+ OMX_U32 portIndex, android_dataspace dataSpace,
+ sp<IGraphicBufferProducer> *bufferProducer,
MetadataBufferType *type);
static status_t createPersistentInputSurface(
diff --git a/media/libstagefright/omx/GraphicBufferSource.cpp b/media/libstagefright/omx/GraphicBufferSource.cpp
index acdc4b0..a878592 100644
--- a/media/libstagefright/omx/GraphicBufferSource.cpp
+++ b/media/libstagefright/omx/GraphicBufferSource.cpp
@@ -117,6 +117,7 @@
mNodeInstance(nodeInstance),
mExecuting(false),
mSuspended(false),
+ mLastDataSpace(HAL_DATASPACE_UNKNOWN),
mIsPersistent(false),
mConsumer(consumer),
mNumFramesAvailable(0),
@@ -925,6 +926,12 @@
ALOG_ASSERT(false, "GraphicBufferSource can't consume sideband streams");
}
+void GraphicBufferSource::setDefaultDataSpace(android_dataspace dataSpace) {
+ ALOGD("setting dataspace: %#x", dataSpace);
+ mConsumer->setDefaultBufferDataSpace(dataSpace);
+ mLastDataSpace = dataSpace;
+}
+
status_t GraphicBufferSource::setRepeatPreviousFrameDelayUs(
int64_t repeatAfterUs) {
Mutex::Autolock autoLock(mMutex);
diff --git a/media/libstagefright/omx/GraphicBufferSource.h b/media/libstagefright/omx/GraphicBufferSource.h
index 7150684..f0aa48e 100644
--- a/media/libstagefright/omx/GraphicBufferSource.h
+++ b/media/libstagefright/omx/GraphicBufferSource.h
@@ -73,6 +73,9 @@
return mProducer;
}
+ // Sets the default buffer data space
+ void setDefaultDataSpace(android_dataspace dataSpace);
+
// This is called when OMX transitions to OMX_StateExecuting, which means
// we can start handing it buffers. If we already have buffers of data
// sitting in the BufferQueue, this will send them to the codec.
@@ -252,6 +255,9 @@
bool mSuspended;
+ // Last dataspace seen
+ android_dataspace mLastDataSpace;
+
// Our BufferQueue interfaces. mProducer is passed to the producer through
// getIGraphicBufferProducer, and mConsumer is used internally to retrieve
// the buffers queued by the producer.
diff --git a/media/libstagefright/omx/OMX.cpp b/media/libstagefright/omx/OMX.cpp
index 970f6f5..759648b 100644
--- a/media/libstagefright/omx/OMX.cpp
+++ b/media/libstagefright/omx/OMX.cpp
@@ -484,7 +484,7 @@
}
status_t OMX::createInputSurface(
- node_id node, OMX_U32 port_index,
+ node_id node, OMX_U32 port_index, android_dataspace dataSpace,
sp<IGraphicBufferProducer> *bufferProducer, MetadataBufferType *type) {
OMXNodeInstance *instance = findInstance(node);
@@ -493,7 +493,7 @@
}
return instance->createInputSurface(
- port_index, bufferProducer, type);
+ port_index, dataSpace, bufferProducer, type);
}
status_t OMX::createPersistentInputSurface(
diff --git a/media/libstagefright/omx/OMXNodeInstance.cpp b/media/libstagefright/omx/OMXNodeInstance.cpp
index 82d5ba3..efa6cf0 100644
--- a/media/libstagefright/omx/OMXNodeInstance.cpp
+++ b/media/libstagefright/omx/OMXNodeInstance.cpp
@@ -933,7 +933,8 @@
}
status_t OMXNodeInstance::createInputSurface(
- OMX_U32 portIndex, sp<IGraphicBufferProducer> *bufferProducer, MetadataBufferType *type) {
+ OMX_U32 portIndex, android_dataspace dataSpace,
+ sp<IGraphicBufferProducer> *bufferProducer, MetadataBufferType *type) {
if (bufferProducer == NULL) {
ALOGE("b/25884056");
return BAD_VALUE;
@@ -946,6 +947,8 @@
return err;
}
+ mGraphicBufferSource->setDefaultDataSpace(dataSpace);
+
*bufferProducer = mGraphicBufferSource->getIGraphicBufferProducer();
return OK;
}