blob: fe396f21336af432c69a99258cb91ce10201818d [file] [log] [blame]
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -08001/*
Tharaga Balachandrana6480a42020-01-20 13:58:43 -05002 * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -08003 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above
10 * copyright notice, this list of conditions and the following
11 * disclaimer in the documentation and/or other materials provided
12 * with the distribution.
13 * * Neither the name of The Linux Foundation nor the names of its
14 * contributors may be used to endorse or promote products derived
15 * from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30#ifndef _QDMETADATA_H
31#define _QDMETADATA_H
32
Arun Kumar K.Rb2771bf2016-10-03 21:38:23 -070033#include <color_metadata.h>
Arun Kumar K.Rb2771bf2016-10-03 21:38:23 -070034
Shuzhen Wangf3529c32014-01-28 17:15:45 -080035#ifdef __cplusplus
36extern "C" {
37#endif
38
Praneeth Paladugu3e3e8f82017-03-07 10:42:20 -080039#define MAX_UBWC_STATS_LENGTH 32
Mohan Pallaka5d814432018-08-01 10:40:13 -070040#define GRAPHICS_METADATA_SIZE 4096
Maheshwar Ajja10690722019-01-30 14:12:45 -080041#define CVP_METADATA_SIZE 1024
Praneeth Paladugu3e3e8f82017-03-07 10:42:20 -080042
Shuzhen Wangf3529c32014-01-28 17:15:45 -080043enum ColorSpace_t{
Shuzhen Wang0d113482014-01-28 16:10:22 -080044 ITU_R_601,
45 ITU_R_601_FR,
46 ITU_R_709,
Arun Kumar K.Rc18263e2016-10-03 21:26:10 -070047 ITU_R_2020,
48 ITU_R_2020_FR,
Shuzhen Wangf3529c32014-01-28 17:15:45 -080049};
Shuzhen Wang0d113482014-01-28 16:10:22 -080050
Ramkumar Radhakrishnan92f3abe2013-06-05 13:52:40 -070051struct BufferDim_t {
52 int32_t sliceWidth;
53 int32_t sliceHeight;
54};
55
Praneeth Paladugu3e3e8f82017-03-07 10:42:20 -080056enum UBWC_Version {
57 UBWC_UNUSED = 0,
58 UBWC_1_0 = 0x1,
59 UBWC_2_0 = 0x2,
Varun Arorad7bb8692018-09-11 15:22:00 -070060 UBWC_3_0 = 0x3,
Gousemoodhin Nadaf8da58ee2019-01-03 10:44:59 +053061 UBWC_4_0 = 0x4,
Praneeth Paladugu3e3e8f82017-03-07 10:42:20 -080062 UBWC_MAX_VERSION = 0xFF,
63};
64
65struct UBWC_2_0_Stats {
66 uint32_t nCRStatsTile32; /**< UBWC Stats info for 32 Byte Tile */
67 uint32_t nCRStatsTile64; /**< UBWC Stats info for 64 Byte Tile */
68 uint32_t nCRStatsTile96; /**< UBWC Stats info for 96 Byte Tile */
69 uint32_t nCRStatsTile128; /**< UBWC Stats info for 128 Byte Tile */
70 uint32_t nCRStatsTile160; /**< UBWC Stats info for 160 Byte Tile */
71 uint32_t nCRStatsTile192; /**< UBWC Stats info for 192 Byte Tile */
72 uint32_t nCRStatsTile256; /**< UBWC Stats info for 256 Byte Tile */
73};
74
75struct UBWCStats {
76 enum UBWC_Version version; /* Union depends on this version. */
77 uint8_t bDataValid; /* If [non-zero], CR Stats data is valid.
78 * Consumers may use stats data.
79 * If [zero], CR Stats data is invalid.
80 * Consumers *Shall* not use stats data */
81 union {
82 struct UBWC_2_0_Stats ubwc_stats;
83 uint32_t reserved[MAX_UBWC_STATS_LENGTH]; /* This is for future */
84 };
85};
86
Mohan Pallaka5d814432018-08-01 10:40:13 -070087typedef struct GraphicsMetadata {
88 uint32_t size;
89 uint32_t data[GRAPHICS_METADATA_SIZE];
90} GraphicsMetadata;
91
Mihir Ganu3d401542019-04-03 11:08:06 -070092#define VIDEO_HISTOGRAM_STATS_SIZE (4 * 1024)
93/* Frame type bit mask */
94#define QD_SYNC_FRAME (0x1 << 0)
95struct VideoHistogramMetadata {
96 uint32_t stats_info[1024]; /* video stats payload */
97 uint32_t stat_len; /* Payload size in bytes */
98 uint32_t frame_type; /* bit mask to indicate frame type */
99 uint32_t display_width;
100 uint32_t display_height;
101 uint32_t decode_width;
102 uint32_t decode_height;
103 uint32_t reserved[12];
104};
105
Maheshwar Ajja99fa6bb2019-09-30 15:21:45 -0700106enum CVPMetadataFlags {
107 /* bit wise flags */
108 CVP_METADATA_FLAG_NONE = 0x00000000,
109 CVP_METADATA_FLAG_REPEAT = 0x00000001,
110};
111
Maheshwar Ajja10690722019-01-30 14:12:45 -0800112typedef struct CVPMetadata {
113 uint32_t size; /* payload size in bytes */
114 uint8_t payload[CVP_METADATA_SIZE];
Akshata Sahukaraab1e562019-07-30 13:57:25 -0700115 uint32_t capture_frame_rate;
116 /* Frame rate in Q16 format.
117 Eg: fps = 7.5, then
118 capture_frame_rate = 7 << 16 --> Upper 16 bits to represent 7
119 capture_frame_rate |= 5 -------> Lower 16 bits to represent 5
120
121 If size > 0, framerate is valid
122 If size = 0, invalid data, so ignore all parameters */
123 uint32_t cvp_frame_rate;
Maheshwar Ajja99fa6bb2019-09-30 15:21:45 -0700124 enum CVPMetadataFlags flags;
125 uint32_t reserved[8];
Maheshwar Ajja10690722019-01-30 14:12:45 -0800126} CVPMetadata;
127
Saurabh Shah5daeee52013-01-23 16:52:26 +0800128struct MetaData_t {
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800129 int32_t operation;
130 int32_t interlaced;
Shuzhen Wangf3529c32014-01-28 17:15:45 -0800131 struct BufferDim_t bufferDim;
feifanz9cc23032016-03-23 18:48:56 +0800132 float refreshrate;
Arun Kumar K.Rda2f69b2014-09-30 15:45:37 -0700133 /* Gralloc sets PRIV_SECURE_BUFFER flag to inform that the buffers are from
134 * ION_SECURE. which should not be mapped. However, for GPU post proc
135 * feature, GFX needs to map this buffer, in the client context and in SF
136 * context, it should not. Hence to differentiate, add this metadata field
137 * for clients to set, and GPU will to read and know when to map the
138 * SECURE_BUFFER(ION) */
139 int32_t mapSecureBuffer;
Naseer Ahmed3324ff72015-01-21 17:14:44 -0500140 /* The supported formats are defined in gralloc_priv.h to
141 * support legacy code*/
142 uint32_t s3dFormat;
Sushil Chauhane7acc3c2015-06-23 16:22:30 -0700143 /* VENUS output buffer is linear for UBWC Interlaced video */
144 uint32_t linearFormat;
Saurabh Shah95f83682015-10-16 10:30:04 -0700145 /* Set by graphics to indicate that this buffer will be written to but not
146 * swapped out */
Saurabh Shahb8067a42015-11-06 16:52:02 -0800147 uint32_t isSingleBufferMode;
Naseer Ahmede8f254d2016-08-02 20:06:40 -0400148 /* Set by camera to program the VT Timestamp */
149 uint64_t vtTimeStamp;
Arun Kumar K.Rb2771bf2016-10-03 21:38:23 -0700150 /* Color Aspects + HDR info */
151 ColorMetaData color;
Praneeth Paladugu3e3e8f82017-03-07 10:42:20 -0800152 /* Consumer should read this data as follows based on
153 * Gralloc flag "interlaced" listed above.
154 * [0] : If it is progressive.
155 * [0] : Top field, if it is interlaced.
156 * [1] : Do not read, if it is progressive.
157 * [1] : Bottom field, if it is interlaced.
158 */
159 struct UBWCStats ubwcCRStats[2];
Ashwini Rao6e616962017-11-28 12:12:46 -0800160 /* Set by camera to indicate that this buffer will be used for a High
161 * Performance Video Usecase */
162 uint32_t isVideoPerfMode;
Mohan Pallaka5d814432018-08-01 10:40:13 -0700163 /* Populated and used by adreno during buffer size calculation.
164 * Set only for RGB formats. */
165 GraphicsMetadata graphics_metadata;
Mihir Ganu3d401542019-04-03 11:08:06 -0700166 /* Video hisogram stats populated by video decoder */
167 struct VideoHistogramMetadata video_histogram_stats;
Maheshwar Ajja10690722019-01-30 14:12:45 -0800168 /*
169 * Producer (camera) will set cvp metadata and consumer (video) will
170 * use it. The format of metadata is known to producer and consumer.
171 */
172 CVPMetadata cvpMetadata;
Saurabh Shah5daeee52013-01-23 16:52:26 +0800173};
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800174
Shuzhen Wangf3529c32014-01-28 17:15:45 -0800175enum DispParamType {
Mohan Pallaka5d814432018-08-01 10:40:13 -0700176 SET_VT_TIMESTAMP = 0x0001,
177 COLOR_METADATA = 0x0002,
178 PP_PARAM_INTERLACED = 0x0004,
179 SET_VIDEO_PERF_MODE = 0x0008,
180 SET_GRAPHICS_METADATA = 0x0010,
181 SET_UNUSED = 0x0020,
182 SET_UBWC_CR_STATS_INFO = 0x0040,
183 UPDATE_BUFFER_GEOMETRY = 0x0080,
184 UPDATE_REFRESH_RATE = 0x0100,
185 UPDATE_COLOR_SPACE = 0x0200,
186 MAP_SECURE_BUFFER = 0x0400,
187 S3D_FORMAT = 0x0800,
188 LINEAR_FORMAT = 0x1000,
189 SET_IGC = 0x2000,
190 SET_SINGLE_BUFFER_MODE = 0x4000,
191 SET_S3D_COMP = 0x8000,
Maheshwar Ajja10690722019-01-30 14:12:45 -0800192 SET_CVP_METADATA = 0x00010000,
Mihir Ganu3d401542019-04-03 11:08:06 -0700193 SET_VIDEO_HISTOGRAM_STATS = 0x00020000
Shuzhen Wangf3529c32014-01-28 17:15:45 -0800194};
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800195
feifanz9cc23032016-03-23 18:48:56 +0800196enum DispFetchParamType {
Mohan Pallaka5d814432018-08-01 10:40:13 -0700197 GET_VT_TIMESTAMP = 0x0001,
198 GET_COLOR_METADATA = 0x0002,
199 GET_PP_PARAM_INTERLACED = 0x0004,
200 GET_VIDEO_PERF_MODE = 0x0008,
201 GET_GRAPHICS_METADATA = 0x0010,
202 GET_UNUSED = 0X0020,
203 GET_UBWC_CR_STATS_INFO = 0x0040,
204 GET_BUFFER_GEOMETRY = 0x0080,
205 GET_REFRESH_RATE = 0x0100,
206 GET_COLOR_SPACE = 0x0200,
207 GET_MAP_SECURE_BUFFER = 0x0400,
208 GET_S3D_FORMAT = 0x0800,
209 GET_LINEAR_FORMAT = 0x1000,
210 GET_IGC = 0x2000,
211 GET_SINGLE_BUFFER_MODE = 0x4000,
212 GET_S3D_COMP = 0x8000,
Maheshwar Ajja10690722019-01-30 14:12:45 -0800213 GET_CVP_METADATA = 0x00010000,
Mihir Ganu3d401542019-04-03 11:08:06 -0700214 GET_VIDEO_HISTOGRAM_STATS = 0x00020000
feifanz9cc23032016-03-23 18:48:56 +0800215};
216
Shuzhen Wangf3529c32014-01-28 17:15:45 -0800217struct private_handle_t;
218int setMetaData(struct private_handle_t *handle, enum DispParamType paramType,
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400219 void *param);
220int setMetaDataVa(struct MetaData_t* data, enum DispParamType paramType,
221 void *param);
Shuzhen Wangf3529c32014-01-28 17:15:45 -0800222
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400223int getMetaData(struct private_handle_t *handle,
224 enum DispFetchParamType paramType,
225 void *param);
226int getMetaDataVa(struct MetaData_t* data, enum DispFetchParamType paramType,
227 void *param);
feifanz9cc23032016-03-23 18:48:56 +0800228
229int copyMetaData(struct private_handle_t *src, struct private_handle_t *dst);
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400230int copyMetaDataVaToHandle(struct MetaData_t *src, struct private_handle_t *dst);
231int copyMetaDataHandleToVa(struct private_handle_t* src, struct MetaData_t *dst);
232int copyMetaDataVaToVa(struct MetaData_t *src, struct MetaData_t *dst);
Ray Zhang8ace84d2016-08-08 19:36:03 +0800233
234int clearMetaData(struct private_handle_t *handle, enum DispParamType paramType);
Naseer Ahmed2e6bee12017-04-13 22:45:54 -0400235int clearMetaDataVa(struct MetaData_t *data, enum DispParamType paramType);
236
237unsigned long getMetaDataSize();
Ray Zhang8ace84d2016-08-08 19:36:03 +0800238
Praveen Chavan5e5679a2018-11-18 11:14:19 -0800239// Map, access metadata and unmap. Used by clients that do not import/free but
240// clone and delete native_handle
241int setMetaDataAndUnmap(struct private_handle_t *handle, enum DispParamType paramType,
242 void *param);
243int getMetaDataAndUnmap(struct private_handle_t *handle,
244 enum DispFetchParamType paramType,
245 void *param);
246
Shuzhen Wangf3529c32014-01-28 17:15:45 -0800247#ifdef __cplusplus
248}
249#endif
Ramkumar Radhakrishnan47573e22012-11-07 11:36:41 -0800250
251#endif /* _QDMETADATA_H */
252