blob: 6d084f35fc681690e4865f68d1ad32b83d6a61fd [file] [log] [blame]
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -07001/*
Arun Kumar K.R2aa44c62014-01-21 23:08:28 -08002 * Copyright (c) 2012-2014, Linux Foundation. All rights reserved.
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -07003 *
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 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 LOG_TAG
31#define LOG_TAG "qsfdump"
32#endif
33#define LOG_NDEBUG 0
34#include <hwc_utils.h>
35#include <hwc_dump_layers.h>
36#include <cutils/log.h>
37#include <sys/stat.h>
38#include <comptype.h>
39#include <SkBitmap.h>
40#include <SkImageEncoder.h>
Arun Kumar K.R2aa44c62014-01-21 23:08:28 -080041#ifdef STDC_FORMAT_MACROS
42#include <inttypes.h>
43#endif
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -070044
45namespace qhwc {
46
47// MAX_ALLOWED_FRAMEDUMPS must be capped to (LONG_MAX - 1)
48// 60fps => 216000 frames per hour
49// Below setting of 216000 * 24 * 7 => 1 week or 168 hours of capture.
50 enum {
51 MAX_ALLOWED_FRAMEDUMPS = (216000 * 24 * 7)
52 };
53
54bool HwcDebug::sDumpEnable = false;
55
56HwcDebug::HwcDebug(uint32_t dpy):
57 mDumpCntLimRaw(0),
58 mDumpCntrRaw(1),
59 mDumpCntLimPng(0),
60 mDumpCntrPng(1),
61 mDpy(dpy) {
62 char dumpPropStr[PROPERTY_VALUE_MAX];
63 if(mDpy) {
Ramkumar Radhakrishnan36bd5272014-01-31 20:03:01 -080064 strlcpy(mDisplayName, "external", sizeof(mDisplayName));
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -070065 } else {
Ramkumar Radhakrishnan36bd5272014-01-31 20:03:01 -080066 strlcpy(mDisplayName, "primary", sizeof(mDisplayName));
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -070067 }
Ramkumar Radhakrishnan36bd5272014-01-31 20:03:01 -080068 snprintf(mDumpPropKeyDisplayType, sizeof(mDumpPropKeyDisplayType),
69 "debug.sf.dump.%s", (char *)mDisplayName);
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -070070
71 if ((property_get("debug.sf.dump.enable", dumpPropStr, NULL) > 0)) {
72 if(!strncmp(dumpPropStr, "true", strlen("true"))) {
73 sDumpEnable = true;
74 }
75 }
76}
77
78void HwcDebug::dumpLayers(hwc_display_contents_1_t* list)
79{
80 // Check need for dumping layers for debugging.
81 if (UNLIKELY(sDumpEnable) && UNLIKELY(needToDumpLayers()) && LIKELY(list)) {
82 logHwcProps(list->flags);
83 for (size_t i = 0; i < list->numHwLayers; i++) {
84 logLayer(i, list->hwLayers);
85 dumpLayer(i, list->hwLayers);
86 }
87 }
88}
89
90bool HwcDebug::needToDumpLayers()
91{
92 bool bDumpLayer = false;
93 char dumpPropStr[PROPERTY_VALUE_MAX];
94 // Enable primary dump and disable external dump by default.
95 bool bDumpEnable = !mDpy;
96 time_t timeNow;
97 tm dumpTime;
98
99 // Override the bDumpEnable based on the property value, if the property
100 // is present in the build.prop file.
101 if ((property_get(mDumpPropKeyDisplayType, dumpPropStr, NULL) > 0)) {
102 if(!strncmp(dumpPropStr, "true", strlen("true")))
103 bDumpEnable = true;
104 else
105 bDumpEnable = false;
106 }
107
108 if (false == bDumpEnable)
109 return false;
110
111 time(&timeNow);
112 localtime_r(&timeNow, &dumpTime);
113
114 if ((property_get("debug.sf.dump.png", dumpPropStr, NULL) > 0) &&
115 (strncmp(dumpPropStr, mDumpPropStrPng, PROPERTY_VALUE_MAX - 1))) {
116 // Strings exist & not equal implies it has changed, so trigger a dump
Ramkumar Radhakrishnan36bd5272014-01-31 20:03:01 -0800117 strlcpy(mDumpPropStrPng, dumpPropStr, sizeof(mDumpPropStrPng));
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700118 mDumpCntLimPng = atoi(dumpPropStr);
119 if (mDumpCntLimPng > MAX_ALLOWED_FRAMEDUMPS) {
120 ALOGW("Warning: Using debug.sf.dump.png %d (= max)",
121 MAX_ALLOWED_FRAMEDUMPS);
122 mDumpCntLimPng = MAX_ALLOWED_FRAMEDUMPS;
123 }
124 mDumpCntLimPng = (mDumpCntLimPng < 0) ? 0: mDumpCntLimPng;
125 if (mDumpCntLimPng) {
Ramkumar Radhakrishnan36bd5272014-01-31 20:03:01 -0800126 snprintf(mDumpDirPng, sizeof(mDumpDirPng),
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700127 "/data/sfdump.png.%04d.%02d.%02d.%02d.%02d.%02d",
128 dumpTime.tm_year + 1900, dumpTime.tm_mon + 1,
129 dumpTime.tm_mday, dumpTime.tm_hour,
130 dumpTime.tm_min, dumpTime.tm_sec);
131 if (0 == mkdir(mDumpDirPng, 0777))
132 mDumpCntrPng = 0;
133 else {
134 ALOGE("Error: %s. Failed to create sfdump directory: %s",
135 strerror(errno), mDumpDirPng);
136 mDumpCntrPng = mDumpCntLimPng + 1;
137 }
138 }
139 }
140
141 if (mDumpCntrPng <= mDumpCntLimPng)
142 mDumpCntrPng++;
143
144 if ((property_get("debug.sf.dump", dumpPropStr, NULL) > 0) &&
145 (strncmp(dumpPropStr, mDumpPropStrRaw, PROPERTY_VALUE_MAX - 1))) {
146 // Strings exist & not equal implies it has changed, so trigger a dump
Ramkumar Radhakrishnan36bd5272014-01-31 20:03:01 -0800147 strlcpy(mDumpPropStrRaw, dumpPropStr, sizeof(mDumpPropStrRaw));
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700148 mDumpCntLimRaw = atoi(dumpPropStr);
149 if (mDumpCntLimRaw > MAX_ALLOWED_FRAMEDUMPS) {
150 ALOGW("Warning: Using debug.sf.dump %d (= max)",
151 MAX_ALLOWED_FRAMEDUMPS);
152 mDumpCntLimRaw = MAX_ALLOWED_FRAMEDUMPS;
153 }
154 mDumpCntLimRaw = (mDumpCntLimRaw < 0) ? 0: mDumpCntLimRaw;
155 if (mDumpCntLimRaw) {
Ramkumar Radhakrishnan36bd5272014-01-31 20:03:01 -0800156 snprintf(mDumpDirRaw, sizeof(mDumpDirRaw),
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700157 "/data/sfdump.raw.%04d.%02d.%02d.%02d.%02d.%02d",
158 dumpTime.tm_year + 1900, dumpTime.tm_mon + 1,
159 dumpTime.tm_mday, dumpTime.tm_hour,
160 dumpTime.tm_min, dumpTime.tm_sec);
161 if (0 == mkdir(mDumpDirRaw, 0777))
162 mDumpCntrRaw = 0;
163 else {
164 ALOGE("Error: %s. Failed to create sfdump directory: %s",
165 strerror(errno), mDumpDirRaw);
166 mDumpCntrRaw = mDumpCntLimRaw + 1;
167 }
168 }
169 }
170
171 if (mDumpCntrRaw <= mDumpCntLimRaw)
172 mDumpCntrRaw++;
173
174 bDumpLayer = (mDumpCntLimPng || mDumpCntLimRaw)? true : false;
175 return bDumpLayer;
176}
177
178void HwcDebug::logHwcProps(uint32_t listFlags)
179{
180 static int hwcModuleCompType = -1;
181 static int sMdpCompMaxLayers = 0;
182 static String8 hwcModuleCompTypeLog("");
183 if (-1 == hwcModuleCompType) {
184 // One time stuff
185 char mdpCompPropStr[PROPERTY_VALUE_MAX];
186 if (property_get("debug.mdpcomp.maxlayer", mdpCompPropStr, NULL) > 0) {
187 sMdpCompMaxLayers = atoi(mdpCompPropStr);
188 }
189 hwcModuleCompType =
190 qdutils::QCCompositionType::getInstance().getCompositionType();
191 hwcModuleCompTypeLog.appendFormat("%s%s%s%s%s%s",
192 // Is hwc module composition type now a bit-field?!
193 (hwcModuleCompType == qdutils::COMPOSITION_TYPE_GPU)?
194 "[GPU]": "",
195 (hwcModuleCompType & qdutils::COMPOSITION_TYPE_MDP)?
196 "[MDP]": "",
197 (hwcModuleCompType & qdutils::COMPOSITION_TYPE_C2D)?
198 "[C2D]": "",
199 (hwcModuleCompType & qdutils::COMPOSITION_TYPE_CPU)?
200 "[CPU]": "",
201 (hwcModuleCompType & qdutils::COMPOSITION_TYPE_DYN)?
202 "[DYN]": "",
203 (hwcModuleCompType >= (qdutils::COMPOSITION_TYPE_DYN << 1))?
204 "[???]": "");
205 }
206 ALOGI("Display[%s] Layer[*] %s-HwcModuleCompType, %d-layer MdpComp %s",
207 mDisplayName, hwcModuleCompTypeLog.string(), sMdpCompMaxLayers,
208 (listFlags & HWC_GEOMETRY_CHANGED)? "[HwcList Geometry Changed]": "");
209}
210
211void HwcDebug::logLayer(size_t layerIndex, hwc_layer_1_t hwLayers[])
212{
213 if (NULL == hwLayers) {
Praveena Pachipulusud9443c72014-02-17 10:42:28 +0530214 ALOGE("Display[%s] Layer[%zu] Error. No hwc layers to log.",
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700215 mDisplayName, layerIndex);
216 return;
217 }
218
219 hwc_layer_1_t *layer = &hwLayers[layerIndex];
Saurabh Shah62e1d732013-09-17 10:44:05 -0700220 hwc_rect_t sourceCrop = integerizeSourceCrop(layer->sourceCropf);
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700221 hwc_rect_t displayFrame = layer->displayFrame;
222 size_t numHwcRects = layer->visibleRegionScreen.numRects;
223 hwc_rect_t const *hwcRects = layer->visibleRegionScreen.rects;
224 private_handle_t *hnd = (private_handle_t *)layer->handle;
225
226 char pixFormatStr[32] = "None";
227 String8 hwcVisRegsScrLog("[None]");
228
229 for (size_t i = 0 ; (hwcRects && (i < numHwcRects)); i++) {
230 if (0 == i)
231 hwcVisRegsScrLog.clear();
232 hwcVisRegsScrLog.appendFormat("[%dl, %dt, %dr, %db]",
233 hwcRects[i].left, hwcRects[i].top,
234 hwcRects[i].right, hwcRects[i].bottom);
235 }
236
237 if (hnd)
238 getHalPixelFormatStr(hnd->format, pixFormatStr);
239
240 // Log Line 1
Praveena Pachipulusud9443c72014-02-17 10:42:28 +0530241 ALOGI("Display[%s] Layer[%zu] SrcBuff[%dx%d] SrcCrop[%dl, %dt, %dr, %db] "
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700242 "DispFrame[%dl, %dt, %dr, %db] VisRegsScr%s", mDisplayName, layerIndex,
Ramkumar Radhakrishnan92f3abe2013-06-05 13:52:40 -0700243 (hnd)? getWidth(hnd) : -1, (hnd)? getHeight(hnd) : -1,
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700244 sourceCrop.left, sourceCrop.top,
245 sourceCrop.right, sourceCrop.bottom,
246 displayFrame.left, displayFrame.top,
247 displayFrame.right, displayFrame.bottom,
248 hwcVisRegsScrLog.string());
249 // Log Line 2
Praveena Pachipulusud9443c72014-02-17 10:42:28 +0530250 ALOGI("Display[%s] Layer[%zu] LayerCompType = %s, Format = %s, "
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700251 "Orientation = %s, Flags = %s%s%s, Hints = %s%s%s, "
252 "Blending = %s%s%s", mDisplayName, layerIndex,
253 (layer->compositionType == HWC_FRAMEBUFFER)? "Framebuffer(GPU)":
254 (layer->compositionType == HWC_OVERLAY)? "Overlay":
255 (layer->compositionType == HWC_BACKGROUND)? "Background":"???",
256 pixFormatStr,
257 (layer->transform == 0)? "ROT_0":
258 (layer->transform == HWC_TRANSFORM_FLIP_H)? "FLIP_H":
259 (layer->transform == HWC_TRANSFORM_FLIP_V)? "FLIP_V":
260 (layer->transform == HWC_TRANSFORM_ROT_90)? "ROT_90":
261 "ROT_INVALID",
262 (layer->flags)? "": "[None]",
263 (layer->flags & HWC_SKIP_LAYER)? "[Skip layer]":"",
264 (layer->flags & qhwc::HWC_MDPCOMP)? "[MDP Comp]":"",
265 (layer->hints)? "":"[None]",
266 (layer->hints & HWC_HINT_TRIPLE_BUFFER)? "[Triple Buffer]":"",
267 (layer->hints & HWC_HINT_CLEAR_FB)? "[Clear FB]":"",
268 (layer->blending == HWC_BLENDING_NONE)? "[None]":"",
269 (layer->blending == HWC_BLENDING_PREMULT)? "[PreMult]":"",
270 (layer->blending == HWC_BLENDING_COVERAGE)? "[Coverage]":"");
271}
272
273void HwcDebug::dumpLayer(size_t layerIndex, hwc_layer_1_t hwLayers[])
274{
275 char dumpLogStrPng[128] = "";
276 char dumpLogStrRaw[128] = "";
277 bool needDumpPng = (mDumpCntrPng <= mDumpCntLimPng)? true:false;
278 bool needDumpRaw = (mDumpCntrRaw <= mDumpCntLimRaw)? true:false;
279
280 if (needDumpPng) {
Ramkumar Radhakrishnan36bd5272014-01-31 20:03:01 -0800281 snprintf(dumpLogStrPng, sizeof(dumpLogStrPng),
282 "[png-dump-frame: %03d of %03d]", mDumpCntrPng,
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700283 mDumpCntLimPng);
284 }
285 if (needDumpRaw) {
Ramkumar Radhakrishnan36bd5272014-01-31 20:03:01 -0800286 snprintf(dumpLogStrRaw, sizeof(dumpLogStrRaw),
287 "[raw-dump-frame: %03d of %03d]", mDumpCntrRaw,
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700288 mDumpCntLimRaw);
289 }
290
291 if (!(needDumpPng || needDumpRaw))
292 return;
293
294 if (NULL == hwLayers) {
Praveena Pachipulusud9443c72014-02-17 10:42:28 +0530295 ALOGE("Display[%s] Layer[%zu] %s%s Error: No hwc layers to dump.",
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700296 mDisplayName, layerIndex, dumpLogStrRaw, dumpLogStrPng);
297 return;
298 }
299
300 hwc_layer_1_t *layer = &hwLayers[layerIndex];
301 private_handle_t *hnd = (private_handle_t *)layer->handle;
302 char pixFormatStr[32] = "None";
303
304 if (NULL == hnd) {
Praveena Pachipulusud9443c72014-02-17 10:42:28 +0530305 ALOGI("Display[%s] Layer[%zu] %s%s Skipping dump: Bufferless layer.",
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700306 mDisplayName, layerIndex, dumpLogStrRaw, dumpLogStrPng);
307 return;
308 }
309
310 getHalPixelFormatStr(hnd->format, pixFormatStr);
311
312 if (needDumpPng && hnd->base) {
313 bool bResult = false;
314 char dumpFilename[PATH_MAX];
315 SkBitmap *tempSkBmp = new SkBitmap();
316 SkBitmap::Config tempSkBmpConfig = SkBitmap::kNo_Config;
Ramkumar Radhakrishnan36bd5272014-01-31 20:03:01 -0800317 snprintf(dumpFilename, sizeof(dumpFilename),
Praveena Pachipulusud9443c72014-02-17 10:42:28 +0530318 "%s/sfdump%03d.layer%zu.%s.png", mDumpDirPng,
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700319 mDumpCntrPng, layerIndex, mDisplayName);
320
321 switch (hnd->format) {
322 case HAL_PIXEL_FORMAT_RGBA_8888:
323 case HAL_PIXEL_FORMAT_RGBX_8888:
324 case HAL_PIXEL_FORMAT_BGRA_8888:
325 tempSkBmpConfig = SkBitmap::kARGB_8888_Config;
326 break;
327 case HAL_PIXEL_FORMAT_RGB_565:
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700328 tempSkBmpConfig = SkBitmap::kRGB_565_Config;
329 break;
330 case HAL_PIXEL_FORMAT_RGB_888:
331 default:
332 tempSkBmpConfig = SkBitmap::kNo_Config;
333 break;
334 }
335 if (SkBitmap::kNo_Config != tempSkBmpConfig) {
Ramkumar Radhakrishnan92f3abe2013-06-05 13:52:40 -0700336 tempSkBmp->setConfig(tempSkBmpConfig, getWidth(hnd), getHeight(hnd));
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700337 tempSkBmp->setPixels((void*)hnd->base);
338 bResult = SkImageEncoder::EncodeFile(dumpFilename,
339 *tempSkBmp, SkImageEncoder::kPNG_Type, 100);
Praveena Pachipulusud9443c72014-02-17 10:42:28 +0530340 ALOGI("Display[%s] Layer[%zu] %s Dump to %s: %s",
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700341 mDisplayName, layerIndex, dumpLogStrPng,
342 dumpFilename, bResult ? "Success" : "Fail");
343 } else {
Praveena Pachipulusud9443c72014-02-17 10:42:28 +0530344 ALOGI("Display[%s] Layer[%zu] %s Skipping dump: Unsupported layer"
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700345 " format %s for png encoder",
346 mDisplayName, layerIndex, dumpLogStrPng, pixFormatStr);
347 }
348 delete tempSkBmp; // Calls SkBitmap::freePixels() internally.
349 }
350
351 if (needDumpRaw && hnd->base) {
352 char dumpFilename[PATH_MAX];
353 bool bResult = false;
Ramkumar Radhakrishnan36bd5272014-01-31 20:03:01 -0800354 snprintf(dumpFilename, sizeof(dumpFilename),
Praveena Pachipulusud9443c72014-02-17 10:42:28 +0530355 "%s/sfdump%03d.layer%zu.%dx%d.%s.%s.raw",
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700356 mDumpDirRaw, mDumpCntrRaw,
Ramkumar Radhakrishnan92f3abe2013-06-05 13:52:40 -0700357 layerIndex, getWidth(hnd), getHeight(hnd),
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700358 pixFormatStr, mDisplayName);
359 FILE* fp = fopen(dumpFilename, "w+");
360 if (NULL != fp) {
361 bResult = (bool) fwrite((void*)hnd->base, hnd->size, 1, fp);
362 fclose(fp);
363 }
Praveena Pachipulusud9443c72014-02-17 10:42:28 +0530364 ALOGI("Display[%s] Layer[%zu] %s Dump to %s: %s",
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700365 mDisplayName, layerIndex, dumpLogStrRaw,
366 dumpFilename, bResult ? "Success" : "Fail");
367 }
368}
369
370void HwcDebug::getHalPixelFormatStr(int format, char pixFormatStr[])
371{
372 if (!pixFormatStr)
373 return;
374
375 switch(format) {
376 case HAL_PIXEL_FORMAT_RGBA_8888:
Ramkumar Radhakrishnan36bd5272014-01-31 20:03:01 -0800377 strlcpy(pixFormatStr, "RGBA_8888", sizeof(pixFormatStr));
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700378 break;
379 case HAL_PIXEL_FORMAT_RGBX_8888:
Ramkumar Radhakrishnan36bd5272014-01-31 20:03:01 -0800380 strlcpy(pixFormatStr, "RGBX_8888", sizeof(pixFormatStr));
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700381 break;
382 case HAL_PIXEL_FORMAT_RGB_888:
Ramkumar Radhakrishnan36bd5272014-01-31 20:03:01 -0800383 strlcpy(pixFormatStr, "RGB_888", sizeof(pixFormatStr));
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700384 break;
385 case HAL_PIXEL_FORMAT_RGB_565:
Ramkumar Radhakrishnan36bd5272014-01-31 20:03:01 -0800386 strlcpy(pixFormatStr, "RGB_565", sizeof(pixFormatStr));
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700387 break;
388 case HAL_PIXEL_FORMAT_BGRA_8888:
Ramkumar Radhakrishnan36bd5272014-01-31 20:03:01 -0800389 strlcpy(pixFormatStr, "BGRA_8888", sizeof(pixFormatStr));
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700390 break;
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700391 case HAL_PIXEL_FORMAT_YV12:
Ramkumar Radhakrishnan36bd5272014-01-31 20:03:01 -0800392 strlcpy(pixFormatStr, "YV12", sizeof(pixFormatStr));
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700393 break;
394 case HAL_PIXEL_FORMAT_YCbCr_422_SP:
Ramkumar Radhakrishnan36bd5272014-01-31 20:03:01 -0800395 strlcpy(pixFormatStr, "YCbCr_422_SP_NV16", sizeof(pixFormatStr));
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700396 break;
397 case HAL_PIXEL_FORMAT_YCrCb_420_SP:
Ramkumar Radhakrishnan36bd5272014-01-31 20:03:01 -0800398 strlcpy(pixFormatStr, "YCrCb_420_SP_NV21", sizeof(pixFormatStr));
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700399 break;
400 case HAL_PIXEL_FORMAT_YCbCr_422_I:
Ramkumar Radhakrishnan36bd5272014-01-31 20:03:01 -0800401 strlcpy(pixFormatStr, "YCbCr_422_I_YUY2", sizeof(pixFormatStr));
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700402 break;
Ramkumar Radhakrishnanb52399c2013-08-06 20:17:29 -0700403 case HAL_PIXEL_FORMAT_YCrCb_422_I:
Ramkumar Radhakrishnan36bd5272014-01-31 20:03:01 -0800404 strlcpy(pixFormatStr, "YCrCb_422_I_YVYU", sizeof(pixFormatStr));
Ramkumar Radhakrishnanb52399c2013-08-06 20:17:29 -0700405 break;
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700406 case HAL_PIXEL_FORMAT_NV12_ENCODEABLE:
Ramkumar Radhakrishnan36bd5272014-01-31 20:03:01 -0800407 strlcpy(pixFormatStr, "NV12_ENCODEABLE", sizeof(pixFormatStr));
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700408 break;
409 case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED:
Ramkumar Radhakrishnan36bd5272014-01-31 20:03:01 -0800410 strlcpy(pixFormatStr, "YCbCr_420_SP_TILED_TILE_4x2",
411 sizeof(pixFormatStr));
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700412 break;
413 case HAL_PIXEL_FORMAT_YCbCr_420_SP:
Ramkumar Radhakrishnan36bd5272014-01-31 20:03:01 -0800414 strlcpy(pixFormatStr, "YCbCr_420_SP", sizeof(pixFormatStr));
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700415 break;
416 case HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO:
Ramkumar Radhakrishnan36bd5272014-01-31 20:03:01 -0800417 strlcpy(pixFormatStr, "YCrCb_420_SP_ADRENO", sizeof(pixFormatStr));
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700418 break;
419 case HAL_PIXEL_FORMAT_YCrCb_422_SP:
Ramkumar Radhakrishnan36bd5272014-01-31 20:03:01 -0800420 strlcpy(pixFormatStr, "YCrCb_422_SP", sizeof(pixFormatStr));
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700421 break;
422 case HAL_PIXEL_FORMAT_R_8:
Ramkumar Radhakrishnan36bd5272014-01-31 20:03:01 -0800423 strlcpy(pixFormatStr, "R_8", sizeof(pixFormatStr));
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700424 break;
425 case HAL_PIXEL_FORMAT_RG_88:
Ramkumar Radhakrishnan36bd5272014-01-31 20:03:01 -0800426 strlcpy(pixFormatStr, "RG_88", sizeof(pixFormatStr));
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700427 break;
428 case HAL_PIXEL_FORMAT_INTERLACE:
Ramkumar Radhakrishnan36bd5272014-01-31 20:03:01 -0800429 strlcpy(pixFormatStr, "INTERLACE", sizeof(pixFormatStr));
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700430 break;
431 case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
Ramkumar Radhakrishnan36bd5272014-01-31 20:03:01 -0800432 strlcpy(pixFormatStr, "YCbCr_420_SP_VENUS", sizeof(pixFormatStr));
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700433 break;
434 default:
Praveena Pachipulusud9443c72014-02-17 10:42:28 +0530435 size_t len = sizeof(pixFormatStr);
436 snprintf(pixFormatStr, len, "Unknown0x%X", format);
Ramkumar Radhakrishnand224a1a2013-04-05 17:46:55 -0700437 break;
438 }
439}
440
441} // namespace qhwc
442