1ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/* 2a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson* Copyright (c) 2011-2014, The Linux Foundation. All rights reserved. 3ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* 4ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* Redistribution and use in source and binary forms, with or without 5ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* modification, are permitted provided that the following conditions are 6ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* met: 7ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* * Redistributions of source code must retain the above copyright 8ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* notice, this list of conditions and the following disclaimer. 9ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* * Redistributions in binary form must reproduce the above 10ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* copyright notice, this list of conditions and the following 11ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* disclaimer in the documentation and/or other materials provided 12ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* with the distribution. 13ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* * Neither the name of The Linux Foundation nor the names of its 14ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* contributors may be used to endorse or promote products derived 15ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* from this software without specific prior written permission. 16ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* 17ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 18ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 20ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 21ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson*/ 29ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 30ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <stdlib.h> 31ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <math.h> 32ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <utils/Log.h> 33ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <linux/msm_mdp.h> 34ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <cutils/properties.h> 35ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "gralloc_priv.h" 36ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "overlayUtils.h" 37ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "mdpWrapper.h" 38ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "mdp_version.h" 39a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#include <hardware/hwcomposer_defs.h> 40ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 41ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson// just a helper static thingy 42ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonnamespace { 43ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstruct IOFile { 44ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson IOFile(const char* s, const char* mode) : fp(0) { 45ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson fp = ::fopen(s, mode); 46ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(!fp) { 47ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("Failed open %s", s); 48ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 49ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 50ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson template <class T> 51ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson size_t read(T& r, size_t elem) { 52ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(fp) { 53ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return ::fread(&r, sizeof(T), elem, fp); 54ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 55ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return 0; 56ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 57ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson size_t write(const char* s, uint32_t val) { 58ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(fp) { 59ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return ::fprintf(fp, s, val); 60ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 61ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return 0; 62ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 63ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson bool valid() const { return fp != 0; } 64ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ~IOFile() { 65ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(fp) ::fclose(fp); 66ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson fp=0; 67ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 68ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson FILE* fp; 69ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}; 70ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 71ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 72ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonnamespace overlay { 73ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 74ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson//----------From class Res ------------------------------ 75ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonconst char* const Res::fbPath = "/dev/graphics/fb%u"; 76ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonconst char* const Res::rotPath = "/dev/msm_rotator"; 77ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson//-------------------------------------------------------- 78ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 79ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 80ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 81ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonnamespace utils { 82ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 83ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson//-------------------------------------------------------- 84ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson//Refer to graphics.h, gralloc_priv.h, msm_mdp.h 85ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint getMdpFormat(int format) { 86ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson switch (format) { 87ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //From graphics.h 88ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HAL_PIXEL_FORMAT_RGBA_8888 : 89ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return MDP_RGBA_8888; 90ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HAL_PIXEL_FORMAT_RGBX_8888: 91ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return MDP_RGBX_8888; 92ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HAL_PIXEL_FORMAT_RGB_888: 93ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return MDP_RGB_888; 94ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HAL_PIXEL_FORMAT_RGB_565: 95ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return MDP_RGB_565; 96ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HAL_PIXEL_FORMAT_BGRA_8888: 97ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return MDP_BGRA_8888; 98a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson case HAL_PIXEL_FORMAT_BGRX_8888: 99a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return MDP_BGRX_8888; 100ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HAL_PIXEL_FORMAT_YV12: 101ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return MDP_Y_CR_CB_GH2V2; 102ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HAL_PIXEL_FORMAT_YCbCr_422_SP: 103ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return MDP_Y_CBCR_H2V1; 104ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HAL_PIXEL_FORMAT_YCrCb_420_SP: 105ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return MDP_Y_CRCB_H2V2; 106ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 107ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //From gralloc_priv.h 108ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED: 109ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return MDP_Y_CBCR_H2V2_TILE; 110ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HAL_PIXEL_FORMAT_YCbCr_420_SP: 111ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return MDP_Y_CBCR_H2V2; 112ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HAL_PIXEL_FORMAT_YCrCb_422_SP: 113ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return MDP_Y_CRCB_H2V1; 114a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson case HAL_PIXEL_FORMAT_YCbCr_422_I: 115a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return MDP_YCBYCR_H2V1; 116a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson case HAL_PIXEL_FORMAT_YCrCb_422_I: 117a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return MDP_YCRYCB_H2V1; 118ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HAL_PIXEL_FORMAT_YCbCr_444_SP: 119ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return MDP_Y_CBCR_H1V1; 120ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HAL_PIXEL_FORMAT_YCrCb_444_SP: 121ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return MDP_Y_CRCB_H1V1; 122ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS: 123ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case HAL_PIXEL_FORMAT_NV12_ENCODEABLE: 124ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //NV12 encodeable format maps to the venus format on 125ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //B-Family targets 126ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return MDP_Y_CBCR_H2V2_VENUS; 127ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson default: 128ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Unsupported by MDP 129ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //---graphics.h-------- 130ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //HAL_PIXEL_FORMAT_RGBA_5551 131ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //HAL_PIXEL_FORMAT_RGBA_4444 132ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //---gralloc_priv.h----- 133ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO = 0x7FA30C01 134ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //HAL_PIXEL_FORMAT_R_8 = 0x10D 135ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //HAL_PIXEL_FORMAT_RG_88 = 0x10E 136ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: Unsupported HAL format = 0x%x", __func__, format); 137ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -1; 138ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 139ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // not reached 140ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -1; 141ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 142ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 143a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson// This function returns corresponding tile format 144a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson// MDSS support following RGB tile formats 145a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson// 32 bit formats 146a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson// 16 bit formats 147a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonint getMdpFormat(int format, bool tileEnabled) 148a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson{ 149a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!tileEnabled) { 150a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return getMdpFormat(format); 151a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 152a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson switch (format) { 153a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson case HAL_PIXEL_FORMAT_RGBA_8888 : 154a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return MDP_RGBA_8888_TILE; 155a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson case HAL_PIXEL_FORMAT_RGBX_8888: 156a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return MDP_RGBX_8888_TILE; 157a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson case HAL_PIXEL_FORMAT_RGB_565: 158a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return MDP_RGB_565_TILE; 159a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson case HAL_PIXEL_FORMAT_BGRA_8888: 160a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return MDP_BGRA_8888_TILE; 161a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson case HAL_PIXEL_FORMAT_BGRX_8888: 162a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return MDP_BGRX_8888_TILE; 163a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson default: 164a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return getMdpFormat(format); 165a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 166a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 167a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 168a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 169a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 170ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson//Takes mdp format as input and translates to equivalent HAL format 171ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson//Refer to graphics.h, gralloc_priv.h, msm_mdp.h for formats. 172ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint getHALFormat(int mdpFormat) { 173ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson switch (mdpFormat) { 174ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //From graphics.h 175ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case MDP_RGBA_8888: 176ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return HAL_PIXEL_FORMAT_RGBA_8888; 177ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case MDP_RGBX_8888: 178ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return HAL_PIXEL_FORMAT_RGBX_8888; 179ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case MDP_RGB_888: 180ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return HAL_PIXEL_FORMAT_RGB_888; 181ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case MDP_RGB_565: 182ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return HAL_PIXEL_FORMAT_RGB_565; 183ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case MDP_BGRA_8888: 184ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return HAL_PIXEL_FORMAT_BGRA_8888; 185ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case MDP_Y_CR_CB_GH2V2: 186ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return HAL_PIXEL_FORMAT_YV12; 187ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case MDP_Y_CBCR_H2V1: 188ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return HAL_PIXEL_FORMAT_YCbCr_422_SP; 189ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case MDP_Y_CRCB_H2V2: 190ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return HAL_PIXEL_FORMAT_YCrCb_420_SP; 191ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 192ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //From gralloc_priv.h 193ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case MDP_Y_CBCR_H2V2_TILE: 194ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED; 195ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case MDP_Y_CBCR_H2V2: 196ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return HAL_PIXEL_FORMAT_YCbCr_420_SP; 197ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case MDP_Y_CRCB_H2V1: 198ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return HAL_PIXEL_FORMAT_YCrCb_422_SP; 199a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson case MDP_YCBYCR_H2V1: 200a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return HAL_PIXEL_FORMAT_YCbCr_422_I; 201a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson case MDP_YCRYCB_H2V1: 202a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return HAL_PIXEL_FORMAT_YCrCb_422_I; 203a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson case MDP_Y_CBCR_H1V1: 204ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return HAL_PIXEL_FORMAT_YCbCr_444_SP; 205ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case MDP_Y_CRCB_H1V1: 206ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return HAL_PIXEL_FORMAT_YCrCb_444_SP; 207ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson case MDP_Y_CBCR_H2V2_VENUS: 208ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS; 209ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson default: 210ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: Unsupported MDP format = 0x%x", __func__, mdpFormat); 211ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -1; 212ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 213ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // not reached 214ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return -1; 215ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 216ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 217ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint getMdpOrient(eTransform rotation) { 218ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int retTrans = 0; 219ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson bool trans90 = false; 220ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int mdpVersion = qdutils::MDPVersion::getInstance().getMDPVersion(); 221ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson bool aFamily = (mdpVersion < qdutils::MDSS_V5); 222ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 223ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGD_IF(DEBUG_OVERLAY, "%s: In rotation = %d", __FUNCTION__, rotation); 224ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(rotation & OVERLAY_TRANSFORM_ROT_90) { 225ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson retTrans |= MDP_ROT_90; 226ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson trans90 = true; 227ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 228ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 229ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(rotation & OVERLAY_TRANSFORM_FLIP_H) { 230ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(trans90 && aFamily) { 231ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Swap for a-family, since its driver does 90 first 232ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson retTrans |= MDP_FLIP_UD; 233ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } else { 234ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson retTrans |= MDP_FLIP_LR; 235ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 236ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 237ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 238ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(rotation & OVERLAY_TRANSFORM_FLIP_V) { 239ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(trans90 && aFamily) { 240ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Swap for a-family, since its driver does 90 first 241ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson retTrans |= MDP_FLIP_LR; 242ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } else { 243ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson retTrans |= MDP_FLIP_UD; 244ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 245ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 246ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 247ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGD_IF(DEBUG_OVERLAY, "%s: Out rotation = %d", __FUNCTION__, retTrans); 248ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return retTrans; 249ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 250ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 251ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint getDownscaleFactor(const int& src_w, const int& src_h, 252ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const int& dst_w, const int& dst_h) { 253ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int dscale_factor = utils::ROT_DS_NONE; 254ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // We need this check to engage the rotator whenever possible to assist MDP 255ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // in performing video downscale. 256ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // This saves bandwidth and avoids causing the driver to make too many panel 257ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // -mode switches between BLT (writeback) and non-BLT (Direct) modes. 258ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // Use-case: Video playback [with downscaling and rotation]. 259ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (dst_w && dst_h) 260ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson { 261a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson float fDscale = (float)(src_w * src_h) / (float)(dst_w * dst_h); 262a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson uint32_t dscale = (int)sqrtf(fDscale); 263ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 264ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(dscale < 2) { 265ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // Down-scale to > 50% of orig. 266ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dscale_factor = utils::ROT_DS_NONE; 267ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } else if(dscale < 4) { 268ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // Down-scale to between > 25% to <= 50% of orig. 269ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dscale_factor = utils::ROT_DS_HALF; 270ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } else if(dscale < 8) { 271ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // Down-scale to between > 12.5% to <= 25% of orig. 272ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dscale_factor = utils::ROT_DS_FOURTH; 273ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } else { 274ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson // Down-scale to <= 12.5% of orig. 275ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson dscale_factor = utils::ROT_DS_EIGHTH; 276ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 277ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 278ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return dscale_factor; 279ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 280ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 281ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid getDecimationFactor(const int& src_w, const int& src_h, 28274e109a6891def0f55250476bc28aa2098027606Saurabh Shah const int& dst_w, const int& dst_h, uint8_t& horzDeci, 28374e109a6891def0f55250476bc28aa2098027606Saurabh Shah uint8_t& vertDeci) { 28474e109a6891def0f55250476bc28aa2098027606Saurabh Shah horzDeci = 0; 28574e109a6891def0f55250476bc28aa2098027606Saurabh Shah vertDeci = 0; 28674e109a6891def0f55250476bc28aa2098027606Saurabh Shah float horDscale = ceilf((float)src_w / (float)dst_w); 28774e109a6891def0f55250476bc28aa2098027606Saurabh Shah float verDscale = ceilf((float)src_h / (float)dst_h); 288ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 289ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Next power of 2, if not already 290ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson horDscale = powf(2.0f, ceilf(log2f(horDscale))); 291ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson verDscale = powf(2.0f, ceilf(log2f(verDscale))); 292ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 293ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //Since MDP can do 1/4 dscale and has better quality, split the task 294ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson //between decimator and MDP downscale 295ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson horDscale /= 4.0f; 296ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson verDscale /= 4.0f; 29774e109a6891def0f55250476bc28aa2098027606Saurabh Shah 29874e109a6891def0f55250476bc28aa2098027606Saurabh Shah if((int)horDscale) 29974e109a6891def0f55250476bc28aa2098027606Saurabh Shah horzDeci = (uint8_t)log2f(horDscale); 30074e109a6891def0f55250476bc28aa2098027606Saurabh Shah 30174e109a6891def0f55250476bc28aa2098027606Saurabh Shah if((int)verDscale) 30274e109a6891def0f55250476bc28aa2098027606Saurabh Shah vertDeci = (uint8_t)log2f(verDscale); 30374e109a6891def0f55250476bc28aa2098027606Saurabh Shah 30474e109a6891def0f55250476bc28aa2098027606Saurabh Shah if(src_w > 2048) { 30574e109a6891def0f55250476bc28aa2098027606Saurabh Shah //If the client sends us something > what a layer mixer supports 30674e109a6891def0f55250476bc28aa2098027606Saurabh Shah //then it means it doesn't want to use split-pipe but wants us to 30774e109a6891def0f55250476bc28aa2098027606Saurabh Shah //decimate. A minimum decimation of 2 will ensure that the width is 30874e109a6891def0f55250476bc28aa2098027606Saurabh Shah //always within layer mixer limits. 30974e109a6891def0f55250476bc28aa2098027606Saurabh Shah if(horzDeci < 2) 31074e109a6891def0f55250476bc28aa2098027606Saurabh Shah horzDeci = 2; 31174e109a6891def0f55250476bc28aa2098027606Saurabh Shah } 312ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 313ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 314ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic inline int compute(const uint32_t& x, const uint32_t& y, 315ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const uint32_t& z) { 316ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return x - ( y + z ); 317ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 318ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 319ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid preRotateSource(const eTransform& tr, Whf& whf, Dim& srcCrop) { 320ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(tr & OVERLAY_TRANSFORM_FLIP_H) { 321ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson srcCrop.x = compute(whf.w, srcCrop.x, srcCrop.w); 322ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 323ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(tr & OVERLAY_TRANSFORM_FLIP_V) { 324ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson srcCrop.y = compute(whf.h, srcCrop.y, srcCrop.h); 325ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 326ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(tr & OVERLAY_TRANSFORM_ROT_90) { 327ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson int tmp = srcCrop.x; 328ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson srcCrop.x = compute(whf.h, 329ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson srcCrop.y, 330ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson srcCrop.h); 331ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson srcCrop.y = tmp; 332ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson swap(whf.w, whf.h); 333ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson swap(srcCrop.w, srcCrop.h); 334ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 335ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 336ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 337ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid getDump(char *buf, size_t len, const char *prefix, 338ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const mdp_overlay& ov) { 339ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson char str[256] = {'\0'}; 340ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson snprintf(str, 256, 341ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson "%s id=%d z=%d fg=%d alpha=%d mask=%d flags=0x%x H.Deci=%d," 342ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson "V.Deci=%d\n", 343ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson prefix, ov.id, ov.z_order, ov.is_fg, ov.alpha, 344ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ov.transp_mask, ov.flags, ov.horz_deci, ov.vert_deci); 345a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson strlcat(buf, str, len); 346ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson getDump(buf, len, "\tsrc", ov.src); 347ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson getDump(buf, len, "\tsrc_rect", ov.src_rect); 348ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson getDump(buf, len, "\tdst_rect", ov.dst_rect); 349ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 350ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 351ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid getDump(char *buf, size_t len, const char *prefix, 352ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const msmfb_img& ov) { 353ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson char str_src[256] = {'\0'}; 354ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson snprintf(str_src, 256, 355ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson "%s w=%d h=%d format=%d %s\n", 356ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson prefix, ov.width, ov.height, ov.format, 357ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson overlay::utils::getFormatString(ov.format)); 358a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson strlcat(buf, str_src, len); 359ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 360ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 361ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid getDump(char *buf, size_t len, const char *prefix, 362ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const mdp_rect& ov) { 363ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson char str_rect[256] = {'\0'}; 364ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson snprintf(str_rect, 256, 365ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson "%s x=%d y=%d w=%d h=%d\n", 366ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson prefix, ov.x, ov.y, ov.w, ov.h); 367a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson strlcat(buf, str_rect, len); 368ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 369ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 370ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid getDump(char *buf, size_t len, const char *prefix, 371ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const msmfb_overlay_data& ov) { 372ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson char str[256] = {'\0'}; 373ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson snprintf(str, 256, 374ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson "%s id=%d\n", 375ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson prefix, ov.id); 376a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson strlcat(buf, str, len); 377ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson getDump(buf, len, "\tdata", ov.data); 378ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 379ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 380ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid getDump(char *buf, size_t len, const char *prefix, 381ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const msmfb_data& ov) { 382ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson char str_data[256] = {'\0'}; 383ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson snprintf(str_data, 256, 384ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson "%s offset=%d memid=%d id=%d flags=0x%x\n", 385ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson prefix, ov.offset, ov.memory_id, ov.id, ov.flags); 386a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson strlcat(buf, str_data, len); 387ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 388ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 389ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid getDump(char *buf, size_t len, const char *prefix, 390ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const msm_rotator_img_info& rot) { 391ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson char str[256] = {'\0'}; 392ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson snprintf(str, 256, "%s sessid=%u rot=%d, enable=%d downscale=%d\n", 393ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson prefix, rot.session_id, rot.rotations, rot.enable, 394ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson rot.downscale_ratio); 395a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson strlcat(buf, str, len); 396ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson getDump(buf, len, "\tsrc", rot.src); 397ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson getDump(buf, len, "\tdst", rot.dst); 398ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson getDump(buf, len, "\tsrc_rect", rot.src_rect); 399ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 400ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 401ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid getDump(char *buf, size_t len, const char *prefix, 402ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson const msm_rotator_data_info& rot) { 403ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson char str[256] = {'\0'}; 404ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson snprintf(str, 256, 405ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson "%s sessid=%u\n", 406ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson prefix, rot.session_id); 407a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson strlcat(buf, str, len); 408ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson getDump(buf, len, "\tsrc", rot.src); 409ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson getDump(buf, len, "\tdst", rot.dst); 410ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 411ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 412ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson//Helper to even out x,w and y,h pairs 413ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson//x,y are always evened to ceil and w,h are evened to floor 414ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid normalizeCrop(uint32_t& xy, uint32_t& wh) { 415ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(xy & 1) { 416ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson even_ceil(xy); 417ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(wh & 1) 418ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson even_floor(wh); 419ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson else 420ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson wh -= 2; 421ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } else { 422ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson even_floor(wh); 423ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 424ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 425ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 426ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} // utils 427ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 428ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} // overlay 429