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 
30 namespace android {
31 namespace intel {
32 
33 #define Display unsigned int
34 typedef void* VADisplay;
35 typedef int VAStatus;
36 
37 class RotationBufferProvider {
38 
39 public:
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 
49 private:
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 
61 private:
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