• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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@intel.com>
26  *    Jiang Fei  <jiang.fei@intel.com>
27  *    Binglin Chen <binglin.chen@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 #if defined (PSBVIDEO_MRFL_VPP_SETTING) && !defined (TARGET_HAS_MULTIPLE_DISPLAY)
48 #include <VPPSetting.h>
49 #endif
50 
51 #ifdef  LOG_TAG
52 #undef  LOG_TAG
53 #endif
54 
55 #define LOG_TAG "pvr_drv_video"
56 
57 using namespace android;
58 #ifdef TARGET_HAS_MULTIPLE_DISPLAY
59 using namespace android::intel;
60 #endif
61 
62 #ifdef TARGET_HAS_MULTIPLE_DISPLAY
63 
init_mds_listener(void * output)64 void init_mds_listener(void* output) {
65     psb_android_output_p aoutput = (psb_android_output_p)output;
66     if (aoutput == NULL) {
67         ALOGE("Invalid input parameter");
68         return;
69     }
70     if (aoutput->mds == NULL)
71         aoutput->mds = new psbMultiDisplayListener();
72 }
73 
deinit_mds_listener(void * output)74 void deinit_mds_listener(void* output) {
75     psb_android_output_p aoutput = (psb_android_output_p)output;
76     if (aoutput == NULL) {
77         ALOGE("Invalid input parameter");
78         return;
79     }
80     if (aoutput->mds != NULL) {
81         delete (psbMultiDisplayListener*)(aoutput->mds);
82         aoutput->mds = NULL;
83     }
84 }
85 
psb_android_get_mds_mode(void * output)86 int psb_android_get_mds_mode(void* output) {
87     if (output == NULL)
88         return MDS_INIT_VALUE;
89     psb_android_output_p aoutput = (psb_android_output_p)output;
90     if (aoutput->mds == NULL)
91         init_mds_listener(aoutput);
92     psbMultiDisplayListener* mds =
93         static_cast<psbMultiDisplayListener*>(aoutput->mds);
94     if (mds == NULL)
95         return MDS_INIT_VALUE;
96     return mds->getMode();
97 }
98 
psb_android_get_mds_decoder_output_resolution(void * output,int * width,int * height,int * offX,int * offY,int * bufW,int * bufH)99 int psb_android_get_mds_decoder_output_resolution(void* output,
100         int* width, int* height,
101         int* offX, int* offY,
102         int* bufW, int* bufH) {
103     if (output == NULL ||
104             width == NULL || height == NULL ||
105             offX  == NULL || offY == NULL ||
106             bufW  == NULL || bufH == NULL)
107         return 0;
108     psb_android_output_p aoutput = (psb_android_output_p)output;
109     if (aoutput->mds == NULL)
110         init_mds_listener(aoutput);
111     psbMultiDisplayListener* mds =
112         static_cast<psbMultiDisplayListener*>(aoutput->mds);
113     if (mds == NULL)
114         return 0;
115     bool ret = mds->getDecoderOutputResolution(width, height, offX, offY, bufW, bufH);
116     return (ret ? 1 : 0);
117 }
118 
psb_android_get_mds_vpp_state(void * output)119 int psb_android_get_mds_vpp_state(void* output) {
120     bool ret = false;
121     if (output == NULL) {
122         sp<IServiceManager> sm = defaultServiceManager();
123         if (sm == NULL)
124             return 0;
125         sp<IMDService> imds = interface_cast<IMDService>(
126                 sm->getService(String16(INTEL_MDS_SERVICE_NAME)));
127         if (imds == NULL)
128             return 0;
129         sp<IMultiDisplayInfoProvider> mds = imds->getInfoProvider();
130         if (mds != NULL) {
131             ret = mds->getVppState();
132         }
133         mds = NULL;
134         return (ret ? 1 : 0);
135     }
136     psb_android_output_p aoutput = (psb_android_output_p)output;
137     if (aoutput->mds == NULL)
138         init_mds_listener(aoutput);
139     psbMultiDisplayListener* mds =
140         static_cast<psbMultiDisplayListener*>(aoutput->mds);
141     ret = mds->getVppState();
142     if (mds == NULL)
143         return 0;
144     return (ret ? 1 : 0);
145 }
146 
147 #else //TARGET_HAS_MULTIPLE_DISPLAY
148 
149 #ifdef PSBVIDEO_MRFL_VPP
150 
psb_android_get_vpp_state()151 int psb_android_get_vpp_state() {
152 #ifdef PSBVIDEO_MRFL_VPP_SETTING
153     bool ret = VPPSetting::isVppOn();
154     return (ret ? 1 : 0);
155 #else
156     return 0;
157 #endif
158 }
159 
160 #endif
161 #endif
162 
163 unsigned int update_forced;
164 
psb_android_surfaceflinger_rotate(void * native_window,int * rotation)165 int psb_android_surfaceflinger_rotate(void* native_window, int *rotation)
166 {
167     sp<ANativeWindow> mNativeWindow = static_cast<ANativeWindow*>(native_window);
168     int err, transform_hint;
169 
170     if (mNativeWindow.get()) {
171         err = mNativeWindow->query(mNativeWindow.get(), NATIVE_WINDOW_TRANSFORM_HINT, &transform_hint);
172         if (err != 0) {
173             ALOGE("%s: NATIVE_WINDOW_TRANSFORM_HINT query failed", __func__);
174             return -1;
175         }
176         switch (transform_hint) {
177         case HAL_TRANSFORM_ROT_90:
178             *rotation = 1;
179             break;
180         case HAL_TRANSFORM_ROT_180:
181             *rotation = 2;
182             break;
183         case HAL_TRANSFORM_ROT_270:
184             *rotation = 3;
185             break;
186         default:
187             *rotation = 0;
188         }
189     }
190     return 0;
191 }
192