| /* |
| * Copyright (C) 2012 Intel Corporation. All rights reserved. |
| * |
| * 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 __ISVWorker_H_ |
| #define __ISVWorker_H_ |
| |
| #include <va/va.h> |
| #include <va/va_vpp.h> |
| #include <va/va_android.h> |
| #include <OMX_Component.h> |
| #include <utils/RefBase.h> |
| #include "isv_profile.h" |
| #include "isv_bufmanager.h" |
| |
| #define ANDROID_DISPLAY_HANDLE 0x18C34078 |
| #define Display unsigned int |
| |
| //FIXME: copy from OMX_Core.h |
| |
| /* interlaced frame flag: This flag is set to indicate the buffer contains a |
| * top and bottom field and display ordering is top field first. |
| * @ingroup buf |
| */ |
| #define OMX_BUFFERFLAG_TFF 0x00010000 |
| |
| /* interlaced frame flag: This flag is set to indicate the buffer contains a |
| * top and bottom field and display ordering is bottom field first. |
| * @ingroup buf |
| */ |
| #define OMX_BUFFERFLAG_BFF 0x00020000 |
| |
| using namespace android; |
| |
| typedef enum |
| { |
| STATUS_OK = 0, |
| STATUS_NOT_SUPPORT, |
| STATUS_ALLOCATION_ERROR, |
| STATUS_ERROR, |
| STATUS_DATA_RENDERING |
| } vpp_status; |
| |
| typedef enum |
| { |
| DEINTERLACE_BOB = 0, // BOB DI |
| DEINTERLACE_ADI = 1, // ADI |
| } deinterlace_t; |
| |
| //Avaiable filter types |
| typedef enum |
| { |
| FILTER_HQ = 0, // high-quality filter (AVS scaling) |
| FILTER_FAST = 1, // fast filter (bilinear scaling) |
| } filter_t; |
| |
| typedef struct { |
| uint32_t srcWidth; |
| uint32_t srcHeight; |
| uint32_t dstWidth; |
| uint32_t dstHeight; |
| uint32_t denoiseLevel; |
| uint32_t sharpnessLevel; |
| uint32_t colorBalanceLevel; |
| deinterlace_t deinterlaceType; |
| filter_t scalarType; |
| uint32_t frameRate; |
| uint32_t hasEncoder; |
| FRC_RATE frcRate; |
| } FilterParam; |
| |
| class ISVBuffer; |
| |
| class ISVWorker : public RefBase |
| { |
| |
| public: |
| // config filters on or off based on video info |
| status_t configFilters(uint32_t filters, const FilterParam* filterParam); |
| |
| // Initialize: setupVA()->setupFilters()->setupPipelineCaps() |
| status_t init(uint32_t width, uint32_t height); |
| status_t deinit(); |
| |
| // Get output buffer number needed for processing |
| uint32_t getProcBufCount(); |
| |
| // Get output buffer number needed for filling |
| uint32_t getFillBufCount(); |
| |
| // Send input and output buffers to VSP to begin processing |
| status_t process(ISVBuffer* input, Vector<ISVBuffer*> output, uint32_t outputCount, bool isEOS, uint32_t flags); |
| |
| // Fill output buffers given, it's a blocking call |
| status_t fill(Vector<ISVBuffer*> output, uint32_t outputCount); |
| |
| // reset index |
| status_t reset(); |
| |
| // set video display mode |
| void setDisplayMode(int32_t mode); |
| |
| // get video display mode |
| int32_t getDisplayMode(); |
| |
| // check HDMI connection status |
| bool isHdmiConnected(); |
| |
| uint32_t getVppOutputFps(); |
| |
| // alloc/free VA surface |
| status_t allocSurface(uint32_t* width, uint32_t* height, |
| uint32_t stride, uint32_t format, unsigned long handle, int32_t* surfaceId); |
| status_t freeSurface(int32_t* surfaceId); |
| |
| ISVWorker(); |
| ~ISVWorker() {} |
| |
| private: |
| // Check if VPP is supported |
| bool isSupport() const; |
| |
| // Get output buffer number needed for processing |
| uint32_t getOutputBufCount(uint32_t index); |
| |
| // Check filter caps and create filter buffers |
| status_t setupFilters(); |
| |
| // Setup pipeline caps |
| status_t setupPipelineCaps(); |
| |
| //check if the input fps is suportted in array fpsSet. |
| bool isFpsSupport(int32_t fps, int32_t *fpsSet, int32_t fpsSetCnt); |
| |
| // Debug only |
| // Dump YUV frame |
| status_t dumpYUVFrameData(VASurfaceID surfaceID); |
| status_t writeNV12(int width, int height, unsigned char *out_buf, int y_pitch, int uv_pitch); |
| |
| ISVWorker(const ISVWorker &); |
| ISVWorker &operator=(const ISVWorker &); |
| |
| public: |
| uint32_t mNumForwardReferences; |
| |
| private: |
| // VA common variables |
| VAContextID mVAContext; |
| uint32_t mWidth; |
| uint32_t mHeight; |
| Display * mDisplay; |
| VADisplay mVADisplay; |
| VAConfigID mVAConfig; |
| |
| // Forward References Surfaces |
| Vector<VABufferID> mPipelineBuffers; |
| Mutex mPipelineBufferLock; // to protect access to mPipelineBuffers |
| VASurfaceID *mForwardReferences; |
| VASurfaceID mPrevInput; |
| VASurfaceID mPrevOutput; |
| |
| // VPP Filters Buffers |
| uint32_t mNumFilterBuffers; |
| VABufferID mFilterBuffers[VAProcFilterCount]; |
| |
| // VPP filter configuration |
| VABufferID mFilterFrc; |
| |
| // VPP filter configuration |
| uint32_t mFilters; |
| FilterParam mFilterParam; |
| |
| // status |
| uint32_t mInputIndex; |
| uint32_t mOutputIndex; |
| uint32_t mOutputCount; |
| |
| // FIXME: not very sure how to check color standard |
| VAProcColorStandardType in_color_standards[VAProcColorStandardCount]; |
| VAProcColorStandardType out_color_standards[VAProcColorStandardCount]; |
| }; |
| |
| #endif //__ISVWorker_H_ |