blob: 3fdb7c4661f99e7d247ec263dc530d034b443ae8 [file] [log] [blame]
Naseer Ahmed29a26812012-06-14 00:56:20 -07001/*
2* Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved.
3*
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 Code Aurora Forum, Inc. 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#include "overlayUtils.h"
31#include "overlayImpl.h"
32#include "overlay.h"
33
Naseer Ahmed29a26812012-06-14 00:56:20 -070034#include "overlayMdp.h"
35#include "overlayCtrlData.h"
Naseer Ahmed29a26812012-06-14 00:56:20 -070036
37namespace overlay {
38
Naseer Ahmed1ddf3662012-07-31 19:14:18 -070039//Helper
40bool isStateValid(const utils::eOverlayState& st) {
41 switch (st) {
42 case utils::OV_CLOSED:
43 ALOGE("Overlay %s failed, state is OV_CLOSED; set state first",
44 __FUNCTION__);
45 return false;
46 break;
47 case utils::OV_2D_VIDEO_ON_PANEL:
48 case utils::OV_2D_VIDEO_ON_PANEL_TV:
49 case utils::OV_2D_VIDEO_ON_TV:
50 case utils::OV_3D_VIDEO_ON_2D_PANEL:
51 case utils::OV_3D_VIDEO_ON_3D_PANEL:
52 case utils::OV_3D_VIDEO_ON_3D_TV:
53 case utils::OV_3D_VIDEO_ON_2D_PANEL_2D_TV:
54 case utils::OV_UI_MIRROR:
55 case utils::OV_2D_TRUE_UI_MIRROR:
56 case utils::OV_BYPASS_1_LAYER:
57 case utils::OV_BYPASS_2_LAYER:
58 case utils::OV_BYPASS_3_LAYER:
59 case utils::OV_DUAL_DISP:
60 break;
61 default:
62 OVASSERT(false, "%s Unknown state %d", __FUNCTION__, st);
63 return false;
64 }
65 return true;
66}
67
Naseer Ahmed29a26812012-06-14 00:56:20 -070068Overlay::Overlay(): mOv(0) {
69}
70
71Overlay::~Overlay() {
Naseer Ahmedf48aef62012-07-20 09:05:53 -070072 mOv = mState.handleEvent(utils::OV_CLOSED, mOv);
Naseer Ahmed29a26812012-06-14 00:56:20 -070073 delete mOv;
74 mOv = 0;
75}
76
Naseer Ahmed29a26812012-06-14 00:56:20 -070077bool Overlay::commit(utils::eDest dest)
78{
79 OVASSERT(mOv,
80 "%s Overlay and Rotator should be init at this point",
81 __FUNCTION__);
Naseer Ahmed29a26812012-06-14 00:56:20 -070082 utils::eOverlayState st = mState.state();
Naseer Ahmed1ddf3662012-07-31 19:14:18 -070083 if(isStateValid(st)) {
84 if(!mOv->commit(dest)) {
85 ALOGE("Overlay %s failed", __FUNCTION__);
Naseer Ahmed29a26812012-06-14 00:56:20 -070086 return false;
Naseer Ahmed1ddf3662012-07-31 19:14:18 -070087 }
Naseer Ahmed29a26812012-06-14 00:56:20 -070088 }
89 return true;
90}
91
Naseer Ahmedf48aef62012-07-20 09:05:53 -070092bool Overlay::queueBuffer(int fd, uint32_t offset,
Naseer Ahmed29a26812012-06-14 00:56:20 -070093 utils::eDest dest)
94{
95 OVASSERT(mOv,
96 "%s Overlay and Rotator should be init at this point",
97 __FUNCTION__);
Naseer Ahmed29a26812012-06-14 00:56:20 -070098 utils::eOverlayState st = mState.state();
Naseer Ahmed1ddf3662012-07-31 19:14:18 -070099 if(isStateValid(st)) {
100 if(!mOv->queueBuffer(fd, offset, dest)) {
101 ALOGE("Overlay %s failed", __FUNCTION__);
Naseer Ahmed29a26812012-06-14 00:56:20 -0700102 return false;
Naseer Ahmed1ddf3662012-07-31 19:14:18 -0700103 }
Naseer Ahmed29a26812012-06-14 00:56:20 -0700104 }
105 return true;
106}
107
108bool Overlay::setCrop(const utils::Dim& d,
109 utils::eDest dest)
110{
111 OVASSERT(mOv,
112 "%s Overlay and Rotator should be init at this point",
113 __FUNCTION__);
Naseer Ahmed29a26812012-06-14 00:56:20 -0700114 utils::eOverlayState st = mState.state();
Naseer Ahmed1ddf3662012-07-31 19:14:18 -0700115 if(isStateValid(st)) {
116 if(!mOv->setCrop(d, dest)) {
117 ALOGE("Overlay %s failed", __FUNCTION__);
Naseer Ahmed29a26812012-06-14 00:56:20 -0700118 return false;
Naseer Ahmed1ddf3662012-07-31 19:14:18 -0700119 }
Naseer Ahmed29a26812012-06-14 00:56:20 -0700120 }
121 return true;
122}
123bool Overlay::setPosition(const utils::Dim& d,
124 utils::eDest dest)
125{
126 OVASSERT(mOv,
127 "%s Overlay and Rotator should be init at this point",
128 __FUNCTION__);
Naseer Ahmed29a26812012-06-14 00:56:20 -0700129 utils::eOverlayState st = mState.state();
Naseer Ahmed1ddf3662012-07-31 19:14:18 -0700130 if(isStateValid(st)) {
131 if(!mOv->setPosition(d, dest)) {
132 ALOGE("Overlay %s failed", __FUNCTION__);
Naseer Ahmed29a26812012-06-14 00:56:20 -0700133 return false;
Naseer Ahmed1ddf3662012-07-31 19:14:18 -0700134 }
Naseer Ahmed29a26812012-06-14 00:56:20 -0700135 }
136 return true;
137}
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700138
139bool Overlay::setTransform(const int orient,
Naseer Ahmed29a26812012-06-14 00:56:20 -0700140 utils::eDest dest)
141{
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700142 utils::eTransform transform =
143 static_cast<utils::eTransform>(orient);
144
Naseer Ahmed29a26812012-06-14 00:56:20 -0700145 utils::eOverlayState st = mState.state();
Naseer Ahmed1ddf3662012-07-31 19:14:18 -0700146 if(isStateValid(st)) {
147 if(!mOv->setTransform(transform, dest)) {
148 ALOGE("Overlay %s failed", __FUNCTION__);
Naseer Ahmed29a26812012-06-14 00:56:20 -0700149 return false;
Naseer Ahmed1ddf3662012-07-31 19:14:18 -0700150 }
Naseer Ahmed29a26812012-06-14 00:56:20 -0700151 }
152 return true;
153}
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700154
Naseer Ahmed29a26812012-06-14 00:56:20 -0700155bool Overlay::setSource(const utils::PipeArgs args[utils::MAX_PIPES],
156 utils::eDest dest)
157{
Naseer Ahmed29a26812012-06-14 00:56:20 -0700158 utils::PipeArgs margs[utils::MAX_PIPES] = {
159 args[0], args[1], args[2] };
160 utils::eOverlayState st = mState.state();
161
Naseer Ahmed1ddf3662012-07-31 19:14:18 -0700162 if(isStateValid(st)) {
163 if (!mOv->setSource(margs, dest)) {
164 ALOGE("Overlay %s failed", __FUNCTION__);
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700165 return false;
Naseer Ahmed1ddf3662012-07-31 19:14:18 -0700166 }
Naseer Ahmed29a26812012-06-14 00:56:20 -0700167 }
Naseer Ahmed29a26812012-06-14 00:56:20 -0700168 return true;
169}
Naseer Ahmed29a26812012-06-14 00:56:20 -0700170
171void Overlay::dump() const
172{
173 OVASSERT(mOv,
174 "%s Overlay and Rotator should be init at this point",
175 __FUNCTION__);
Naseer Ahmed29a26812012-06-14 00:56:20 -0700176 ALOGE("== Dump Overlay start ==");
177 mState.dump();
178 mOv->dump();
179 ALOGE("== Dump Overlay end ==");
180}
181
182void Overlay::setState(utils::eOverlayState s) {
183 mOv = mState.handleEvent(s, mOv);
184}
185
186utils::eOverlayState Overlay::getState() const {
187 return mState.state();
188}
189
190Overlay *Overlay::sInstance = 0;
191
192Overlay* Overlay::getInstance() {
193 if(sInstance == NULL)
194 sInstance = new Overlay();
195 return sInstance;
196}
197
Naseer Ahmed29a26812012-06-14 00:56:20 -0700198} // overlay