blob: 170b8a940492a91a1889e3f6de984f710c47dd47 [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:
Saurabh Shahc4d034f2012-09-27 15:55:15 -070056 case utils::OV_UI_VIDEO_TV:
Naseer Ahmed1ddf3662012-07-31 19:14:18 -070057 case utils::OV_BYPASS_1_LAYER:
58 case utils::OV_BYPASS_2_LAYER:
59 case utils::OV_BYPASS_3_LAYER:
60 case utils::OV_DUAL_DISP:
61 break;
62 default:
63 OVASSERT(false, "%s Unknown state %d", __FUNCTION__, st);
64 return false;
65 }
66 return true;
67}
68
Naseer Ahmed29a26812012-06-14 00:56:20 -070069Overlay::Overlay(): mOv(0) {
70}
71
72Overlay::~Overlay() {
Naseer Ahmedf48aef62012-07-20 09:05:53 -070073 mOv = mState.handleEvent(utils::OV_CLOSED, mOv);
Naseer Ahmed29a26812012-06-14 00:56:20 -070074 delete mOv;
75 mOv = 0;
76}
77
Naseer Ahmed29a26812012-06-14 00:56:20 -070078bool Overlay::commit(utils::eDest dest)
79{
80 OVASSERT(mOv,
81 "%s Overlay and Rotator should be init at this point",
82 __FUNCTION__);
Naseer Ahmed29a26812012-06-14 00:56:20 -070083 utils::eOverlayState st = mState.state();
Naseer Ahmed1ddf3662012-07-31 19:14:18 -070084 if(isStateValid(st)) {
85 if(!mOv->commit(dest)) {
86 ALOGE("Overlay %s failed", __FUNCTION__);
Naseer Ahmed29a26812012-06-14 00:56:20 -070087 return false;
Naseer Ahmed1ddf3662012-07-31 19:14:18 -070088 }
Naseer Ahmed29a26812012-06-14 00:56:20 -070089 }
90 return true;
91}
92
Naseer Ahmedf48aef62012-07-20 09:05:53 -070093bool Overlay::queueBuffer(int fd, uint32_t offset,
Naseer Ahmed29a26812012-06-14 00:56:20 -070094 utils::eDest dest)
95{
96 OVASSERT(mOv,
97 "%s Overlay and Rotator should be init at this point",
98 __FUNCTION__);
Naseer Ahmed29a26812012-06-14 00:56:20 -070099 utils::eOverlayState st = mState.state();
Naseer Ahmed1ddf3662012-07-31 19:14:18 -0700100 if(isStateValid(st)) {
101 if(!mOv->queueBuffer(fd, offset, dest)) {
102 ALOGE("Overlay %s failed", __FUNCTION__);
Naseer Ahmed29a26812012-06-14 00:56:20 -0700103 return false;
Naseer Ahmed1ddf3662012-07-31 19:14:18 -0700104 }
Naseer Ahmed29a26812012-06-14 00:56:20 -0700105 }
106 return true;
107}
108
109bool Overlay::setCrop(const utils::Dim& d,
110 utils::eDest dest)
111{
112 OVASSERT(mOv,
113 "%s Overlay and Rotator should be init at this point",
114 __FUNCTION__);
Naseer Ahmed29a26812012-06-14 00:56:20 -0700115 utils::eOverlayState st = mState.state();
Naseer Ahmed1ddf3662012-07-31 19:14:18 -0700116 if(isStateValid(st)) {
117 if(!mOv->setCrop(d, dest)) {
118 ALOGE("Overlay %s failed", __FUNCTION__);
Naseer Ahmed29a26812012-06-14 00:56:20 -0700119 return false;
Naseer Ahmed1ddf3662012-07-31 19:14:18 -0700120 }
Naseer Ahmed29a26812012-06-14 00:56:20 -0700121 }
122 return true;
123}
124bool Overlay::setPosition(const utils::Dim& d,
125 utils::eDest dest)
126{
127 OVASSERT(mOv,
128 "%s Overlay and Rotator should be init at this point",
129 __FUNCTION__);
Naseer Ahmed29a26812012-06-14 00:56:20 -0700130 utils::eOverlayState st = mState.state();
Naseer Ahmed1ddf3662012-07-31 19:14:18 -0700131 if(isStateValid(st)) {
132 if(!mOv->setPosition(d, dest)) {
133 ALOGE("Overlay %s failed", __FUNCTION__);
Naseer Ahmed29a26812012-06-14 00:56:20 -0700134 return false;
Naseer Ahmed1ddf3662012-07-31 19:14:18 -0700135 }
Naseer Ahmed29a26812012-06-14 00:56:20 -0700136 }
137 return true;
138}
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700139
140bool Overlay::setTransform(const int orient,
Naseer Ahmed29a26812012-06-14 00:56:20 -0700141 utils::eDest dest)
142{
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700143 utils::eTransform transform =
144 static_cast<utils::eTransform>(orient);
145
Naseer Ahmed29a26812012-06-14 00:56:20 -0700146 utils::eOverlayState st = mState.state();
Naseer Ahmed1ddf3662012-07-31 19:14:18 -0700147 if(isStateValid(st)) {
148 if(!mOv->setTransform(transform, dest)) {
149 ALOGE("Overlay %s failed", __FUNCTION__);
Naseer Ahmed29a26812012-06-14 00:56:20 -0700150 return false;
Naseer Ahmed1ddf3662012-07-31 19:14:18 -0700151 }
Naseer Ahmed29a26812012-06-14 00:56:20 -0700152 }
153 return true;
154}
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700155
Naseer Ahmed29a26812012-06-14 00:56:20 -0700156bool Overlay::setSource(const utils::PipeArgs args[utils::MAX_PIPES],
157 utils::eDest dest)
158{
Naseer Ahmed29a26812012-06-14 00:56:20 -0700159 utils::PipeArgs margs[utils::MAX_PIPES] = {
160 args[0], args[1], args[2] };
161 utils::eOverlayState st = mState.state();
162
Naseer Ahmed1ddf3662012-07-31 19:14:18 -0700163 if(isStateValid(st)) {
164 if (!mOv->setSource(margs, dest)) {
165 ALOGE("Overlay %s failed", __FUNCTION__);
Naseer Ahmedf48aef62012-07-20 09:05:53 -0700166 return false;
Naseer Ahmed1ddf3662012-07-31 19:14:18 -0700167 }
Naseer Ahmed29a26812012-06-14 00:56:20 -0700168 }
Naseer Ahmed29a26812012-06-14 00:56:20 -0700169 return true;
170}
Naseer Ahmed29a26812012-06-14 00:56:20 -0700171
172void Overlay::dump() const
173{
174 OVASSERT(mOv,
175 "%s Overlay and Rotator should be init at this point",
176 __FUNCTION__);
Naseer Ahmed29a26812012-06-14 00:56:20 -0700177 ALOGE("== Dump Overlay start ==");
178 mState.dump();
179 mOv->dump();
180 ALOGE("== Dump Overlay end ==");
181}
182
183void Overlay::setState(utils::eOverlayState s) {
184 mOv = mState.handleEvent(s, mOv);
185}
186
187utils::eOverlayState Overlay::getState() const {
188 return mState.state();
189}
190
Saurabh Shahc4d034f2012-09-27 15:55:15 -0700191Overlay *Overlay::sInstance[] = {0};
Naseer Ahmed29a26812012-06-14 00:56:20 -0700192
Saurabh Shahc4d034f2012-09-27 15:55:15 -0700193Overlay* Overlay::getInstance(int disp) {
194 if(sInstance[disp] == NULL) {
195 sInstance[disp] = new Overlay();
Ajay Dudanicb3da0a2012-09-07 13:37:49 -0700196 }
Saurabh Shahc4d034f2012-09-27 15:55:15 -0700197 return sInstance[disp];
198}
199
200void Overlay::initOverlay() {
201 if(utils::initOverlay() == -1) {
202 ALOGE("utils::initOverlay() ERROR!!");
203 }
Naseer Ahmed29a26812012-06-14 00:56:20 -0700204}
205
Naseer Ahmed29a26812012-06-14 00:56:20 -0700206} // overlay