/*
* 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_