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