125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang/* 225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * Copyright (C) 2012 Intel Corporation. All rights reserved. 325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * 425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * Licensed under the Apache License, Version 2.0 (the "License"); 525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * you may not use this file except in compliance with the License. 625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * You may obtain a copy of the License at 725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * 825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * http://www.apache.org/licenses/LICENSE-2.0 925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * 1025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * Unless required by applicable law or agreed to in writing, software 1125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * distributed under the License is distributed on an "AS IS" BASIS, 1225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * See the License for the specific language governing permissions and 1425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * limitations under the License. 1525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * 1625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang */ 1725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 1825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#ifndef __ISVWorker_H_ 1925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#define __ISVWorker_H_ 2025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 2125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#include <va/va.h> 2225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#include <va/va_vpp.h> 2325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#include <va/va_android.h> 2425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#include <OMX_Component.h> 2525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#include <utils/RefBase.h> 2625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#include "isv_profile.h" 2725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#include "isv_bufmanager.h" 2825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 2925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#define ANDROID_DISPLAY_HANDLE 0x18C34078 3025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#define Display unsigned int 3125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 3225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang//FIXME: copy from OMX_Core.h 3325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 3425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang/* interlaced frame flag: This flag is set to indicate the buffer contains a 3525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * top and bottom field and display ordering is top field first. 3625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * @ingroup buf 3725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang */ 3825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#define OMX_BUFFERFLAG_TFF 0x00010000 3925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 40d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang/* interlaced frame flag: This flag is set to indicate the buffer contains a 4125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * top and bottom field and display ordering is bottom field first. 4225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * @ingroup buf 4325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang */ 4425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#define OMX_BUFFERFLAG_BFF 0x00020000 4525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 4625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangusing namespace android; 4725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 4825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangtypedef enum 4925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang{ 5025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang STATUS_OK = 0, 5125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang STATUS_NOT_SUPPORT, 5225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang STATUS_ALLOCATION_ERROR, 5325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang STATUS_ERROR, 5425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang STATUS_DATA_RENDERING 5525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang} vpp_status; 5625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 5725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangtypedef enum 5825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang{ 5925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang DEINTERLACE_BOB = 0, // BOB DI 6025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang DEINTERLACE_ADI = 1, // ADI 6125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang} deinterlace_t; 6225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 6325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang//Avaiable filter types 6425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangtypedef enum 6525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang{ 6625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang FILTER_HQ = 0, // high-quality filter (AVS scaling) 6725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang FILTER_FAST = 1, // fast filter (bilinear scaling) 6825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang} filter_t; 6925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 7025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangtypedef struct { 7125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang uint32_t srcWidth; 7225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang uint32_t srcHeight; 7325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang uint32_t dstWidth; 7425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang uint32_t dstHeight; 7525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang uint32_t denoiseLevel; 7625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang uint32_t sharpnessLevel; 7725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang uint32_t colorBalanceLevel; 7825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang deinterlace_t deinterlaceType; 7925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang filter_t scalarType; 8025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang uint32_t frameRate; 8125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang uint32_t hasEncoder; 8225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang FRC_RATE frcRate; 8325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang} FilterParam; 8425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 8525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangclass ISVBuffer; 8625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 8725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangclass ISVWorker : public RefBase 8825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang{ 8925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 9025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang public: 9125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // config filters on or off based on video info 9225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang status_t configFilters(uint32_t filters, const FilterParam* filterParam); 9325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 9425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // Initialize: setupVA()->setupFilters()->setupPipelineCaps() 9525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang status_t init(uint32_t width, uint32_t height); 9625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang status_t deinit(); 9725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 9825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // Get output buffer number needed for processing 9925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang uint32_t getProcBufCount(); 10025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 10125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // Get output buffer number needed for filling 10225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang uint32_t getFillBufCount(); 10325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 10425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // Send input and output buffers to VSP to begin processing 10525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang status_t process(ISVBuffer* input, Vector<ISVBuffer*> output, uint32_t outputCount, bool isEOS, uint32_t flags); 10625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 10725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // Fill output buffers given, it's a blocking call 10825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang status_t fill(Vector<ISVBuffer*> output, uint32_t outputCount); 10925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 11025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // reset index 11125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang status_t reset(); 11225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 11325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // set video display mode 11425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang void setDisplayMode(int32_t mode); 11525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 11625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // get video display mode 11725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang int32_t getDisplayMode(); 11825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 11925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // check HDMI connection status 12025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang bool isHdmiConnected(); 12125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 12225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang uint32_t getVppOutputFps(); 12325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 12425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // alloc/free VA surface 12525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang status_t allocSurface(uint32_t* width, uint32_t* height, 126d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang uint32_t stride, uint32_t format, unsigned long handle, int32_t* surfaceId); 12725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang status_t freeSurface(int32_t* surfaceId); 12825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 12925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ISVWorker(); 13025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ~ISVWorker() {} 13125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 13225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang private: 13325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // Check if VPP is supported 13425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang bool isSupport() const; 13525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 13625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // Get output buffer number needed for processing 13725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang uint32_t getOutputBufCount(uint32_t index); 13825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 13925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // Check filter caps and create filter buffers 14025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang status_t setupFilters(); 14125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 14225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // Setup pipeline caps 14325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang status_t setupPipelineCaps(); 14425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 14525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang //check if the input fps is suportted in array fpsSet. 14625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang bool isFpsSupport(int32_t fps, int32_t *fpsSet, int32_t fpsSetCnt); 14725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 14825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // Debug only 14925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // Dump YUV frame 15025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang status_t dumpYUVFrameData(VASurfaceID surfaceID); 15125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang status_t writeNV12(int width, int height, unsigned char *out_buf, int y_pitch, int uv_pitch); 15225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 15325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ISVWorker(const ISVWorker &); 15425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ISVWorker &operator=(const ISVWorker &); 15525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 15625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang public: 15725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang uint32_t mNumForwardReferences; 15825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 15925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang private: 16025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // VA common variables 16125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAContextID mVAContext; 16225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang uint32_t mWidth; 16325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang uint32_t mHeight; 16425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang Display * mDisplay; 16525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VADisplay mVADisplay; 16625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAConfigID mVAConfig; 16725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 16825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // Forward References Surfaces 16925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang Vector<VABufferID> mPipelineBuffers; 17025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang Mutex mPipelineBufferLock; // to protect access to mPipelineBuffers 17125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VASurfaceID *mForwardReferences; 17225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VASurfaceID mPrevInput; 17325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VASurfaceID mPrevOutput; 17425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 17525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // VPP Filters Buffers 17625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang uint32_t mNumFilterBuffers; 17725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VABufferID mFilterBuffers[VAProcFilterCount]; 17825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 17925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // VPP filter configuration 18025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VABufferID mFilterFrc; 18125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 18225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // VPP filter configuration 18325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang uint32_t mFilters; 18425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang FilterParam mFilterParam; 18525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 18625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // status 18725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang uint32_t mInputIndex; 18825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang uint32_t mOutputIndex; 18925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang uint32_t mOutputCount; 19025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 19125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // FIXME: not very sure how to check color standard 19225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAProcColorStandardType in_color_standards[VAProcColorStandardCount]; 19325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang VAProcColorStandardType out_color_standards[VAProcColorStandardCount]; 19425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang}; 19525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 19625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#endif //__ISVWorker_H_ 197