1 /* 2 * Copyright (c) 2011 Intel Corporation. All Rights Reserved. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the 6 * "Software"), to deal in the Software without restriction, including 7 * without limitation the rights to use, copy, modify, merge, publish, 8 * distribute, sub license, and/or sell copies of the Software, and to 9 * permit persons to whom the Software is furnished to do so, subject to 10 * the following conditions: 11 * 12 * The above copyright notice and this permission notice (including the 13 * next paragraph) shall be included in all copies or substantial portions 14 * of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 19 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 20 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 21 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 22 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 * 24 * Authors: 25 * Zhaohan Ren <zhaohan.ren (at) intel.com> 26 * Jiang Fei <jiang.fei (at) intel.com> 27 * Binglin Chen <binglin.chen (at) intel.com> 28 * 29 */ 30 31 #include <binder/IPCThreadState.h> 32 #include <binder/ProcessState.h> 33 #include <binder/IServiceManager.h> 34 #include <gui/Surface.h> 35 #include <gui/SurfaceComposerClient.h> 36 #include <gui/ISurfaceComposer.h> 37 #include <binder/MemoryHeapBase.h> 38 #include "psb_android_glue.h" 39 #include "psb_output_android.h" 40 #include <cutils/log.h> 41 #include <ui/Rect.h> 42 #include <system/window.h> 43 #include <system/graphics.h> 44 #ifdef TARGET_HAS_MULTIPLE_DISPLAY 45 #include "psb_mds.h" 46 #endif 47 48 #ifdef LOG_TAG 49 #undef LOG_TAG 50 #endif 51 52 #define LOG_TAG "pvr_drv_video" 53 54 using namespace android; 55 #ifdef TARGET_HAS_MULTIPLE_DISPLAY 56 using namespace android::intel; 57 #endif 58 59 #ifdef TARGET_HAS_MULTIPLE_DISPLAY 60 61 void init_mds_listener(void* output) { 62 psb_android_output_p aoutput = (psb_android_output_p)output; 63 if (aoutput == NULL) { 64 ALOGE("Invalid input parameter"); 65 return; 66 } 67 if (aoutput->mds == NULL) 68 aoutput->mds = new psbMultiDisplayListener(); 69 } 70 71 void deinit_mds_listener(void* output) { 72 psb_android_output_p aoutput = (psb_android_output_p)output; 73 if (aoutput == NULL) { 74 ALOGE("Invalid input parameter"); 75 return; 76 } 77 if (aoutput->mds != NULL) { 78 delete (psbMultiDisplayListener*)(aoutput->mds); 79 aoutput->mds = NULL; 80 } 81 } 82 83 int psb_android_get_mds_mode(void* output) { 84 if (output == NULL) 85 return MDS_INIT_VALUE; 86 psb_android_output_p aoutput = (psb_android_output_p)output; 87 if (aoutput->mds == NULL) 88 init_mds_listener(aoutput); 89 psbMultiDisplayListener* mds = 90 static_cast<psbMultiDisplayListener*>(aoutput->mds); 91 if (mds == NULL) 92 return MDS_INIT_VALUE; 93 return mds->getMode(); 94 } 95 96 int psb_android_get_mds_decoder_output_resolution(void* output, 97 int* width, int* height, 98 int* offX, int* offY, 99 int* bufW, int* bufH) { 100 if (output == NULL || 101 width == NULL || height == NULL || 102 offX == NULL || offY == NULL || 103 bufW == NULL || bufH == NULL) 104 return 0; 105 psb_android_output_p aoutput = (psb_android_output_p)output; 106 if (aoutput->mds == NULL) 107 init_mds_listener(aoutput); 108 psbMultiDisplayListener* mds = 109 static_cast<psbMultiDisplayListener*>(aoutput->mds); 110 if (mds == NULL) 111 return 0; 112 bool ret = mds->getDecoderOutputResolution(width, height, offX, offY, bufW, bufH); 113 return (ret ? 1 : 0); 114 } 115 116 int psb_android_get_mds_vpp_state(void* output) { 117 bool ret = false; 118 if (output == NULL) { 119 sp<IServiceManager> sm = defaultServiceManager(); 120 if (sm == NULL) 121 return 0; 122 sp<IMDService> imds = interface_cast<IMDService>( 123 sm->getService(String16(INTEL_MDS_SERVICE_NAME))); 124 if (imds == NULL) 125 return 0; 126 sp<IMultiDisplayInfoProvider> mds = imds->getInfoProvider(); 127 if (mds != NULL) { 128 ret = mds->getVppState(); 129 } 130 mds = NULL; 131 return (ret ? 1 : 0); 132 } 133 psb_android_output_p aoutput = (psb_android_output_p)output; 134 if (aoutput->mds == NULL) 135 init_mds_listener(aoutput); 136 psbMultiDisplayListener* mds = 137 static_cast<psbMultiDisplayListener*>(aoutput->mds); 138 ret = mds->getVppState(); 139 if (mds == NULL) 140 return 0; 141 return (ret ? 1 : 0); 142 } 143 144 #else //TARGET_HAS_MULTIPLE_DISPLAY 145 146 #ifdef PSBVIDEO_MRFL_VPP 147 /* VPP is always enabled. It disables decoder rotate. 148 * TODO: remove the dependency the on libVPP. Get it form ISB configure 149 */ 150 int psb_android_get_vpp_state() { 151 return 1; 152 } 153 154 #endif 155 #endif 156 157 unsigned int update_forced; 158 159 int psb_android_surfaceflinger_rotate(void* native_window, int *rotation) 160 { 161 sp<ANativeWindow> mNativeWindow = static_cast<ANativeWindow*>(native_window); 162 int err, transform_hint; 163 164 if (mNativeWindow.get()) { 165 err = mNativeWindow->query(mNativeWindow.get(), NATIVE_WINDOW_TRANSFORM_HINT, &transform_hint); 166 if (err != 0) { 167 ALOGE("%s: NATIVE_WINDOW_TRANSFORM_HINT query failed", __func__); 168 return -1; 169 } 170 switch (transform_hint) { 171 case HAL_TRANSFORM_ROT_90: 172 *rotation = 1; 173 break; 174 case HAL_TRANSFORM_ROT_180: 175 *rotation = 2; 176 break; 177 case HAL_TRANSFORM_ROT_270: 178 *rotation = 3; 179 break; 180 default: 181 *rotation = 0; 182 } 183 } 184 return 0; 185 } 186