1 /* 2 * Copyright (C) 2012 Intel Corporation. All rights reserved. 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 18 #ifndef __ISVWorker_H_ 19 #define __ISVWorker_H_ 20 21 #include <va/va.h> 22 #include <va/va_vpp.h> 23 #include <va/va_android.h> 24 #include <OMX_Component.h> 25 #include <utils/RefBase.h> 26 #include "isv_profile.h" 27 #include "isv_bufmanager.h" 28 29 #define ANDROID_DISPLAY_HANDLE 0x18C34078 30 #define Display unsigned int 31 32 //FIXME: copy from OMX_Core.h 33 34 /* interlaced frame flag: This flag is set to indicate the buffer contains a 35 * top and bottom field and display ordering is top field first. 36 * @ingroup buf 37 */ 38 #define OMX_BUFFERFLAG_TFF 0x00010000 39 40 /* interlaced frame flag: This flag is set to indicate the buffer contains a 41 * top and bottom field and display ordering is bottom field first. 42 * @ingroup buf 43 */ 44 #define OMX_BUFFERFLAG_BFF 0x00020000 45 46 using namespace android; 47 48 typedef enum 49 { 50 STATUS_OK = 0, 51 STATUS_NOT_SUPPORT, 52 STATUS_ALLOCATION_ERROR, 53 STATUS_ERROR, 54 STATUS_DATA_RENDERING 55 } vpp_status; 56 57 typedef enum 58 { 59 DEINTERLACE_BOB = 0, // BOB DI 60 DEINTERLACE_ADI = 1, // ADI 61 } deinterlace_t; 62 63 //Avaiable filter types 64 typedef enum 65 { 66 FILTER_HQ = 0, // high-quality filter (AVS scaling) 67 FILTER_FAST = 1, // fast filter (bilinear scaling) 68 } filter_t; 69 70 typedef struct { 71 uint32_t srcWidth; 72 uint32_t srcHeight; 73 uint32_t dstWidth; 74 uint32_t dstHeight; 75 uint32_t denoiseLevel; 76 uint32_t sharpnessLevel; 77 uint32_t colorBalanceLevel; 78 deinterlace_t deinterlaceType; 79 filter_t scalarType; 80 uint32_t frameRate; 81 uint32_t hasEncoder; 82 FRC_RATE frcRate; 83 } FilterParam; 84 85 class ISVBuffer; 86 87 class ISVWorker : public RefBase 88 { 89 90 public: 91 // config filters on or off based on video info 92 status_t configFilters(uint32_t filters, const FilterParam* filterParam); 93 94 // Initialize: setupVA()->setupFilters()->setupPipelineCaps() 95 status_t init(uint32_t width, uint32_t height); 96 status_t deinit(); 97 98 // Get output buffer number needed for processing 99 uint32_t getProcBufCount(); 100 101 // Get output buffer number needed for filling 102 uint32_t getFillBufCount(); 103 104 // Send input and output buffers to VSP to begin processing 105 status_t process(ISVBuffer* input, Vector<ISVBuffer*> output, uint32_t outputCount, bool isEOS, uint32_t flags); 106 107 // Fill output buffers given, it's a blocking call 108 status_t fill(Vector<ISVBuffer*> output, uint32_t outputCount); 109 110 // reset index 111 status_t reset(); 112 113 // set video display mode 114 void setDisplayMode(int32_t mode); 115 116 // get video display mode 117 int32_t getDisplayMode(); 118 119 // check HDMI connection status 120 bool isHdmiConnected(); 121 122 uint32_t getVppOutputFps(); 123 124 // alloc/free VA surface 125 status_t allocSurface(uint32_t* width, uint32_t* height, 126 uint32_t stride, uint32_t format, unsigned long handle, int32_t* surfaceId); 127 status_t freeSurface(int32_t* surfaceId); 128 129 ISVWorker(); 130 ~ISVWorker() {} 131 132 private: 133 // Check if VPP is supported 134 bool isSupport() const; 135 136 // Get output buffer number needed for processing 137 uint32_t getOutputBufCount(uint32_t index); 138 139 // Check filter caps and create filter buffers 140 status_t setupFilters(); 141 142 // Setup pipeline caps 143 status_t setupPipelineCaps(); 144 145 //check if the input fps is suportted in array fpsSet. 146 bool isFpsSupport(int32_t fps, int32_t *fpsSet, int32_t fpsSetCnt); 147 148 // Debug only 149 // Dump YUV frame 150 status_t dumpYUVFrameData(VASurfaceID surfaceID); 151 status_t writeNV12(int width, int height, unsigned char *out_buf, int y_pitch, int uv_pitch); 152 153 ISVWorker(const ISVWorker &); 154 ISVWorker &operator=(const ISVWorker &); 155 156 public: 157 uint32_t mNumForwardReferences; 158 159 private: 160 // VA common variables 161 VAContextID mVAContext; 162 uint32_t mWidth; 163 uint32_t mHeight; 164 Display * mDisplay; 165 VADisplay mVADisplay; 166 VAConfigID mVAConfig; 167 168 // Forward References Surfaces 169 Vector<VABufferID> mPipelineBuffers; 170 Mutex mPipelineBufferLock; // to protect access to mPipelineBuffers 171 VASurfaceID *mForwardReferences; 172 VASurfaceID mPrevInput; 173 VASurfaceID mPrevOutput; 174 175 // VPP Filters Buffers 176 uint32_t mNumFilterBuffers; 177 VABufferID mFilterBuffers[VAProcFilterCount]; 178 179 // VPP filter configuration 180 VABufferID mFilterFrc; 181 182 // VPP filter configuration 183 uint32_t mFilters; 184 FilterParam mFilterParam; 185 186 // status 187 uint32_t mInputIndex; 188 uint32_t mOutputIndex; 189 uint32_t mOutputCount; 190 191 // FIXME: not very sure how to check color standard 192 VAProcColorStandardType in_color_standards[VAProcColorStandardCount]; 193 VAProcColorStandardType out_color_standards[VAProcColorStandardCount]; 194 }; 195 196 #endif //__ISVWorker_H_ 197