1f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed/*
2f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed * Copyright (C) 2010 The Android Open Source Project
356f610dd235b577725198e9341caae92379fdf23Saurabh Shah * Copyright (C) 2012, The Linux Foundation. All rights reserved.
4f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed *
5f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License");
6f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed * you may not use this file except in compliance with the License.
7f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed * You may obtain a copy of the License at
8f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed *
9f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed *      http://www.apache.org/licenses/LICENSE-2.0
10f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed *
11f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed * Unless required by applicable law or agreed to in writing, software
12f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS,
13f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed * See the License for the specific language governing permissions and
15f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed * limitations under the License.
16f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed */
17f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
1872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed#define VIDEO_DEBUG 0
1972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed#include <overlay.h>
20f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed#include "hwc_video.h"
213e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah#include "hwc_utils.h"
22f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
23f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmednamespace qhwc {
24f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
25f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed#define FINAL_TRANSFORM_MASK 0x000F
26f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
27f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed//Static Members
28c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shahovutils::eOverlayState VideoOverlay::sState[] = {ovutils::OV_CLOSED};
29c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shahbool VideoOverlay::sIsModeOn[] = {false};
30f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
31f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed//Cache stats, figure out the state, config overlay
323e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahbool VideoOverlay::prepare(hwc_context_t *ctx, hwc_display_contents_1_t *list,
333e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        int dpy) {
34c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah
353e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    int yuvIndex =  ctx->listStats[dpy].yuvIndex;
36c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    sIsModeOn[dpy] = false;
373e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah
3896c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed    if(!ctx->mMDP.hasOverlay) {
3931da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed       ALOGD_IF(VIDEO_DEBUG,"%s, this hw doesnt support overlay", __FUNCTION__);
4031da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed       return false;
4131da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed    }
42c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah
43c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    if(yuvIndex == -1 || ctx->listStats[dpy].yuvCount != 1) {
442cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed        return false;
452cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    }
46f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
473e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    //index guaranteed to be not -1 at this point
483e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    hwc_layer_1_t *yuvLayer = &list->hwLayers[yuvIndex];
4968b88cf211873e6f2cef0111c500697cd690266eNaseer Ahmed
50cb5f25b58dd1b38a4790debb46b1d5f6024e7d3eNaseer Ahmed    private_handle_t *hnd = (private_handle_t *)yuvLayer->handle;
5168b88cf211873e6f2cef0111c500697cd690266eNaseer Ahmed    if(ctx->mSecureMode) {
5268b88cf211873e6f2cef0111c500697cd690266eNaseer Ahmed        if (! isSecureBuffer(hnd)) {
5368b88cf211873e6f2cef0111c500697cd690266eNaseer Ahmed            ALOGD_IF(VIDEO_DEBUG, "%s: Handle non-secure video layer"
5468b88cf211873e6f2cef0111c500697cd690266eNaseer Ahmed                     "during secure playback gracefully", __FUNCTION__);
5568b88cf211873e6f2cef0111c500697cd690266eNaseer Ahmed            return false;
5668b88cf211873e6f2cef0111c500697cd690266eNaseer Ahmed        }
57cb5f25b58dd1b38a4790debb46b1d5f6024e7d3eNaseer Ahmed    } else {
58cb5f25b58dd1b38a4790debb46b1d5f6024e7d3eNaseer Ahmed        if (isSecureBuffer(hnd)) {
59cb5f25b58dd1b38a4790debb46b1d5f6024e7d3eNaseer Ahmed            ALOGD_IF(VIDEO_DEBUG, "%s: Handle secure video layer"
60cb5f25b58dd1b38a4790debb46b1d5f6024e7d3eNaseer Ahmed                     "during non-secure playback gracefully", __FUNCTION__);
61cb5f25b58dd1b38a4790debb46b1d5f6024e7d3eNaseer Ahmed            return false;
62cb5f25b58dd1b38a4790debb46b1d5f6024e7d3eNaseer Ahmed        }
6368b88cf211873e6f2cef0111c500697cd690266eNaseer Ahmed    }
643e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    chooseState(ctx, dpy, yuvLayer);
653e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    if(configure(ctx, dpy, yuvLayer)) {
663e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        markFlags(yuvLayer);
67c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        sIsModeOn[dpy] = true;
683e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    }
69f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
70c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    return sIsModeOn[dpy];
71f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed}
72f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
733e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahvoid VideoOverlay::chooseState(hwc_context_t *ctx, int dpy,
743e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        hwc_layer_1_t *yuvLayer) {
75f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    ALOGD_IF(VIDEO_DEBUG, "%s: old state = %s", __FUNCTION__,
76c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah            ovutils::getStateString(sState[dpy]));
77f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
783e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    private_handle_t *hnd = NULL;
793e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    if(yuvLayer) {
803e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        hnd = (private_handle_t *)yuvLayer->handle;
813e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    }
82f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    ovutils::eOverlayState newState = ovutils::OV_CLOSED;
833e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    switch(dpy) {
843e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        case HWC_DISPLAY_PRIMARY:
853e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            if(ctx->listStats[dpy].yuvCount == 1) {
86c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah                newState = ovutils::OV_2D_VIDEO_ON_PANEL;
873e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                if(isSkipLayer(yuvLayer) && !isSecureBuffer(hnd)) {
88c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah                    newState = ovutils::OV_CLOSED;
893e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                }
903e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            }
913e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            break;
923e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        case HWC_DISPLAY_EXTERNAL:
93c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah            newState = ctx->mOverlay[HWC_DISPLAY_EXTERNAL]->getState(); //If we are here, external is active
94c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah            if(ctx->listStats[dpy].yuvCount == 1) {
953e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                if(!isSkipLayer(yuvLayer) || isSecureBuffer(hnd)) {
96c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah                    newState = ovutils::OV_UI_VIDEO_TV;
973e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                }
98c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah            }
993e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            break;
1003e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        default:
1013e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            break;
102f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    }
1033e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah
104c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    sState[dpy] = newState;
105f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    ALOGD_IF(VIDEO_DEBUG, "%s: new chosen state = %s", __FUNCTION__,
106c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah            ovutils::getStateString(sState[dpy]));
107f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed}
108f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
1093e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahvoid VideoOverlay::markFlags(hwc_layer_1_t *yuvLayer) {
1103e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    if(yuvLayer) {
1113e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        yuvLayer->compositionType = HWC_OVERLAY;
1123e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        yuvLayer->hints |= HWC_HINT_CLEAR_FB;
113f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    }
114f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed}
115f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
1162cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed/* Helpers */
1175b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedbool configPrimVid(hwc_context_t *ctx, hwc_layer_1_t *layer) {
118c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    overlay::Overlay& ov = *(ctx->mOverlay[HWC_DISPLAY_PRIMARY]);
1192cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    private_handle_t *hnd = (private_handle_t *)layer->handle;
1202cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ovutils::Whf info(hnd->width, hnd->height, hnd->format, hnd->size);
121f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
1222cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ovutils::eMdpFlags mdpFlags = ovutils::OV_MDP_FLAGS_NONE;
1233e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    if (isSecureBuffer(hnd)) {
1242cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed        ovutils::setMdpFlags(mdpFlags,
1252cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed                ovutils::OV_MDP_SECURE_OVERLAY_SESSION);
1262cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    }
127f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
12891a6a994e8d799ea2d4c4cbe6ff2e9be76105988Saurabh Shah    if(layer->blending == HWC_BLENDING_PREMULT) {
12991a6a994e8d799ea2d4c4cbe6ff2e9be76105988Saurabh Shah        ovutils::setMdpFlags(mdpFlags,
13091a6a994e8d799ea2d4c4cbe6ff2e9be76105988Saurabh Shah                ovutils::OV_MDP_BLEND_FG_PREMULT);
13191a6a994e8d799ea2d4c4cbe6ff2e9be76105988Saurabh Shah    }
13291a6a994e8d799ea2d4c4cbe6ff2e9be76105988Saurabh Shah
1332cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ovutils::eIsFg isFgFlag = ovutils::IS_FG_OFF;
134150806ae0ed82d1d26fa144a6950031570b06bfbSaurabh Shah    if (ctx->listStats[HWC_DISPLAY_PRIMARY].numAppLayers == 1) {
1352cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed        isFgFlag = ovutils::IS_FG_SET;
1362cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    }
137f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
1382cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ovutils::PipeArgs parg(mdpFlags,
1392cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            info,
1402cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            ovutils::ZORDER_0,
1412cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            isFgFlag,
1422cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            ovutils::ROT_FLAG_DISABLED);
1432cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ovutils::PipeArgs pargs[ovutils::MAX_PIPES] = { parg, parg, parg };
1442cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ov.setSource(pargs, ovutils::OV_PIPE0);
1452cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed
14627c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah    int transform = layer->transform & FINAL_TRANSFORM_MASK;
14727c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah    ovutils::eTransform orient =
14827c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah            static_cast<ovutils::eTransform>(transform);
14927c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah
1502cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    hwc_rect_t sourceCrop = layer->sourceCrop;
1512cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    hwc_rect_t displayFrame = layer->displayFrame;
1522cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed
1532cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    //Calculate the rect for primary based on whether the supplied position
1542cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    //is within or outside bounds.
155541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah    const int fbWidth = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres;
156541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah    const int fbHeight = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].yres;
157f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
1582cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    if( displayFrame.left < 0 ||
159f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed            displayFrame.top < 0 ||
160f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed            displayFrame.right > fbWidth ||
161f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed            displayFrame.bottom > fbHeight) {
16227c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah        calculate_crop_rects(sourceCrop, displayFrame, fbWidth, fbHeight,
16327c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah                transform);
1642cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    }
165f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
1661023ce2fdd0c7d82b70d075757503a9ff3eee2a6Saurabh Shah    // source crop x,y,w,h
1671023ce2fdd0c7d82b70d075757503a9ff3eee2a6Saurabh Shah    ovutils::Dim dcrop(sourceCrop.left, sourceCrop.top,
1681023ce2fdd0c7d82b70d075757503a9ff3eee2a6Saurabh Shah            sourceCrop.right - sourceCrop.left,
1691023ce2fdd0c7d82b70d075757503a9ff3eee2a6Saurabh Shah            sourceCrop.bottom - sourceCrop.top);
1702cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    //Only for Primary
1712cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ov.setCrop(dcrop, ovutils::OV_PIPE0);
172f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
1732cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ov.setTransform(orient, ovutils::OV_PIPE0);
174f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
1751023ce2fdd0c7d82b70d075757503a9ff3eee2a6Saurabh Shah    // position x,y,w,h
1761023ce2fdd0c7d82b70d075757503a9ff3eee2a6Saurabh Shah    ovutils::Dim dpos(displayFrame.left,
1771023ce2fdd0c7d82b70d075757503a9ff3eee2a6Saurabh Shah            displayFrame.top,
1781023ce2fdd0c7d82b70d075757503a9ff3eee2a6Saurabh Shah            displayFrame.right - displayFrame.left,
1791023ce2fdd0c7d82b70d075757503a9ff3eee2a6Saurabh Shah            displayFrame.bottom - displayFrame.top);
1802cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ov.setPosition(dpos, ovutils::OV_PIPE0);
181f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
1822cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    if (!ov.commit(ovutils::OV_PIPE0)) {
1832cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed        ALOGE("%s: commit fails", __FUNCTION__);
1842cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed        return false;
1852cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    }
1862cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    return true;
1872cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed}
188f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
1895b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedbool configExtVid(hwc_context_t *ctx, hwc_layer_1_t *layer) {
190c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    overlay::Overlay& ov = *(ctx->mOverlay[HWC_DISPLAY_EXTERNAL]);
1912cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    private_handle_t *hnd = (private_handle_t *)layer->handle;
1922cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ovutils::Whf info(hnd->width, hnd->height, hnd->format, hnd->size);
1932cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed
1942cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ovutils::eMdpFlags mdpFlags = ovutils::OV_MDP_FLAGS_NONE;
1953e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    if (isSecureBuffer(hnd)) {
1962cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed        ovutils::setMdpFlags(mdpFlags,
1972cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed                ovutils::OV_MDP_SECURE_OVERLAY_SESSION);
198f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    }
1992cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed
20091a6a994e8d799ea2d4c4cbe6ff2e9be76105988Saurabh Shah    if(layer->blending == HWC_BLENDING_PREMULT) {
20191a6a994e8d799ea2d4c4cbe6ff2e9be76105988Saurabh Shah        ovutils::setMdpFlags(mdpFlags,
20291a6a994e8d799ea2d4c4cbe6ff2e9be76105988Saurabh Shah                ovutils::OV_MDP_BLEND_FG_PREMULT);
20391a6a994e8d799ea2d4c4cbe6ff2e9be76105988Saurabh Shah    }
20491a6a994e8d799ea2d4c4cbe6ff2e9be76105988Saurabh Shah
2052cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ovutils::eIsFg isFgFlag = ovutils::IS_FG_OFF;
206150806ae0ed82d1d26fa144a6950031570b06bfbSaurabh Shah    if (ctx->listStats[HWC_DISPLAY_EXTERNAL].numAppLayers == 1) {
2072cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed        isFgFlag = ovutils::IS_FG_SET;
2082cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    }
2092cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed
2102cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ovutils::PipeArgs parg(mdpFlags,
2112cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            info,
212c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah            ovutils::ZORDER_1,
2132cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            isFgFlag,
214c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah            ovutils::ROT_FLAG_DISABLED);
2152cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ovutils::PipeArgs pargs[ovutils::MAX_PIPES] = { parg, parg, parg };
2162cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ov.setSource(pargs, ovutils::OV_PIPE1);
2172cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed
218541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah    int transform = layer->transform;
219541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah    ovutils::eTransform orient =
220541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah            static_cast<ovutils::eTransform>(transform);
221541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah
2222cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    hwc_rect_t sourceCrop = layer->sourceCrop;
223541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah    hwc_rect_t displayFrame = layer->displayFrame;
224541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah
225541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah    //Calculate the rect for primary based on whether the supplied position
226541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah    //is within or outside bounds.
227541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah    const int fbWidth = ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].xres;
228541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah    const int fbHeight = ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].yres;
229541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah
230541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah    if( displayFrame.left < 0 ||
231541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah            displayFrame.top < 0 ||
232541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah            displayFrame.right > fbWidth ||
233541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah            displayFrame.bottom > fbHeight) {
234541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah        calculate_crop_rects(sourceCrop, displayFrame, fbWidth, fbHeight,
235541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah                transform);
236541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah    }
237541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah
2382cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    // x,y,w,h
2392cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ovutils::Dim dcrop(sourceCrop.left, sourceCrop.top,
2402cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            sourceCrop.right - sourceCrop.left,
2412cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            sourceCrop.bottom - sourceCrop.top);
2422cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    //Only for External
2432cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ov.setCrop(dcrop, ovutils::OV_PIPE1);
2442cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed
245c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    ov.setTransform(orient, ovutils::OV_PIPE1);
2462cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed
247541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah    ovutils::Dim dpos(displayFrame.left,
248541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah            displayFrame.top,
249541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah            (displayFrame.right - displayFrame.left),
250541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah            (displayFrame.bottom - displayFrame.top));
2512cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed
2522cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    //Only for External
2532cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ov.setPosition(dpos, ovutils::OV_PIPE1);
2542cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed
2552cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    if (!ov.commit(ovutils::OV_PIPE1)) {
2562cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed        ALOGE("%s: commit fails", __FUNCTION__);
2572cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed        return false;
2582cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    }
2592cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    return true;
2602cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed}
2612cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed
2623e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahbool VideoOverlay::configure(hwc_context_t *ctx, int dpy,
2633e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        hwc_layer_1_t *yuvLayer) {
2642cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    bool ret = true;
265c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    overlay::Overlay& ov = *(ctx->mOverlay[dpy]);
2663e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    switch(dpy) {
2673e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        case HWC_DISPLAY_PRIMARY:
2683e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            // Set overlay state
269c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah            ov.setState(sState[dpy]);
270c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah            switch(sState[dpy]) {
2713e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                case ovutils::OV_2D_VIDEO_ON_PANEL:
2723e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                    ret &= configPrimVid(ctx, yuvLayer);
2733e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                    break;
2743e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                default:
2753e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                    return false;
2763e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            }
2773e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            break;
2783e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        case HWC_DISPLAY_EXTERNAL:
279c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah            ov.setState(sState[dpy]);
280c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah            switch(sState[dpy]) {
281c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah                case ovutils::OV_UI_VIDEO_TV:
2823e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                    ret = configExtVid(ctx, yuvLayer);
2833e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                    break;
2843e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                default:
2853e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                    return false;
2863e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            }
2873e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            break;
2882cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    }
2892cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    return ret;
290f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed}
291f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
2923e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahbool VideoOverlay::draw(hwc_context_t *ctx, hwc_display_contents_1_t *list,
2933e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        int dpy)
294f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed{
295c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    if(!sIsModeOn[dpy]) {
296c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        return true;
297c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    }
298c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah
2993e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    int yuvIndex = ctx->listStats[dpy].yuvIndex;
300c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    if(yuvIndex == -1) {
301f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed        return true;
302f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    }
303f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
3044c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed    private_handle_t *hnd = (private_handle_t *)
3053e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            list->hwLayers[yuvIndex].handle;
3064c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed
307f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    bool ret = true;
308c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    overlay::Overlay& ov = *(ctx->mOverlay[dpy]);
309f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    ovutils::eOverlayState state = ov.getState();
310f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
3113e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    switch(dpy) {
3123e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        case HWC_DISPLAY_PRIMARY:
3133e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            switch (state) {
3143e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                case ovutils::OV_2D_VIDEO_ON_PANEL:
3153e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                    // Play primary
3163e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                    if (!ov.queueBuffer(hnd->fd, hnd->offset, ovutils::OV_PIPE0)) {
3173e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                        ALOGE("%s: queueBuffer failed for primary", __FUNCTION__);
3183e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                        ret = false;
3193e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                    }
3203e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                    break;
3213e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                default:
3223e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                    ret = false;
3233e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                    break;
3242cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            }
3252cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            break;
3263e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        case HWC_DISPLAY_EXTERNAL:
3273e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah            switch(state) {
328c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah                case ovutils::OV_UI_VIDEO_TV:
3293e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                    // Play external
3303e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                    if (!ov.queueBuffer(hnd->fd, hnd->offset, ovutils::OV_PIPE1)) {
3313e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                        ALOGE("%s: queueBuffer failed for external", __FUNCTION__);
3323e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                        ret = false;
3333e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                    }
3343e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                    break;
3353e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                default:
3363e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                    ret = false;
3373e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                    break;
338f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed            }
339f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed            break;
340f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    }
341f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    return ret;
342f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed}
343f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed
344f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed}; //namespace qhwc
345