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