Stagefright: Add HDRStaticInfo support for encoder.
Bug:25684127
Change-Id: I6bc74cf4915d1e42432f8da767bb84e3e8f2153f
diff --git a/include/media/stagefright/ACodec.h b/include/media/stagefright/ACodec.h
index b22e0b4..f6d5f12 100644
--- a/include/media/stagefright/ACodec.h
+++ b/include/media/stagefright/ACodec.h
@@ -425,10 +425,10 @@
// gets index or sets it to 0 on error. Returns error from codec.
status_t initDescribeHDRStaticInfoIndex();
- // sets HDR static information for the decoder based on |configFormat|, and
- // set resulting HDRStaticInfo config into |outputFormat|. Returns error from the codec.
- status_t setHDRStaticInfoForVideoDecoder(
- const sp<AMessage> &configFormat, sp<AMessage> &outputFormat);
+ // sets HDR static metadata for the video encoder/decoder based on |configFormat|, and
+ // sets resulting HDRStaticInfo config into |outputFormat|. Returns error from the codec.
+ status_t setHDRStaticInfoForVideoCodec(
+ OMX_U32 portIndex, const sp<AMessage> &configFormat, sp<AMessage> &outputFormat);
// sets |params|. Returns the codec error.
status_t setHDRStaticInfo(const DescribeHDRStaticInfoParams ¶ms);
@@ -436,8 +436,8 @@
// gets |params|. Returns the codec error.
status_t getHDRStaticInfo(DescribeHDRStaticInfoParams ¶ms);
- // gets HDR static information for the video decoder port and sets them into |format|.
- status_t getHDRStaticInfoForVideoDecoder(sp<AMessage> &format);
+ // gets HDR static information for the video encoder/decoder port and sets them into |format|.
+ status_t getHDRStaticInfoForVideoCodec(OMX_U32 portIndex, sp<AMessage> &format);
typedef struct drcParams {
int32_t drcCut;
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp
index 7c903ea..f159882 100644
--- a/media/libstagefright/ACodec.cpp
+++ b/media/libstagefright/ACodec.cpp
@@ -3192,7 +3192,7 @@
return err;
}
- err = setHDRStaticInfoForVideoDecoder(msg, outputFormat);
+ err = setHDRStaticInfoForVideoCodec(kPortIndexOutput, msg, outputFormat);
if (err == ERROR_UNSUPPORTED) { // support is optional
err = OK;
}
@@ -3392,6 +3392,25 @@
return OK;
}
+status_t ACodec::setHDRStaticInfoForVideoCodec(
+ OMX_U32 portIndex, const sp<AMessage> &configFormat, sp<AMessage> &outputFormat) {
+ CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput);
+
+ DescribeHDRStaticInfoParams params;
+ InitOMXParams(¶ms);
+ params.nPortIndex = portIndex;
+
+ HDRStaticInfo *info = ¶ms.sInfo;
+ if (getHDRStaticInfoFromFormat(configFormat, info)) {
+ setHDRStaticInfoIntoFormat(params.sInfo, outputFormat);
+ }
+
+ (void)initDescribeHDRStaticInfoIndex();
+
+ // communicate HDR static Info to codec
+ return setHDRStaticInfo(params);
+}
+
// subsequent initial video encoder setup for surface mode
status_t ACodec::setInitialColorAspectsForVideoEncoderSurfaceAndGetDataSpace(
android_dataspace *dataSpace /* nonnull */) {
@@ -3444,10 +3463,11 @@
return err;
}
-status_t ACodec::getHDRStaticInfoForVideoDecoder(sp<AMessage> &format) {
+status_t ACodec::getHDRStaticInfoForVideoCodec(OMX_U32 portIndex, sp<AMessage> &format) {
+ CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput);
DescribeHDRStaticInfoParams params;
InitOMXParams(¶ms);
- params.nPortIndex = kPortIndexOutput;
+ params.nPortIndex = portIndex;
status_t err = getHDRStaticInfo(params);
if (err == OK) {
@@ -3466,23 +3486,6 @@
return err;
}
-status_t ACodec::setHDRStaticInfoForVideoDecoder(
- const sp<AMessage> &configFormat, sp<AMessage> &outputFormat) {
- DescribeHDRStaticInfoParams params;
- InitOMXParams(¶ms);
- params.nPortIndex = kPortIndexOutput;
-
- HDRStaticInfo *info = ¶ms.sInfo;
- if (getHDRStaticInfoFromFormat(configFormat, info)) {
- setHDRStaticInfoIntoFormat(params.sInfo, outputFormat);
- }
-
- (void)initDescribeHDRStaticInfoIndex();
-
- // communicate HDR static Info to codec
- return setHDRStaticInfo(params);
-}
-
status_t ACodec::setHDRStaticInfo(const DescribeHDRStaticInfoParams ¶ms) {
status_t err = ERROR_UNSUPPORTED;
if (mDescribeHDRStaticInfoIndex) {
@@ -3697,6 +3700,16 @@
err = OK;
}
+ if (err != OK) {
+ return err;
+ }
+
+ err = setHDRStaticInfoForVideoCodec(kPortIndexInput, msg, outputFormat);
+ if (err == ERROR_UNSUPPORTED) { // support is optional
+ ALOGI("[%s] cannot encode HDR static metadata. Ignoring.", mComponentName.c_str());
+ err = OK;
+ }
+
if (err == OK) {
ALOGI("setupVideoEncoder succeeded");
}
@@ -4729,9 +4742,12 @@
if (mUsingNativeWindow) {
notify->setInt32("android._dataspace", dataSpace);
}
- (void)getHDRStaticInfoForVideoDecoder(notify);
+ (void)getHDRStaticInfoForVideoCodec(kPortIndexOutput, notify);
} else {
(void)getInputColorAspectsForVideoEncoder(notify);
+ if (mConfigFormat->contains("hdr-static-info")) {
+ (void)getHDRStaticInfoForVideoCodec(kPortIndexInput, notify);
+ }
}
break;