You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
196 lines
5.5 KiB
196 lines
5.5 KiB
/* |
|
* 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_
|
|
|