overlayRotator.cpp revision f48aef64b218d42bd2ede62dcb03a3d7831ebbf9
129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed/*
229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* Copyright (C) 2008 The Android Open Source Project
329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* Copyright (c) 2010-2012, Code Aurora Forum. All rights reserved.
429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed*
529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* Licensed under the Apache License, Version 2.0 (the "License");
629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* you may not use this file except in compliance with the License.
729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* You may obtain a copy of the License at
829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed*
929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed*      http://www.apache.org/licenses/LICENSE-2.0
1029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed*
1129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* Unless required by applicable law or agreed to in writing, software
1229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* distributed under the License is distributed on an "AS IS" BASIS,
1329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* See the License for the specific language governing permissions and
1529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* limitations under the License.
1629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed*/
1729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
1829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include "overlayRotator.h"
1929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include "overlayUtils.h"
2029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
2129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmednamespace ovutils = overlay::utils;
2229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
2329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmednamespace overlay {
2429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
25f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmedint IRotatorHw::getRotatorHwType() {
26f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    //TODO figure out based on ioctl
27f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    return TYPE_MDP;
28f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed}
2929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
30f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmedbool RotMem::close() {
31f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    bool ret = true;
32f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    for(uint32_t i=0; i < RotMem::MAX_ROT_MEM; ++i) {
33f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        // skip current, and if valid, close
34f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        if(m[i].valid()) {
35f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed            if(m[i].close() == false) {
36f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed                ALOGE("%s error in closing rot mem %d", __FUNCTION__, i);
37f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed                ret = false;
38f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed            }
39f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        }
40f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    }
41f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    return ret;
4229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
4329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
44f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmedbool MdpRot::init()
4529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{
46f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    if(!mFd.open(Res::rotPath, O_RDWR)){
47f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        ALOGE("MdpRot failed to init %s", Res::rotPath);
48f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        return false;
49f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    }
50f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    return true;
51f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed}
52f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
53f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmedvoid MdpRot::setSource(const overlay::utils::Whf& awhf) {
54f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    utils::Whf whf(awhf);
55f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
56f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    mRotImgInfo.src.format = whf.format;
57f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    if(whf.format == MDP_Y_CRCB_H2V2_TILE ||
58f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        whf.format == MDP_Y_CBCR_H2V2_TILE) {
59f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        whf.w =  utils::alignup(awhf.w, 64);
60f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        whf.h = utils::alignup(awhf.h, 32);
6129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
6229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
63f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    mRotImgInfo.src.width = whf.w;
64f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    mRotImgInfo.src.height = whf.h;
65f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
66f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    mRotImgInfo.src_rect.w = whf.w;
67f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    mRotImgInfo.src_rect.h = whf.h;
68f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
69f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    mRotImgInfo.dst.width = whf.w;
70f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    mRotImgInfo.dst.height = whf.h;
71f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
72f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    mBufSize = awhf.size;
7329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
7429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
75f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmedvoid MdpRot::setFlags(const utils::eMdpFlags& flags) {
76f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    mRotImgInfo.secure = 0;
77f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    if(flags & utils::OV_MDP_SECURE_OVERLAY_SESSION)
78f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        mRotImgInfo.secure = 1;
79f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed}
8029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
81f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmedvoid MdpRot::setTransform(const utils::eTransform& rot, const bool& rotUsed)
8229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{
83f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    mOrientation = rot;
84f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    int r = utils::getMdpOrient(rot);
85f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    ALOGE_IF(DEBUG_OVERLAY, "%s: r=%d", __FUNCTION__, r);
86f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    setRotations(r);
87f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    setDisable();
88f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    if(rotUsed) {
89f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        setEnable();
90f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    }
91f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed}
92f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
93f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmedvoid MdpRot::doTransform() {
94f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    switch(mOrientation) {
95f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        case utils::OVERLAY_TRANSFORM_ROT_90:
96f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        case utils::OVERLAY_TRANSFORM_ROT_90_FLIP_H:
97f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        case utils::OVERLAY_TRANSFORM_ROT_90_FLIP_V:
98f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        case utils::OVERLAY_TRANSFORM_ROT_270:
99f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed            utils::swap(mRotImgInfo.dst.width, mRotImgInfo.dst.height);
100f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed            break;
101f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        default:
102f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed            break;
103f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    }
104f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed}
105f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
106f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmedbool MdpRot::commit() {
107f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    doTransform();
108f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    if(!overlay::mdp_wrapper::startRotator(mFd.getFD(), mRotImgInfo)) {
109f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        ALOGE("MdpRot commit failed");
110f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        dump();
11129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        return false;
11229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
113f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    mRotDataInfo.session_id = mRotImgInfo.session_id;
11429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return true;
11529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
11629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
11729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedbool MdpRot::open_i(uint32_t numbufs, uint32_t bufsz)
11829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{
11929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    OvMem mem;
12029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
12129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    OVASSERT(MAP_FAILED == mem.addr(), "MAP failed in open_i");
12229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
123f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    if(!mem.open(numbufs, bufsz, mRotImgInfo.secure)){
12429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        ALOGE("%s: Failed to open", __func__);
12529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        mem.close();
12629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        return false;
12729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
12829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
12929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    OVASSERT(MAP_FAILED != mem.addr(), "MAP failed");
13029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    OVASSERT(mem.getFD() != -1, "getFd is -1");
13129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
13229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    mRotDataInfo.dst.memory_id = mem.getFD();
13329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    mRotDataInfo.dst.offset = 0;
13429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    mMem.curr().m = mem;
13529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return true;
13629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
13729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
13829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedbool MdpRot::close() {
13929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    bool success = true;
14029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    if(mFd.valid() && (getSessId() > 0)) {
14129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        if(!mdp_wrapper::endRotator(mFd.getFD(), getSessId())) {
14229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            ALOGE("Mdp Rot error endRotator, fd=%d sessId=%d",
14329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed                    mFd.getFD(), getSessId());
14429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            success = false;
14529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        }
14629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
14729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    if (!mFd.close()) {
14829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        ALOGE("Mdp Rot error closing fd");
14929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        success = false;
15029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
15129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    if (!mMem.close()) {
15229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        ALOGE("Mdp Rot error closing mem");
15329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        success = false;
15429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
15529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    reset();
15629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return success;
15729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
15829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
159f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmedbool MdpRot::remap(uint32_t numbufs) {
16029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    // if current size changed, remap
161f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    if(mBufSize == mMem.curr().size()) {
162f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        ALOGE_IF(DEBUG_OVERLAY, "%s: same size %d", __FUNCTION__, mBufSize);
16329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        return true;
16429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
16529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
16629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    ALOGE_IF(DEBUG_OVERLAY, "%s: size changed - remapping", __FUNCTION__);
16729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    OVASSERT(!mMem.prev().valid(), "Prev should not be valid");
16829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
16929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    // ++mMem will make curr to be prev, and prev will be curr
17029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    ++mMem;
171f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    if(!open_i(numbufs, mBufSize)) {
17229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        ALOGE("%s Error could not open", __FUNCTION__);
17329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        return false;
17429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
17529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    for (uint32_t i = 0; i < numbufs; ++i) {
176f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        mMem.curr().mRotOffset[i] = i * mBufSize;
17729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
17829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return true;
17929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
18029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
18129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedvoid MdpRot::reset() {
18229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    ovutils::memset0(mRotImgInfo);
18329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    ovutils::memset0(mRotDataInfo);
18429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    ovutils::memset0(mMem.curr().mRotOffset);
18529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    ovutils::memset0(mMem.prev().mRotOffset);
18629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    mMem.curr().mCurrOffset = 0;
18729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    mMem.prev().mCurrOffset = 0;
188f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    mBufSize = 0;
189f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    mOrientation = utils::OVERLAY_TRANSFORM_0;
19029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
19129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
192f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmedbool MdpRot::queueBuffer(int fd, uint32_t offset) {
19329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    if(enabled()) {
194f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        mRotDataInfo.src.memory_id = fd;
19529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        mRotDataInfo.src.offset = offset;
196f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
197f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        remap(RotMem::Mem::ROT_NUM_BUFS);
198f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        OVASSERT(mMem.curr().m.numBufs(),
199f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed                "queueBuffer numbufs is 0");
20029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        mRotDataInfo.dst.offset =
20129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed                mMem.curr().mRotOffset[mMem.curr().mCurrOffset];
20229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        mMem.curr().mCurrOffset =
20329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed                (mMem.curr().mCurrOffset + 1) % mMem.curr().m.numBufs();
204f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
20529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        if(!overlay::mdp_wrapper::rotate(mFd.getFD(), mRotDataInfo)) {
20629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            ALOGE("MdpRot failed rotate");
207f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed            dump();
20829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            return false;
20929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        }
21029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
211f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        // if the prev mem is valid, we need to close
212f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        if(mMem.prev().valid()) {
213f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed            // FIXME if no wait for vsync the above
214f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed            // play will return immediatly and might cause
215f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed            // tearing when prev.close is called.
216f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed            if(!mMem.prev().close()) {
217f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed                ALOGE("%s error in closing prev rot mem", __FUNCTION__);
218f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed                return false;
219f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed            }
22029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        }
22129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
22229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return true;
22329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
22429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
22529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedvoid MdpRot::dump() const {
22629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    ALOGE("== Dump MdpRot start ==");
22729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    mFd.dump();
22829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    mMem.curr().m.dump();
22929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    mdp_wrapper::dump("mRotImgInfo", mRotImgInfo);
23029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    mdp_wrapper::dump("mRotDataInfo", mRotDataInfo);
23129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    ALOGE("== Dump MdpRot end ==");
23229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
23329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
234