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#ifndef OVERLAY_STATE_H
3129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#define OVERLAY_STATE_H
3229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
3329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include "overlayUtils.h"
3429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include "overlayImpl.h"
3529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include "overlayRotator.h"
3629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include "pipes/overlayGenPipe.h"
37f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed#include "pipes/overlayVideoExtPipe.h"
3829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include "pipes/overlayUIMirrorPipe.h"
3929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include "pipes/overlay3DPipe.h"
4029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
4129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmednamespace overlay {
4229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
4329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed/*
4429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* Used by Overlay class. Invokes each event
4529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed* */
4629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
4729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedclass OverlayState : utils::NoCopy {
4829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedpublic:
492cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    /*ctor*/
5029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    explicit OverlayState();
5129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
522cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    /*dtor*/
5329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    ~OverlayState();
5429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
5529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* return current state */
5629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    utils::eOverlayState state() const;
5729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
5829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* Hard reset to a new state. If the state is the same
5929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed     * as the current one, it would be a no-op */
6029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    OverlayImplBase* reset(utils::eOverlayState s);
6129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
6229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* Caller pass the state to the handleEvent function.
6329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed     * The input is the current OverlayImplBase*, and output is
6429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed     * a pointer to (possibly new) instance of OverlayImplBase
6529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed     * The eFormat can be 2D/3D etc. */
6629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    OverlayImplBase* handleEvent(utils::eOverlayState s,
6729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            OverlayImplBase* ov);
6829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
692cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    /* Dump */
702cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    void dump() const;
7129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
722cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmedprivate:
7329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
742cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    /* Transitions from a state to a state. Default behavior is to move from an
752cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed     * old state to CLOSED and from CLOSED to a new state. Any impl wishing to
762cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed     * copy pipes should specialize this call */
772cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    template<utils::eOverlayState FROM_STATE, utils::eOverlayState TO_STATE>
782cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    OverlayImplBase* handle_from_to(OverlayImplBase* ov);
7929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
802cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    /* Just a convenient intermediate function to bring down the number of
812cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed     * combinations arising from multiple states */
822cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    template<utils::eOverlayState FROM_STATE>
832cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    OverlayImplBase* handle_from(utils::eOverlayState toState,
842cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            OverlayImplBase* ov);
8529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
862cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    /* Substitues for partially specialized templated handle functions since the
872cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed     * standard doesn't allow partial specialization of functions */
882cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    template<utils::eOverlayState FROM_STATE>
892cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    OverlayImplBase* handle_xxx_to_CLOSED(OverlayImplBase* ov);
9029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
912cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    template<utils::eOverlayState TO_STATE>
922cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    OverlayImplBase* handle_CLOSED_to_xxx(OverlayImplBase* ov);
9329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
9429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    /* States here */
9529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    utils::eOverlayState mState;
9629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed};
9729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
9829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed//------------------------State Traits --------------------------
9929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
10029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// primary has nothing
10129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedtemplate <int STATE> struct StateTraits {};
10229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
10329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed/*
10429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * For 3D_xxx we need channel ID besides the FBx since
10529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * get crop/position 3D need that to determine pos/crop
10629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * info.
10729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * */
10829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
10929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedtemplate <> struct StateTraits<utils::OV_2D_VIDEO_ON_PANEL>
11029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{
1112cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    typedef overlay::GenericPipe<utils::PRIMARY> pipe0; //prim video
11229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef overlay::NullPipe pipe1;   // place holder
11329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef overlay::NullPipe pipe2;   // place holder
11429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
11529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef Rotator rot0;
11629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef NullRotator rot1;
11729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef NullRotator rot2;
11829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
1192cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    typedef overlay::OverlayImpl<pipe0, pipe1, pipe2> ovimpl;
12029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed};
12129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
12229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedtemplate <> struct StateTraits<utils::OV_2D_VIDEO_ON_PANEL_TV>
12329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{
1242cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    typedef overlay::GenericPipe<utils::PRIMARY> pipe0; //prim video
1252cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    typedef overlay::VideoExtPipe pipe1; //ext video
1262cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    typedef overlay::GenericPipe<utils::EXTERNAL> pipe2; //ext subtitle
12729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
12829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef Rotator rot0;
129f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    typedef Rotator rot1;
13029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef NullRotator rot2;
13129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
1322cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    typedef overlay::OverlayImpl<pipe0, pipe1, pipe2> ovimpl;
1332cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed};
1342cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed
1352cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmedtemplate <> struct StateTraits<utils::OV_2D_VIDEO_ON_TV>
1362cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed{
1372cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    typedef overlay::NullPipe pipe0; //nothing on primary with mdp
1382cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    typedef overlay::VideoExtPipe pipe1; //ext video
1392cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    typedef overlay::GenericPipe<utils::EXTERNAL> pipe2; //ext subtitle
1402cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed
1412cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    typedef NullRotator rot0;
1422cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    typedef Rotator rot1;
1432cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    typedef NullRotator rot2;
1442cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed
1452cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    typedef overlay::OverlayImpl<pipe0, pipe1, pipe2> ovimpl;
14629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed};
14729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
148c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shahtemplate <> struct StateTraits<utils::OV_UI_VIDEO_TV>
149c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah{
150c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    typedef overlay::GenericPipe<utils::EXTERNAL> pipe0; //ext UI
151c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    typedef overlay::GenericPipe<utils::EXTERNAL> pipe1; //ext video
152c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    typedef overlay::NullPipe pipe2;
153c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah
154c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    typedef Rotator rot0;
155c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    typedef Rotator rot1;
156c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    typedef NullRotator rot2;
157c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah
158c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    typedef overlay::OverlayImpl<pipe0, pipe1, pipe2> ovimpl;
159c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah};
160c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah
16129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedtemplate <> struct StateTraits<utils::OV_3D_VIDEO_ON_2D_PANEL>
16229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{
16329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef overlay::M3DPrimaryPipe<utils::OV_PIPE0> pipe0;
16429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef overlay::NullPipe pipe1;   // place holder
16529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef overlay::NullPipe pipe2;   // place holder
16629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
16729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef Rotator rot0;
16829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef NullRotator rot1;
16929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef NullRotator rot2;
17029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
17129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef overlay::OverlayImpl<pipe0> ovimpl;
17229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed};
17329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
17429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedtemplate <> struct StateTraits<utils::OV_3D_VIDEO_ON_3D_PANEL>
17529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{
17629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef overlay::S3DPrimaryPipe<utils::OV_PIPE0> pipe0;
17729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef overlay::S3DPrimaryPipe<utils::OV_PIPE1> pipe1;
17829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef overlay::NullPipe pipe2;   // place holder
17929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
18029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef Rotator rot0;
18129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef Rotator rot1;
18229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef NullRotator rot2;
18329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
18429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef overlay::OverlayImpl<pipe0, pipe1> ovimpl;
18529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed};
18629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
18729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedtemplate <> struct StateTraits<utils::OV_3D_VIDEO_ON_3D_TV>
18829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{
18929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef overlay::S3DExtPipe<utils::OV_PIPE0> pipe0;
19029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef overlay::S3DExtPipe<utils::OV_PIPE1> pipe1;
19129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef overlay::NullPipe pipe2;   // place holder
19229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
19329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef NullRotator rot0;
19429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef NullRotator rot1;
19529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef NullRotator rot2;
19629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
19729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef overlay::OverlayImpl<pipe0, pipe1> ovimpl;
19829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed};
19929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
20029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedtemplate <> struct StateTraits<utils::OV_3D_VIDEO_ON_2D_PANEL_2D_TV>
20129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{
20229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef overlay::M3DPrimaryPipe<utils::OV_PIPE0> pipe0;
20329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef overlay::M3DExtPipe<utils::OV_PIPE1> pipe1;
20429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef overlay::NullPipe pipe2;   // place holder
20529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
20629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef Rotator rot0;
20729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef NullRotator rot1;
20829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef NullRotator rot2;
20929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
21029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef overlay::OverlayImpl<pipe0, pipe1> ovimpl;
21129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed};
21229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
21329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedtemplate <> struct StateTraits<utils::OV_UI_MIRROR>
21429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{
215c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    typedef overlay::GenericPipe<ovutils::EXTERNAL> pipe0; //Ext UI
21629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef overlay::NullPipe pipe1;   // place holder
21729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef overlay::NullPipe pipe2;   // place holder
21829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
21929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef Rotator rot0;
22029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef NullRotator rot1;
22129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef NullRotator rot2;
22229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
2232cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    typedef overlay::OverlayImpl<pipe0, pipe1, pipe2> ovimpl;
22429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed};
22529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
22629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedtemplate <> struct StateTraits<utils::OV_2D_TRUE_UI_MIRROR>
22729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{
228c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    typedef overlay::GenericPipe<utils::PRIMARY> pipe0; //Vid prim
229f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    typedef overlay::VideoExtPipe pipe1;
230c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    typedef overlay::GenericPipe<ovutils::EXTERNAL> pipe2; //EXT UI
23129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
23229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef Rotator rot0;
233f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    typedef Rotator rot1;
23429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef Rotator rot2;
23529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
23629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef overlay::OverlayImpl<pipe0, pipe1, pipe2> ovimpl;
23729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed};
23829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
23929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedtemplate <> struct StateTraits<utils::OV_BYPASS_1_LAYER>
24029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{
241f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    typedef overlay::GenericPipe<utils::PRIMARY> pipe0;
24229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef overlay::NullPipe pipe1;   // place holder
24329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef overlay::NullPipe pipe2;   // place holder
24429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
24529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef NullRotator rot0;
24629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef NullRotator rot1;
24729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef NullRotator rot2;
24829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
2492cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    typedef overlay::OverlayImpl<pipe0, pipe1, pipe2> ovimpl;
25029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed};
25129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
25229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedtemplate <> struct StateTraits<utils::OV_BYPASS_2_LAYER>
25329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{
254f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    typedef overlay::GenericPipe<utils::PRIMARY> pipe0;
255f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    typedef overlay::GenericPipe<utils::PRIMARY> pipe1;
25629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef overlay::NullPipe pipe2;   // place holder
25729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
25829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef NullRotator rot0;
25929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef NullRotator rot1;
26029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef NullRotator rot2;
26129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
2622cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    typedef overlay::OverlayImpl<pipe0, pipe1, pipe2> ovimpl;
26329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed};
26429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
26529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedtemplate <> struct StateTraits<utils::OV_BYPASS_3_LAYER>
26629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{
267f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    typedef overlay::GenericPipe<utils::PRIMARY> pipe0;
268f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    typedef overlay::GenericPipe<utils::PRIMARY> pipe1;
269f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed    typedef overlay::GenericPipe<utils::PRIMARY> pipe2;
27029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
27129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef NullRotator rot0;
27229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef NullRotator rot1;
27329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef NullRotator rot2;
27429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
27529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    typedef overlay::OverlayImpl<pipe0, pipe1, pipe2> ovimpl;
27629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed};
27729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
2782cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmedtemplate <> struct StateTraits<utils::OV_DUAL_DISP>
2792cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed{
2802cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    typedef overlay::GenericPipe<utils::EXTERNAL> pipe0;
2814c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed    typedef overlay::NullPipe pipe1;
2822cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    typedef overlay::NullPipe pipe2;
28329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
2842cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    typedef NullRotator rot0;
2852cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    typedef NullRotator rot1;
2862cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    typedef NullRotator rot2;
28729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
2882cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    typedef overlay::OverlayImpl<pipe0, pipe1, pipe2> ovimpl;
2892cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed};
29029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
29129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
2922cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed//------------------------Inlines --------------------------------
29329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
2942cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed
2952cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmedinline OverlayState::OverlayState() : mState(utils::OV_CLOSED){}
2962cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmedinline OverlayState::~OverlayState() {}
2972cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmedinline utils::eOverlayState OverlayState::state() const { return mState; }
2982cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmedinline OverlayImplBase* OverlayState::reset(utils::eOverlayState s) {
29929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return handleEvent(s, 0);
30029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
3012cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmedinline void OverlayState::dump() const {
30229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    ALOGE("== Dump state %d start/end ==", mState);
30329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
30429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
3052cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmedinline OverlayImplBase* OverlayState::handleEvent(utils::eOverlayState toState,
30629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        OverlayImplBase* ov)
30729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{
30829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    OverlayImplBase* newov = ov; // at least, we return the same
3092cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    if (mState != toState) {
3102cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed        ALOGD_IF(DEBUG_OVERLAY, "%s: state changed %s-->%s",
3112cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed                __FUNCTION__, getStateString(mState), getStateString(toState));
31229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    } else {
3132cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed        ALOGD_IF(DEBUG_OVERLAY, "%s: no state change, state=%s",
3142cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed                __FUNCTION__, getStateString(toState));
31529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        return newov;
31629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
31729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
31829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    switch(mState)
31929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    {
32029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        case utils::OV_CLOSED:
3212cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            newov = handle_from<utils::OV_CLOSED>(toState, ov);
32229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            break;
32329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        case utils::OV_2D_VIDEO_ON_PANEL:
3242cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            newov = handle_from<utils::OV_2D_VIDEO_ON_PANEL>(toState, ov);
32529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            break;
32629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        case utils::OV_2D_VIDEO_ON_PANEL_TV:
3272cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            newov = handle_from<utils::OV_2D_VIDEO_ON_PANEL_TV>(toState, ov);
32829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            break;
3292cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed        case utils::OV_2D_VIDEO_ON_TV:
3302cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            newov = handle_from<utils::OV_2D_VIDEO_ON_TV>(toState, ov);
33129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            break;
33229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        case utils::OV_3D_VIDEO_ON_2D_PANEL:
3332cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            newov = handle_from<utils::OV_3D_VIDEO_ON_2D_PANEL>(toState, ov);
33429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            break;
33529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        case utils::OV_3D_VIDEO_ON_3D_PANEL:
3362cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            newov = handle_from<utils::OV_3D_VIDEO_ON_3D_PANEL>(toState, ov);
33729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            break;
33829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        case utils::OV_3D_VIDEO_ON_3D_TV:
3392cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            newov = handle_from<utils::OV_3D_VIDEO_ON_3D_TV>(toState, ov);
34029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            break;
34129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        case utils::OV_3D_VIDEO_ON_2D_PANEL_2D_TV:
3422cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            newov = handle_from<utils::OV_3D_VIDEO_ON_2D_PANEL_2D_TV>(toState,
3432cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed                                                                      ov);
34429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            break;
34529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        case utils::OV_UI_MIRROR:
3462cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            newov = handle_from<utils::OV_UI_MIRROR>(toState, ov);
34729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            break;
34829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        case utils::OV_2D_TRUE_UI_MIRROR:
3492cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            newov = handle_from<utils::OV_2D_TRUE_UI_MIRROR>(toState, ov);
35029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            break;
351c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        case utils::OV_UI_VIDEO_TV:
352c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah            newov = handle_from<utils::OV_UI_VIDEO_TV>(toState, ov);
353c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah            break;
35429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        case utils::OV_BYPASS_1_LAYER:
3552cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            newov = handle_from<utils::OV_BYPASS_1_LAYER>(toState, ov);
35629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            break;
35729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        case utils::OV_BYPASS_2_LAYER:
3582cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            newov = handle_from<utils::OV_BYPASS_2_LAYER>(toState, ov);
35929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            break;
36029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        case utils::OV_BYPASS_3_LAYER:
3612cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            newov = handle_from<utils::OV_BYPASS_3_LAYER>(toState, ov);
36229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            break;
3632cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed        case utils::OV_DUAL_DISP:
3642cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            newov = handle_from<utils::OV_DUAL_DISP>(toState, ov);
36529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            break;
36629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        default:
3672cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            OVASSERT(1 == 0, "%s: unknown state = %d", __FUNCTION__, mState);
3682cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed
36929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
37029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return newov;
37129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
37229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
3732cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmedtemplate <utils::eOverlayState FROM_STATE>
3742cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmedinline OverlayImplBase* OverlayState::handle_from(utils::eOverlayState toState,
3752cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed        OverlayImplBase* ov) {
3762cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed
3772cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    switch(toState)
37829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    {
37929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        case utils::OV_CLOSED:
3802cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            ov = handle_xxx_to_CLOSED<FROM_STATE>(ov);
38129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            break;
38229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        case utils::OV_2D_VIDEO_ON_PANEL:
3832cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            ov = handle_from_to<FROM_STATE, utils::OV_2D_VIDEO_ON_PANEL>(ov);
38429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            break;
38529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        case utils::OV_2D_VIDEO_ON_PANEL_TV:
3862cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            ov = handle_from_to<FROM_STATE, utils::OV_2D_VIDEO_ON_PANEL_TV>(ov);
3872cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            break;
3882cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed        case utils::OV_2D_VIDEO_ON_TV:
3892cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            ov = handle_from_to<FROM_STATE, utils::OV_2D_VIDEO_ON_TV>(ov);
39029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            break;
39129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        case utils::OV_3D_VIDEO_ON_2D_PANEL:
3922cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            ov = handle_from_to<FROM_STATE, utils::OV_3D_VIDEO_ON_2D_PANEL>(ov);
39329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            break;
39429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        case utils::OV_3D_VIDEO_ON_3D_PANEL:
3952cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            ov = handle_from_to<FROM_STATE, utils::OV_3D_VIDEO_ON_3D_PANEL>(ov);
39629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            break;
39729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        case utils::OV_3D_VIDEO_ON_3D_TV:
3982cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            ov = handle_from_to<FROM_STATE, utils::OV_3D_VIDEO_ON_3D_TV>(ov);
39929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            break;
40029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        case utils::OV_3D_VIDEO_ON_2D_PANEL_2D_TV:
4012cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            ov = handle_from_to<FROM_STATE,
4022cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed                        utils::OV_3D_VIDEO_ON_2D_PANEL_2D_TV>(ov);
40329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            break;
40429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        case utils::OV_UI_MIRROR:
4052cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            ov = handle_from_to<FROM_STATE, utils::OV_UI_MIRROR>(ov);
40629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            break;
40729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        case utils::OV_2D_TRUE_UI_MIRROR:
4082cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            ov = handle_from_to<FROM_STATE, utils::OV_2D_TRUE_UI_MIRROR>(ov);
40929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            break;
410c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        case utils::OV_UI_VIDEO_TV:
411c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah            ov = handle_from_to<FROM_STATE, utils::OV_UI_VIDEO_TV>(ov);
412c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah            break;
41329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        case utils::OV_BYPASS_1_LAYER:
4142cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            ov = handle_from_to<FROM_STATE, utils::OV_BYPASS_1_LAYER>(ov);
41529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            break;
41629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        case utils::OV_BYPASS_2_LAYER:
4172cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            ov = handle_from_to<FROM_STATE, utils::OV_BYPASS_2_LAYER>(ov);
41829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            break;
41929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        case utils::OV_BYPASS_3_LAYER:
4202cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            ov = handle_from_to<FROM_STATE, utils::OV_BYPASS_3_LAYER>(ov);
4212cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            break;
4222cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed        case utils::OV_DUAL_DISP:
4232cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            ov = handle_from_to<FROM_STATE, utils::OV_DUAL_DISP>(ov);
42429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            break;
42529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        default:
4262cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            OVASSERT(1 == 0, "%s: unknown state = %d", __FUNCTION__, toState);
42729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
4282cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    mState = toState;
4292cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    return ov;
43029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
43129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
4322cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed
4332cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed/* Transition default from any to any. Does in two steps.
4342cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed * Moves from OLD to CLOSED and then from CLOSED to NEW
4352cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed */
4362cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmedtemplate<utils::eOverlayState FROM_STATE, utils::eOverlayState TO_STATE>
4372cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmedinline OverlayImplBase* OverlayState::handle_from_to(OverlayImplBase* ov) {
4382cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    handle_xxx_to_CLOSED<FROM_STATE>(ov);
4392cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    return handle_CLOSED_to_xxx<TO_STATE>(ov);
44029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
44129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
4422cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed//---------------Specializations-------------
4432cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed
4442cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed
4452cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed/* Transition from CLOSED to ANY */
4462cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmedtemplate<utils::eOverlayState TO_STATE>
4472cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmedinline OverlayImplBase* OverlayState::handle_CLOSED_to_xxx(
4482cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            OverlayImplBase* /*ignored*/) {
4492cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    //If going from CLOSED to CLOSED, nothing to do.
4502cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    if(TO_STATE == utils::OV_CLOSED) return NULL;
4512cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ALOGD("FROM_STATE = %s TO_STATE = %s",
4522cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            utils::getStateString(utils::OV_CLOSED),
4532cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            utils::getStateString(TO_STATE));
4542cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    OverlayImplBase* ov = new typename StateTraits<TO_STATE>::ovimpl;
4552cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    RotatorBase* rot0 = new typename StateTraits<TO_STATE>::rot0;
4562cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    RotatorBase* rot1 = new typename StateTraits<TO_STATE>::rot1;
4572cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    RotatorBase* rot2 = new typename StateTraits<TO_STATE>::rot2;
4582cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    if(!ov->init(rot0, rot1, rot2)) {
4592cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed        ALOGE("Overlay failed to init in state %d", TO_STATE);
4602cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed        return 0;
46129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
4622cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    return ov;
46329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
46429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
4652cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed/* Transition from ANY to CLOSED */
4662cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmedtemplate<utils::eOverlayState FROM_STATE>
4672cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmedinline OverlayImplBase* OverlayState::handle_xxx_to_CLOSED(OverlayImplBase* ov)
46829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{
4692cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    //If going from CLOSED to CLOSED, nothing to do.
4702cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    if(FROM_STATE == utils::OV_CLOSED) return NULL;
4712cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ALOGD("FROM_STATE = %s TO_STATE = %s",
4722cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            utils::getStateString(FROM_STATE),
4732cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            utils::getStateString(utils::OV_CLOSED));
4742cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    OVASSERT(ov, "%s: ov is null", __FUNCTION__);
4752cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    if(!ov->close()) {
4762cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed        ALOGE("%s: Failed to ov close", __FUNCTION__);
47729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
4782cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    delete ov;
4792cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ov = 0;
4802cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    return 0;
48129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
48229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
4832cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed/* Transition from 2D_VIDEO_ON_PANEL to 2D_VIDEO_ON_PANEL_TV */
4842cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmedtemplate<>
4852cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmedinline OverlayImplBase* OverlayState::handle_from_to<
4862cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed        utils::OV_2D_VIDEO_ON_PANEL,
4872cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed        utils::OV_2D_VIDEO_ON_PANEL_TV>(
4882cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed        OverlayImplBase* ov) {
4892cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    OVASSERT(ov, "%s: ov is null", __FUNCTION__);
4902cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ALOGD("FROM_STATE = %s TO_STATE = %s",
4912cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            utils::getStateString(utils::OV_2D_VIDEO_ON_PANEL),
4922cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            utils::getStateString(utils::OV_2D_VIDEO_ON_PANEL_TV));
4932cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    // Create new ovimpl based on new state
4942cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    typedef StateTraits<utils::OV_2D_VIDEO_ON_PANEL_TV> NewState;
4952cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    OverlayImplBase* newov = new NewState::ovimpl;
4962cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed
4972cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    //copy pipe0/rot0 (primary video)
4982cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    newov->copyOvPipe(ov, utils::OV_PIPE0);
4992cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    //close old pipe1, create new pipe1
5002cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ov->closePipe(utils::OV_PIPE1);
5012cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    RotatorBase* rot1 = new NewState::rot1;
5022cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    newov->initPipe(rot1, utils::OV_PIPE1);
5032cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    //close old pipe2, create new pipe2
5042cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ov->closePipe(utils::OV_PIPE2);
5052cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    RotatorBase* rot2 = new NewState::rot2;
5062cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    newov->initPipe(rot2, utils::OV_PIPE2);
5072cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    // All pipes are copied or deleted so no more need for previous ovimpl
5082cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    delete ov;
5092cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ov = 0;
51029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return newov;
51129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
51229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
5132cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed/* Transition from 2D_VIDEO_ON_PANEL_TV to 2D_VIDEO_ON_PANEL */
5142cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmedtemplate<>
5152cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmedinline OverlayImplBase* OverlayState::handle_from_to<
5162cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed        utils::OV_2D_VIDEO_ON_PANEL_TV,
5172cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed        utils::OV_2D_VIDEO_ON_PANEL>(
5182cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed        OverlayImplBase* ov) {
5192cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    OVASSERT(ov, "%s: ov is null", __FUNCTION__);
5202cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ALOGD("FROM_STATE = %s TO_STATE = %s",
5212cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            utils::getStateString(utils::OV_2D_VIDEO_ON_PANEL_TV),
5222cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            utils::getStateString(utils::OV_2D_VIDEO_ON_PANEL));
5232cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed
5242cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    // Create new ovimpl based on new state
5252cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    typedef StateTraits<utils::OV_2D_VIDEO_ON_PANEL> NewState;
5262cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    OverlayImplBase* newov = new NewState::ovimpl;
5272cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed
5282cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    //copy pipe0/rot0 (primary video)
5292cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    newov->copyOvPipe(ov, utils::OV_PIPE0);
5302cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    //close old pipe1, create new pipe1
5312cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ov->closePipe(utils::OV_PIPE1);
5322cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    RotatorBase* rot1 = new NewState::rot1;
5332cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    newov->initPipe(rot1, utils::OV_PIPE1);
5342cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    //close old pipe2, create new pipe2
5352cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ov->closePipe(utils::OV_PIPE2);
5362cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    RotatorBase* rot2 = new NewState::rot2;
5372cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    newov->initPipe(rot2, utils::OV_PIPE2);
5382cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    // All pipes are copied or deleted so no more need for previous ovimpl
5392cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    delete ov;
5402cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ov = 0;
54129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return newov;
54229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
54329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
5442cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed/* Transition from 2D_VIDEO_ON_PANEL_TV to 2D_VIDEO_ON_TV */
5452cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmedtemplate<>
5462cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmedinline OverlayImplBase* OverlayState::handle_from_to<
5472cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed        utils::OV_2D_VIDEO_ON_PANEL_TV,
5482cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed        utils::OV_2D_VIDEO_ON_TV>(
5492cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed        OverlayImplBase* ov) {
5502cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    OVASSERT(ov, "%s: ov is null", __FUNCTION__);
5512cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ALOGD("FROM_STATE = %s TO_STATE = %s",
5522cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            utils::getStateString(utils::OV_2D_VIDEO_ON_PANEL_TV),
5532cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            utils::getStateString(utils::OV_2D_VIDEO_ON_TV));
5542cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed
5552cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    // Create new ovimpl based on new state
5562cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    typedef StateTraits<utils::OV_2D_VIDEO_ON_TV> NewState;
5572cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    OverlayImplBase* newov = new NewState::ovimpl;
5582cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed
5592cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    //close old pipe0, create new pipe0
5602cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ov->closePipe(utils::OV_PIPE0);
5612cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    RotatorBase* rot0 = new NewState::rot0;
5622cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    newov->initPipe(rot0, utils::OV_PIPE0);
5632cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    //copy pipe1/rot1 (ext video)
5642cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    newov->copyOvPipe(ov, utils::OV_PIPE1);
5652cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    //copy pipe2/rot2 (ext cc)
5662cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    newov->copyOvPipe(ov, utils::OV_PIPE2);
5672cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    // All pipes are copied or deleted so no more need for previous ovimpl
5682cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    delete ov;
5692cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ov = 0;
57029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return newov;
57129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
57229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
5732cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed/* Transition from 2D_VIDEO_ON_TV to 2D_VIDEO_ON_PANEL_TV */
5742cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmedtemplate<>
5752cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmedinline OverlayImplBase* OverlayState::handle_from_to<
5762cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed        utils::OV_2D_VIDEO_ON_TV,
5772cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed        utils::OV_2D_VIDEO_ON_PANEL_TV>(
5782cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed        OverlayImplBase* ov) {
5792cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    OVASSERT(ov, "%s: ov is null", __FUNCTION__);
5802cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ALOGD("FROM_STATE = %s TO_STATE = %s",
5812cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            utils::getStateString(utils::OV_2D_VIDEO_ON_TV),
5822cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed            utils::getStateString(utils::OV_2D_VIDEO_ON_PANEL_TV));
5832cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed
5842cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    // Create new ovimpl based on new state
5852cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    typedef StateTraits<utils::OV_2D_VIDEO_ON_PANEL_TV> NewState;
5862cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    OverlayImplBase* newov = new NewState::ovimpl;
5872cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed
5882cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    //close old pipe0, create new pipe0
5892cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ov->closePipe(utils::OV_PIPE0);
5902cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    RotatorBase* rot0 = new NewState::rot0;
5912cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    newov->initPipe(rot0, utils::OV_PIPE0);
5922cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    //copy pipe1/rot1 (ext video)
5932cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    newov->copyOvPipe(ov, utils::OV_PIPE1);
5942cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    //copy pipe2/rot2 (ext cc)
5952cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    newov->copyOvPipe(ov, utils::OV_PIPE2);
5962cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    // All pipes are copied or deleted so no more need for previous ovimpl
5972cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    delete ov;
5982cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed    ov = 0;
59929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return newov;
60029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
60129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
602c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah/* Transition from OV_UI_MIRROR to OV_UI_VIDEO_TV */
603c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shahtemplate<>
604c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shahinline OverlayImplBase* OverlayState::handle_from_to<
605c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        utils::OV_UI_MIRROR,
606c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        utils::OV_UI_VIDEO_TV>(
607c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        OverlayImplBase* ov) {
608c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    OVASSERT(ov, "%s: ov is null", __FUNCTION__);
609c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    ALOGD("FROM_STATE = %s TO_STATE = %s",
610c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah            utils::getStateString(utils::OV_UI_MIRROR),
611c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah            utils::getStateString(utils::OV_UI_VIDEO_TV));
612c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah
613c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    // Create new ovimpl based on new state
614c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    typedef StateTraits<utils::OV_UI_VIDEO_TV> NewState;
615c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    OverlayImplBase* newov = new NewState::ovimpl;
616c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah
617c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    //copy pipe0/rot0 (ext video)
618c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    newov->copyOvPipe(ov, utils::OV_PIPE0);
619c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah
620c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    ov->closePipe(utils::OV_PIPE1);
621c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    RotatorBase* rot1 = new NewState::rot1;
622c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    newov->initPipe(rot1, utils::OV_PIPE1);
623c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah
624c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    ov->closePipe(utils::OV_PIPE2);
625c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    RotatorBase* rot2 = new NewState::rot2;
626c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    newov->initPipe(rot2, utils::OV_PIPE2);
627c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah
628c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    // All pipes are copied or deleted so no more need for previous ovimpl
629c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    delete ov;
630c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    ov = 0;
631c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    return newov;
632c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah}
633c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah
634c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah/* Transition from OV_UI_VIDEO_TV to OV_UI_MIRROR */
635c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shahtemplate<>
636c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shahinline OverlayImplBase* OverlayState::handle_from_to<
637c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        utils::OV_UI_VIDEO_TV,
638c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        utils::OV_UI_MIRROR>(
639c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        OverlayImplBase* ov) {
640c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    OVASSERT(ov, "%s: ov is null", __FUNCTION__);
641c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    ALOGD("FROM_STATE = %s TO_STATE = %s",
642c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah            utils::getStateString(utils::OV_UI_VIDEO_TV),
643c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah            utils::getStateString(utils::OV_UI_MIRROR));
644c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah
645c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    // Create new ovimpl based on new state
646c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    typedef StateTraits<utils::OV_UI_MIRROR> NewState;
647c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    OverlayImplBase* newov = new NewState::ovimpl;
648c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah
649c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    //copy pipe0/rot0 (ext video)
650c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    newov->copyOvPipe(ov, utils::OV_PIPE0);
651c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah
652c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    ov->closePipe(utils::OV_PIPE1);
653c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    RotatorBase* rot1 = new NewState::rot1;
654c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    newov->initPipe(rot1, utils::OV_PIPE1);
655c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah
656c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    ov->closePipe(utils::OV_PIPE2);
657c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    RotatorBase* rot2 = new NewState::rot2;
658c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    newov->initPipe(rot2, utils::OV_PIPE2);
659c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah
660c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    // All pipes are copied or deleted so no more need for previous ovimpl
661c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    delete ov;
662c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    ov = 0;
663c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    return newov;
664c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah}
66529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} // overlay
66629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
66729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#endif // OVERLAY_STATE_H
668