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