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 &params);
@@ -436,8 +436,8 @@
     // gets |params|. Returns the codec error.
     status_t getHDRStaticInfo(DescribeHDRStaticInfoParams &params);
 
-    // 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(&params);
+    params.nPortIndex = portIndex;
+
+    HDRStaticInfo *info = &params.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(&params);
-    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(&params);
-    params.nPortIndex = kPortIndexOutput;
-
-    HDRStaticInfo *info = &params.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 &params) {
     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;