qdmetadata: Add support for video histogram stats

Change adds support for passing the video histogram stats from video decoder to
the clients.

CRs-Fixed: 2395126
Change-Id: If6b1e0eb51754c3635024a4b37dc9d8991073efb
diff --git a/libqdmetadata/qdMetaData.cpp b/libqdmetadata/qdMetaData.cpp
index 33ce28b..91dbc7a 100644
--- a/libqdmetadata/qdMetaData.cpp
+++ b/libqdmetadata/qdMetaData.cpp
@@ -161,7 +161,26 @@
              }
              break;
         }
-        default:
+        case SET_VIDEO_HISTOGRAM_STATS: {
+            struct VideoHistogramMetadata *vidstats = (struct VideoHistogramMetadata *)param;
+            if (vidstats->stat_len <= VIDEO_HISTOGRAM_STATS_SIZE) {
+                memcpy(data->video_histogram_stats.stats_info,
+                    vidstats->stats_info, VIDEO_HISTOGRAM_STATS_SIZE);
+                data->video_histogram_stats.stat_len = vidstats->stat_len;
+                data->video_histogram_stats.frame_type = vidstats->frame_type;
+                data->video_histogram_stats.display_width = vidstats->display_width;
+                data->video_histogram_stats.display_height = vidstats->display_height;
+                data->video_histogram_stats.decode_width = vidstats->decode_width;
+                data->video_histogram_stats.decode_height = vidstats->decode_height;
+            } else {
+                 data->operation &= ~(paramType);
+                 ALOGE("%s: video stats length %u is more than max size %u",
+                     __func__, vidstats->stat_len, VIDEO_HISTOGRAM_STATS_SIZE);
+                 return -EINVAL;
+            }
+            break;
+         }
+         default:
             ALOGE("Unknown paramType %d", paramType);
             break;
     }
@@ -191,6 +210,9 @@
         case SET_CVP_METADATA:
             data->cvpMetadata.size = 0;
             break;
+        case SET_VIDEO_HISTOGRAM_STATS:
+            data->video_histogram_stats.stat_len = 0;
+            break;
         default:
             ALOGE("Unknown paramType %d", paramType);
             break;
@@ -323,6 +345,23 @@
                 }
             }
             break;
+        case GET_VIDEO_HISTOGRAM_STATS:
+            if (data->operation & SET_VIDEO_HISTOGRAM_STATS) {
+                struct VideoHistogramMetadata *vidstats = (struct VideoHistogramMetadata *)param;
+                vidstats->stat_len = 0;
+                if (data->video_histogram_stats.stat_len <= VIDEO_HISTOGRAM_STATS_SIZE) {
+                    memcpy(vidstats->stats_info,
+                        data->video_histogram_stats.stats_info, VIDEO_HISTOGRAM_STATS_SIZE);
+                    vidstats->stat_len = data->video_histogram_stats.stat_len;
+                    vidstats->frame_type = data->video_histogram_stats.frame_type;
+                    vidstats->display_width = data->video_histogram_stats.display_width;
+                    vidstats->display_height = data->video_histogram_stats.display_height;
+                    vidstats->decode_width = data->video_histogram_stats.decode_width;
+                    vidstats->decode_height = data->video_histogram_stats.decode_height;
+                    ret = 0;
+                }
+            }
+            break;
         default:
             ALOGE("Unknown paramType %d", paramType);
             break;
diff --git a/libqdmetadata/qdMetaData.h b/libqdmetadata/qdMetaData.h
index c106c8a..1cc3712 100644
--- a/libqdmetadata/qdMetaData.h
+++ b/libqdmetadata/qdMetaData.h
@@ -106,6 +106,20 @@
     uint32_t data[GRAPHICS_METADATA_SIZE];
 } GraphicsMetadata;
 
+#define VIDEO_HISTOGRAM_STATS_SIZE (4 * 1024)
+/* Frame type bit mask */
+#define QD_SYNC_FRAME (0x1 << 0)
+struct VideoHistogramMetadata {
+    uint32_t stats_info[1024]; /* video stats payload */
+    uint32_t stat_len; /* Payload size in bytes */
+    uint32_t frame_type; /* bit mask to indicate frame type */
+    uint32_t display_width;
+    uint32_t display_height;
+    uint32_t decode_width;
+    uint32_t decode_height;
+    uint32_t reserved[12];
+};
+
 typedef struct CVPMetadata {
     uint32_t size; /* payload size in bytes */
     uint8_t payload[CVP_METADATA_SIZE];
@@ -154,6 +168,8 @@
     /* Populated and used by adreno during buffer size calculation.
      * Set only for RGB formats. */
     GraphicsMetadata graphics_metadata;
+    /* Video hisogram stats populated by video decoder */
+    struct VideoHistogramMetadata video_histogram_stats;
     /*
      * Producer (camera) will set cvp metadata and consumer (video) will
      * use it. The format of metadata is known to producer and consumer.
@@ -179,6 +195,7 @@
     SET_SINGLE_BUFFER_MODE     = 0x4000,
     SET_S3D_COMP               = 0x8000,
     SET_CVP_METADATA           = 0x00010000,
+    SET_VIDEO_HISTOGRAM_STATS  = 0x00020000
 };
 
 enum DispFetchParamType {
@@ -199,6 +216,7 @@
     GET_SINGLE_BUFFER_MODE    = 0x4000,
     GET_S3D_COMP              = 0x8000,
     GET_CVP_METADATA          = 0x00010000,
+    GET_VIDEO_HISTOGRAM_STATS = 0x00020000
 };
 
 struct private_handle_t;