overlay.cpp revision cb3da0a5e4313f55bd27514006c3ce64293ff8a2
129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed/* 229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved. 329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* 429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* Redistribution and use in source and binary forms, with or without 529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* modification, are permitted provided that the following conditions are 629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* met: 729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* * Redistributions of source code must retain the above copyright 829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* notice, this list of conditions and the following disclaimer. 929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* * Redistributions in binary form must reproduce the above 1029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* copyright notice, this list of conditions and the following 1129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* disclaimer in the documentation and/or other materials provided 1229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* with the distribution. 1329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* * Neither the name of Code Aurora Forum, Inc. nor the names of its 1429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* contributors may be used to endorse or promote products derived 1529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* from this software without specific prior written permission. 1629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* 1729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 1829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 2029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 2129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 2429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 2629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 2729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed*/ 2929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 3029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include "overlayUtils.h" 3129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include "overlayImpl.h" 3229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include "overlay.h" 3329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 3429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include "overlayMdp.h" 3529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include "overlayCtrlData.h" 3629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 3729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmednamespace overlay { 3829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 391ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed//Helper 401ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmedbool isStateValid(const utils::eOverlayState& st) { 4129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed switch (st) { 421ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed case utils::OV_CLOSED: 431ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed ALOGE("Overlay %s failed, state is OV_CLOSED; set state first", 441ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed __FUNCTION__); 451ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed return false; 461ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed break; 4729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed case utils::OV_2D_VIDEO_ON_PANEL: 4829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed case utils::OV_2D_VIDEO_ON_PANEL_TV: 492cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed case utils::OV_2D_VIDEO_ON_TV: 5029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed case utils::OV_3D_VIDEO_ON_2D_PANEL: 5129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed case utils::OV_3D_VIDEO_ON_3D_PANEL: 5229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed case utils::OV_3D_VIDEO_ON_3D_TV: 5329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed case utils::OV_3D_VIDEO_ON_2D_PANEL_2D_TV: 5429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed case utils::OV_UI_MIRROR: 5529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed case utils::OV_2D_TRUE_UI_MIRROR: 5629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed case utils::OV_BYPASS_1_LAYER: 5729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed case utils::OV_BYPASS_2_LAYER: 5829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed case utils::OV_BYPASS_3_LAYER: 592cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed case utils::OV_DUAL_DISP: 6029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed break; 6129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed default: 6229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed OVASSERT(false, "%s Unknown state %d", __FUNCTION__, st); 6329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return false; 6429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 6529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return true; 6629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 6729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 681ddf366c267e01dbb7ac736d9c40272d5541b724Naseer AhmedOverlay::Overlay(): mOv(0) { 691ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed} 701ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed 711ddf366c267e01dbb7ac736d9c40272d5541b724Naseer AhmedOverlay::~Overlay() { 721ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed mOv = mState.handleEvent(utils::OV_CLOSED, mOv); 731ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed delete mOv; 741ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed mOv = 0; 751ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed} 761ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed 771ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmedbool Overlay::commit(utils::eDest dest) 7829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{ 7929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed OVASSERT(mOv, 8029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed "%s Overlay and Rotator should be init at this point", 8129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed __FUNCTION__); 8229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed utils::eOverlayState st = mState.state(); 831ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed if(isStateValid(st)) { 841ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed if(!mOv->commit(dest)) { 851ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed ALOGE("Overlay %s failed", __FUNCTION__); 8629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return false; 871ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed } 8829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 8929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return true; 9029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 9129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 921ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmedbool Overlay::queueBuffer(int fd, uint32_t offset, 931ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed utils::eDest dest) 9429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{ 9529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed OVASSERT(mOv, 9629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed "%s Overlay and Rotator should be init at this point", 9729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed __FUNCTION__); 9829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed utils::eOverlayState st = mState.state(); 991ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed if(isStateValid(st)) { 1001ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed if(!mOv->queueBuffer(fd, offset, dest)) { 1011ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed ALOGE("Overlay %s failed", __FUNCTION__); 10229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return false; 1031ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed } 10429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 10529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return true; 10629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 10729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 10829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedbool Overlay::setCrop(const utils::Dim& d, 10929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed utils::eDest dest) 11029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{ 11129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed OVASSERT(mOv, 11229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed "%s Overlay and Rotator should be init at this point", 11329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed __FUNCTION__); 11429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed utils::eOverlayState st = mState.state(); 1151ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed if(isStateValid(st)) { 1161ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed if(!mOv->setCrop(d, dest)) { 1171ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed ALOGE("Overlay %s failed", __FUNCTION__); 11829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return false; 1191ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed } 12029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 12129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return true; 12229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 12329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedbool Overlay::setPosition(const utils::Dim& d, 12429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed utils::eDest dest) 12529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{ 12629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed OVASSERT(mOv, 12729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed "%s Overlay and Rotator should be init at this point", 12829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed __FUNCTION__); 12929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed utils::eOverlayState st = mState.state(); 1301ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed if(isStateValid(st)) { 1311ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed if(!mOv->setPosition(d, dest)) { 1321ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed ALOGE("Overlay %s failed", __FUNCTION__); 13329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return false; 1341ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed } 13529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 13629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return true; 13729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 138f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 139f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmedbool Overlay::setTransform(const int orient, 14029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed utils::eDest dest) 14129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{ 142f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed utils::eTransform transform = 143f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed static_cast<utils::eTransform>(orient); 144f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 14529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed utils::eOverlayState st = mState.state(); 1461ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed if(isStateValid(st)) { 1471ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed if(!mOv->setTransform(transform, dest)) { 1481ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed ALOGE("Overlay %s failed", __FUNCTION__); 14929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return false; 1501ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed } 15129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 15229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return true; 15329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 154f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 15529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedbool Overlay::setSource(const utils::PipeArgs args[utils::MAX_PIPES], 15629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed utils::eDest dest) 15729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{ 15829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed utils::PipeArgs margs[utils::MAX_PIPES] = { 15929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed args[0], args[1], args[2] }; 16029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed utils::eOverlayState st = mState.state(); 16129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 1621ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed if(isStateValid(st)) { 1631ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed if (!mOv->setSource(margs, dest)) { 1641ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed ALOGE("Overlay %s failed", __FUNCTION__); 165f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed return false; 1661ddf366c267e01dbb7ac736d9c40272d5541b724Naseer Ahmed } 16729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 16829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return true; 16929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 17029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 17129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedvoid Overlay::dump() const 17229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{ 17329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed OVASSERT(mOv, 17429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed "%s Overlay and Rotator should be init at this point", 17529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed __FUNCTION__); 17629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed ALOGE("== Dump Overlay start =="); 17729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed mState.dump(); 17829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed mOv->dump(); 17929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed ALOGE("== Dump Overlay end =="); 18029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 18129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 18229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedvoid Overlay::setState(utils::eOverlayState s) { 18329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed mOv = mState.handleEvent(s, mOv); 18429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 18529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 18629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedutils::eOverlayState Overlay::getState() const { 18729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return mState.state(); 18829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 18929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 19029a26818d7294055539167b2fbfdaa168bcf725cNaseer AhmedOverlay *Overlay::sInstance = 0; 19129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 19229a26818d7294055539167b2fbfdaa168bcf725cNaseer AhmedOverlay* Overlay::getInstance() { 193cb3da0a5e4313f55bd27514006c3ce64293ff8a2Ajay Dudani if(sInstance == NULL) { 194cb3da0a5e4313f55bd27514006c3ce64293ff8a2Ajay Dudani if(utils::initOverlay() == -1) { 195cb3da0a5e4313f55bd27514006c3ce64293ff8a2Ajay Dudani ALOGE("utils::initOverlay() ERROR!!"); 196cb3da0a5e4313f55bd27514006c3ce64293ff8a2Ajay Dudani } 19729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed sInstance = new Overlay(); 198cb3da0a5e4313f55bd27514006c3ce64293ff8a2Ajay Dudani } 19929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return sInstance; 20029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 20129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 20229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} // overlay 203