/* // Copyright (c) 2014 Intel Corporation // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. */ #ifndef __ROTATIONO_BUFFER_PROVIDER_H__ #define __ROTATIONO_BUFFER_PROVIDER_H__ #include <va/va.h> #include <sys/time.h> #include <va/va_tpi.h> #include <va/va_vpp.h> #include <common/Wsbm.h> #include <utils/Timers.h> #include <utils/KeyedVector.h> #include <va/va_android.h> #include <common/VideoPayloadBuffer.h> namespace android { namespace intel { #define Display unsigned int typedef void* VADisplay; typedef int VAStatus; class RotationBufferProvider { public: RotationBufferProvider(Wsbm* wsbm); ~RotationBufferProvider(); bool initialize(); void deinitialize(); void reset(); bool setupRotationBuffer(VideoPayloadBuffer *payload, int transform); bool prepareBufferInfo(int, int, int, VideoPayloadBuffer *, void *); private: void invalidateCaches(); bool startVA(VideoPayloadBuffer *payload, int transform); void stopVA(); bool isContextChanged(int width, int height, int transform); int transFromHalToVa(int transform); buffer_handle_t createWsbmBuffer(int width, int height, void **buf); int getStride(bool isTarget, int width); bool createVaSurface(VideoPayloadBuffer *payload, int transform, bool isTarget); void freeVaSurfaces(); inline uint32_t getMilliseconds(); private: enum { MAX_SURFACE_NUM = 4 }; Wsbm* mWsbm; bool mVaInitialized; VADisplay mVaDpy; VAConfigID mVaCfg; VAContextID mVaCtx; VABufferID mVaBufFilter; VASurfaceID mSourceSurface; Display mDisplay; // rotation config variables int mWidth; int mHeight; int mTransform; int mRotatedWidth; int mRotatedHeight; int mRotatedStride; int mTargetIndex; buffer_handle_t mKhandles[MAX_SURFACE_NUM]; VASurfaceID mRotatedSurfaces[MAX_SURFACE_NUM]; void *mDrmBuf[MAX_SURFACE_NUM]; enum { TTM_WRAPPER_COUNT = 10, }; KeyedVector<uint64_t, void*> mTTMWrappers; /* userPt/wsbmBuffer */ int mBobDeinterlace; }; } // name space intel } // name space android #endif