1/*
2// Copyright (c) 2014 Intel Corporation 
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8//      http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15*/
16
17#ifndef __ROTATIONO_BUFFER_PROVIDER_H__
18#define __ROTATIONO_BUFFER_PROVIDER_H__
19
20#include <va/va.h>
21#include <sys/time.h>
22#include <va/va_tpi.h>
23#include <va/va_vpp.h>
24#include <common/Wsbm.h>
25#include <utils/Timers.h>
26#include <utils/KeyedVector.h>
27#include <va/va_android.h>
28#include <common/VideoPayloadBuffer.h>
29
30namespace android {
31namespace intel {
32
33#define Display unsigned int
34typedef void* VADisplay;
35typedef int VAStatus;
36
37class RotationBufferProvider {
38
39public:
40    RotationBufferProvider(Wsbm* wsbm);
41    ~RotationBufferProvider();
42
43    bool initialize();
44    void deinitialize();
45    void reset();
46    bool setupRotationBuffer(VideoPayloadBuffer *payload, int transform);
47    bool prepareBufferInfo(int, int, int, VideoPayloadBuffer *, void *);
48
49private:
50    void invalidateCaches();
51    bool startVA(VideoPayloadBuffer *payload, int transform);
52    void stopVA();
53    bool isContextChanged(int width, int height, int transform);
54    int transFromHalToVa(int transform);
55    buffer_handle_t createWsbmBuffer(int width, int height, void **buf);
56    int getStride(bool isTarget, int width);
57    bool createVaSurface(VideoPayloadBuffer *payload, int transform, bool isTarget);
58    void freeVaSurfaces();
59    inline uint32_t getMilliseconds();
60
61private:
62    enum {
63        MAX_SURFACE_NUM = 4
64    };
65
66    Wsbm* mWsbm;
67
68    bool mVaInitialized;
69    VADisplay mVaDpy;
70    VAConfigID mVaCfg;
71    VAContextID mVaCtx;
72    VABufferID mVaBufFilter;
73    VASurfaceID mSourceSurface;
74    Display mDisplay;
75
76    // rotation config variables
77    int mWidth;
78    int mHeight;
79    int mTransform;
80
81    int mRotatedWidth;
82    int mRotatedHeight;
83    int mRotatedStride;
84
85    int mTargetIndex;
86    buffer_handle_t mKhandles[MAX_SURFACE_NUM];
87    VASurfaceID mRotatedSurfaces[MAX_SURFACE_NUM];
88    void *mDrmBuf[MAX_SURFACE_NUM];
89
90    enum {
91        TTM_WRAPPER_COUNT = 10,
92    };
93
94    KeyedVector<uint64_t, void*> mTTMWrappers; /* userPt/wsbmBuffer  */
95
96    int mBobDeinterlace;
97};
98
99} // name space intel
100} // name space android
101
102#endif
103