Home | History | Annotate | Download | only in include
      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