CCodec: handle dataspace update from GraphicBufferSource
Bug: 178675686
Test: manual
Change-Id: Ibc2013cf2208a369dda52616507e4ade8b607caa
diff --git a/media/codec2/sfplugin/CCodec.cpp b/media/codec2/sfplugin/CCodec.cpp
index b88dc8b..092d6ee 100644
--- a/media/codec2/sfplugin/CCodec.cpp
+++ b/media/codec2/sfplugin/CCodec.cpp
@@ -210,8 +210,6 @@
(OMX_INDEXTYPE)OMX_IndexParamConsumerUsageBits,
&usage, sizeof(usage));
- // NOTE: we do not use/pass through color aspects from GraphicBufferSource as we
- // communicate that directly to the component.
mSource->configure(
mOmxNode, static_cast<hardware::graphics::common::V1_0::Dataspace>(mDataSpace));
return OK;
@@ -410,6 +408,10 @@
mNode->onInputBufferDone(index);
}
+ android_dataspace getDataspace() override {
+ return mNode->getDataspace();
+ }
+
private:
sp<HGraphicBufferSource> mSource;
sp<C2OMXNode> mNode;
@@ -1007,6 +1009,9 @@
}
}
+ // get color aspects
+ getColorAspectsFromFormat(msg, config->mClientColorAspects);
+
/*
* Handle dataspace
*/
@@ -1016,12 +1021,12 @@
int32_t width, height;
if (msg->findInt32("width", &width)
&& msg->findInt32("height", &height)) {
- ColorAspects aspects;
- getColorAspectsFromFormat(msg, aspects);
- setDefaultCodecColorAspectsIfNeeded(aspects, width, height);
+ setDefaultCodecColorAspectsIfNeeded(config->mClientColorAspects, width, height);
// TODO: read dataspace / color aspect from the component
- setColorAspectsIntoFormat(aspects, const_cast<sp<AMessage> &>(msg));
- dataSpace = getDataSpaceForColorAspects(aspects, true /* mayexpand */);
+ setColorAspectsIntoFormat(
+ config->mClientColorAspects, const_cast<sp<AMessage> &>(msg));
+ dataSpace = getDataSpaceForColorAspects(
+ config->mClientColorAspects, true /* mayexpand */);
}
msg->setInt32("android._dataspace", (int32_t)dataSpace);
ALOGD("setting dataspace to %x", dataSpace);
@@ -1946,6 +1951,44 @@
}
}
+static void HandleDataspace(
+ android_dataspace dataspace, ColorAspects *colorAspects, sp<AMessage> *format) {
+ ColorUtils::convertDataSpaceToV0(dataspace);
+ int32_t range, standard, transfer;
+ range = (dataspace & HAL_DATASPACE_RANGE_MASK) >> HAL_DATASPACE_RANGE_SHIFT;
+ if (range == 0) {
+ range = ColorUtils::wrapColorAspectsIntoColorRange(
+ colorAspects->mRange);
+ }
+ standard = (dataspace & HAL_DATASPACE_STANDARD_MASK) >> HAL_DATASPACE_STANDARD_SHIFT;
+ if (standard == 0) {
+ standard = ColorUtils::wrapColorAspectsIntoColorStandard(
+ colorAspects->mPrimaries,
+ colorAspects->mMatrixCoeffs);
+ }
+ transfer = (dataspace & HAL_DATASPACE_TRANSFER_MASK) >> HAL_DATASPACE_TRANSFER_SHIFT;
+ if (transfer == 0) {
+ transfer = ColorUtils::wrapColorAspectsIntoColorTransfer(
+ colorAspects->mTransfer);
+ }
+ ColorAspects newColorAspects;
+ ColorUtils::convertPlatformColorAspectsToCodecAspects(
+ range, standard, transfer, newColorAspects);
+ if (ColorUtils::checkIfAspectsChangedAndUnspecifyThem(
+ newColorAspects, *colorAspects)) {
+ *format = (*format)->dup();
+ (*format)->setInt32(KEY_COLOR_RANGE, range);
+ (*format)->setInt32(KEY_COLOR_STANDARD, standard);
+ (*format)->setInt32(KEY_COLOR_TRANSFER, transfer);
+ // Record current color aspects into |colorAspects|.
+ // NOTE: newColorAspects could have been modified by
+ // checkIfAspectsChangedAndUnspecifyThem() above,
+ // so *colorAspects = newColorAspects does not work as intended.
+ ColorUtils::convertPlatformColorAspectsToCodecAspects(
+ range, standard, transfer, *colorAspects);
+ }
+}
+
void CCodec::onMessageReceived(const sp<AMessage> &msg) {
TimePoint now = std::chrono::steady_clock::now();
CCodecWatchdog::getInstance()->watch(this);
@@ -2060,6 +2103,10 @@
sp<AMessage> outputFormat = config->mOutputFormat;
config->updateConfiguration(updates, config->mOutputDomain);
+ if (config->mInputSurface) {
+ android_dataspace ds = config->mInputSurface->getDataspace();
+ HandleDataspace(ds, &config->mClientColorAspects, &config->mOutputFormat);
+ }
RevertOutputFormatIfNeeded(outputFormat, config->mOutputFormat);
// copy standard infos to graphic buffers if not already present (otherwise, we