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.
949 lines
32 KiB
949 lines
32 KiB
/*-------------------------------------------------------------------------- |
|
Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. |
|
|
|
Redistribution and use in source and binary forms, with or without |
|
modification, are permitted provided that the following conditions |
|
are met: |
|
|
|
* Redistributions of source code must retain the above copyright |
|
notice, this list of conditions and the following disclaimer. |
|
* Redistributions in binary form must reproduce the above |
|
copyright notice, this list of conditions and the following |
|
disclaimer in the documentation and/or other materials provided |
|
with the distribution. |
|
* Neither the name of The Linux Foundation nor the names of its |
|
contributors may be used to endorse or promote products derived |
|
from this software without specific prior written permission. |
|
|
|
THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED |
|
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT |
|
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS |
|
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR |
|
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
|
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE |
|
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN |
|
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
--------------------------------------------------------------------------*/ |
|
#ifndef __OMX_VDPP_H__ |
|
#define __OMX_VDPP_H__ |
|
/*============================================================================ |
|
O p e n M A X Component |
|
Video Decoder |
|
|
|
*//** @file omx_vdpp.h |
|
This module contains the class definition for openMAX video post-processing component. |
|
|
|
*//*========================================================================*/ |
|
|
|
////////////////////////////////////////////////////////////////////////////// |
|
// Include Files |
|
////////////////////////////////////////////////////////////////////////////// |
|
|
|
#include <stdlib.h> |
|
#include <stdio.h> |
|
#include <string.h> |
|
#include <inttypes.h> |
|
#include <cstddef> |
|
#include <math.h> |
|
|
|
#ifdef _ANDROID_ |
|
#define LOG_TAG "OMX-VDPP" |
|
|
|
#ifdef USE_ION |
|
#include <linux/msm_ion.h> |
|
#endif |
|
#include <binder/MemoryHeapBase.h> |
|
#include <ui/ANativeObjectBase.h> |
|
extern "C"{ |
|
#include <utils/Log.h> |
|
} |
|
#include <linux/videodev2.h> |
|
#include <poll.h> |
|
#define TIMEOUT 5000 |
|
|
|
|
|
#define DEBUG_PRINT_LOW(x, ...) ALOGV("[Entry] "x, ##__VA_ARGS__) |
|
#define DEBUG_PRINT_HIGH(x, ...) ALOGV("[Step] "x, ##__VA_ARGS__) |
|
#define DEBUG_PRINT_ERROR(x, ...) ALOGE("[Error] "x, ##__VA_ARGS__) |
|
|
|
/*#define DEBUG_PRINT_LOW(x, ...) |
|
#define DEBUG_PRINT_HIGH(x, ...) |
|
#define DEBUG_PRINT_ERROR(x, ...) */ |
|
|
|
#else //_ANDROID_ |
|
#define DEBUG_PRINT_LOW printf |
|
#define DEBUG_PRINT_HIGH printf |
|
#define DEBUG_PRINT_ERROR printf |
|
#endif // _ANDROID_ |
|
|
|
#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) |
|
#include <media/hardware/HardwareAPI.h> |
|
#endif |
|
|
|
#include <unistd.h> |
|
|
|
#if defined (_ANDROID_ICS_) |
|
#include <gralloc_priv.h> |
|
#endif |
|
|
|
#include <pthread.h> |
|
#ifndef PC_DEBUG |
|
#include <semaphore.h> |
|
#endif |
|
#include "OMX_Core.h" |
|
#include "OMX_QCOMExtns.h" |
|
#include "OMX_CoreExt.h" |
|
#include "OMX_IndexExt.h" |
|
#include "qc_omx_component.h" |
|
#include <linux/android_pmem.h> |
|
#include <dlfcn.h> |
|
|
|
#include <media/msm_vpu.h> |
|
extern "C" { |
|
OMX_API void * get_omx_component_factory_fn(void); //used by qc_omx_core |
|
} |
|
|
|
#ifdef _ANDROID_ |
|
using namespace android; |
|
#endif // _ANDROID_ |
|
////////////////////////////////////////////////////////////////////////////// |
|
// Module specific globals |
|
////////////////////////////////////////////////////////////////////////////// |
|
#define OMX_SPEC_VERSION 0x00000101 |
|
|
|
// #define OUTPUT_BUFFER_LOG 1 |
|
// #define INPUT_BUFFER_LOG 1 |
|
////////////////////////////////////////////////////////////////////////////// |
|
// Macros |
|
////////////////////////////////////////////////////////////////////////////// |
|
#define PrintFrameHdr(bufHdr) DEBUG_PRINT("bufHdr %x buf %x size %d TS %d\n",\ |
|
(unsigned) bufHdr,\ |
|
(unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->pBuffer,\ |
|
(unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nFilledLen,\ |
|
(unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nTimeStamp) |
|
|
|
// BitMask Management logic |
|
#define BITS_PER_BYTE 32 |
|
#define BITMASK_SIZE(mIndex) (((mIndex) + BITS_PER_BYTE - 1)/BITS_PER_BYTE) |
|
#define BITMASK_OFFSET(mIndex) ((mIndex)/BITS_PER_BYTE) |
|
#define BITMASK_FLAG(mIndex) (1 << ((mIndex) % BITS_PER_BYTE)) |
|
#define BITMASK_CLEAR(mArray,mIndex) (mArray)[BITMASK_OFFSET(mIndex)] \ |
|
&= ~(BITMASK_FLAG(mIndex)) |
|
#define BITMASK_SET(mArray,mIndex) (mArray)[BITMASK_OFFSET(mIndex)] \ |
|
|= BITMASK_FLAG(mIndex) |
|
#define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \ |
|
& BITMASK_FLAG(mIndex)) |
|
#define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \ |
|
& BITMASK_FLAG(mIndex)) == 0x0) |
|
#define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \ |
|
& BITMASK_FLAG(mIndex)) |
|
#define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \ |
|
& BITMASK_FLAG(mIndex)) == 0x0) |
|
|
|
#define OMX_CORE_CONTROL_CMDQ_SIZE 200//100 |
|
#define OMX_CORE_QCIF_HEIGHT 144 |
|
#define OMX_CORE_QCIF_WIDTH 176 |
|
#define OMX_CORE_VGA_HEIGHT 480 |
|
#define OMX_CORE_VGA_WIDTH 640 |
|
#define OMX_CORE_WVGA_HEIGHT 480 |
|
#define OMX_CORE_WVGA_WIDTH 800 |
|
|
|
#ifdef _ANDROID_ |
|
#define MAX_NUM_INPUT_OUTPUT_BUFFERS 32 |
|
#endif |
|
|
|
#define OMX_FRAMEINFO_EXTRADATA 0x00010000 |
|
#define OMX_INTERLACE_EXTRADATA 0x00020000 |
|
#define OMX_TIMEINFO_EXTRADATA 0x00040000 |
|
#define OMX_PORTDEF_EXTRADATA 0x00080000 |
|
#define OMX_EXTNUSER_EXTRADATA 0x00100000 |
|
#define DRIVER_EXTRADATA_MASK 0x0000FFFF |
|
|
|
#define OMX_INTERLACE_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\ |
|
sizeof(OMX_STREAMINTERLACEFORMAT) + 3)&(~3)) |
|
#define OMX_FRAMEINFO_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\ |
|
sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO) + 3)&(~3)) |
|
#define OMX_PORTDEF_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\ |
|
sizeof(OMX_PARAM_PORTDEFINITIONTYPE) + 3)&(~3)) |
|
|
|
#define VALID_TS(ts) ((ts < LLONG_MAX)? true : false) |
|
|
|
/* STATUS CODES */ |
|
/* Base value for status codes */ |
|
#define VDPP_S_BASE 0x40000000 |
|
/* Success */ |
|
#define VDPP_S_SUCCESS (VDPP_S_BASE) |
|
/* General failure */ |
|
#define VDPP_S_EFAIL (VDPP_S_BASE + 1) |
|
/* Fatal irrecoverable failure. Need to tear down session. */ |
|
#define VDPP_S_EFATAL (VDPP_S_BASE + 2) |
|
/* Error detected in the passed parameters */ |
|
#define VDPP_S_EBADPARAM (VDPP_S_BASE + 3) |
|
/* Command called in invalid state. */ |
|
#define VDPP_S_EINVALSTATE (VDPP_S_BASE + 4) |
|
/* Insufficient OS resources - thread, memory etc. */ |
|
#define VDPP_S_ENOSWRES (VDPP_S_BASE + 5) |
|
/* Insufficient HW resources - core capacity maxed out. */ |
|
#define VDPP_S_ENOHWRES (VDPP_S_BASE + 6) |
|
/* Invalid command called */ |
|
#define VDPP_S_EINVALCMD (VDPP_S_BASE + 7) |
|
/* Command timeout. */ |
|
#define VDPP_S_ETIMEOUT (VDPP_S_BASE + 8) |
|
/* Pre-requirement is not met for API. */ |
|
#define VDPP_S_ENOPREREQ (VDPP_S_BASE + 9) |
|
/* Command queue is full. */ |
|
#define VDPP_S_ECMDQFULL (VDPP_S_BASE + 10) |
|
/* Command is not supported by this driver */ |
|
#define VDPP_S_ENOTSUPP (VDPP_S_BASE + 11) |
|
/* Command is not implemented by thedriver. */ |
|
#define VDPP_S_ENOTIMPL (VDPP_S_BASE + 12) |
|
/* Command is not implemented by the driver. */ |
|
#define VDPP_S_BUSY (VDPP_S_BASE + 13) |
|
#define VDPP_S_INPUT_BITSTREAM_ERR (VDPP_S_BASE + 14) |
|
|
|
#define VDPP_INTF_VER 1 |
|
#define VDPP_MSG_BASE 0x0000000 |
|
/* Codes to identify asynchronous message responses and events that driver |
|
wants to communicate to the app.*/ |
|
#define VDPP_MSG_INVALID (VDPP_MSG_BASE + 0) |
|
#define VDPP_MSG_RESP_INPUT_BUFFER_DONE (VDPP_MSG_BASE + 1) |
|
#define VDPP_MSG_RESP_OUTPUT_BUFFER_DONE (VDPP_MSG_BASE + 2) |
|
#define VDPP_MSG_RESP_INPUT_FLUSHED (VDPP_MSG_BASE + 3) |
|
#define VDPP_MSG_RESP_OUTPUT_FLUSHED (VDPP_MSG_BASE + 4) |
|
#define VDPP_MSG_RESP_FLUSH_INPUT_DONE (VDPP_MSG_BASE + 5) |
|
#define VDPP_MSG_RESP_FLUSH_OUTPUT_DONE (VDPP_MSG_BASE + 6) |
|
#define VDPP_MSG_RESP_START_DONE (VDPP_MSG_BASE + 7) |
|
#define VDPP_MSG_RESP_STOP_DONE (VDPP_MSG_BASE + 8) |
|
#define VDPP_MSG_RESP_PAUSE_DONE (VDPP_MSG_BASE + 9) |
|
#define VDPP_MSG_RESP_RESUME_DONE (VDPP_MSG_BASE + 10) |
|
#define VDPP_MSG_RESP_RESOURCE_LOADED (VDPP_MSG_BASE + 11) |
|
#define VDPP_EVT_RESOURCES_LOST (VDPP_MSG_BASE + 12) |
|
#define VDPP_MSG_EVT_CONFIG_CHANGED (VDPP_MSG_BASE + 13) |
|
#define VDPP_MSG_EVT_HW_ERROR (VDPP_MSG_BASE + 14) |
|
#define VDPP_MSG_EVT_INFO_CONFIG_CHANGED (VDPP_MSG_BASE + 15) |
|
#define VDPP_MSG_EVT_INFO_FIELD_DROPPED (VDPP_MSG_BASE + 16) |
|
|
|
#define VDPP_MSG_EVT_ACTIVE_REGION_DETECTION_STATUS (VDPP_MSG_BASE + 17) |
|
|
|
|
|
#define VP_INPUT_BUFFER_COUNT_INTERLACE 4 |
|
#define VP_OUTPUT_BUFFER_COUNT 4 |
|
|
|
#define VDPP_SESSION 1 |
|
//#define STUB_VPU 1 |
|
//#define DEFAULT_EXTRADATA (OMX_FRAMEINFO_EXTRADATA|OMX_INTERLACE_EXTRADATA) |
|
|
|
enum port_indexes |
|
{ |
|
OMX_CORE_INPUT_PORT_INDEX =0, |
|
OMX_CORE_OUTPUT_PORT_INDEX =1 |
|
}; |
|
#ifdef USE_ION |
|
struct vdpp_ion |
|
{ |
|
int ion_device_fd; |
|
struct ion_fd_data fd_ion_data; |
|
struct ion_allocation_data ion_alloc_data; |
|
}; |
|
#endif |
|
|
|
struct extradata_buffer_info { |
|
int buffer_size; |
|
char* uaddr; |
|
int count; |
|
int size; |
|
#ifdef USE_ION |
|
struct vdpp_ion ion; |
|
#endif |
|
}; |
|
|
|
struct vdpp_picsize { |
|
uint32_t frame_width; |
|
uint32_t frame_height; |
|
uint32_t stride; |
|
uint32_t scan_lines; |
|
}; |
|
|
|
enum vdpp_interlaced_format { |
|
VDPP_InterlaceFrameProgressive = 0x1, |
|
VDPP_InterlaceInterleaveFrameTopFieldFirst = 0x2, |
|
VDPP_InterlaceInterleaveFrameBottomFieldFirst = 0x4 |
|
}; |
|
|
|
enum vdpp_buffer { |
|
VDPP_BUFFER_TYPE_INPUT, |
|
VDPP_BUFFER_TYPE_OUTPUT |
|
}; |
|
|
|
struct vdpp_allocatorproperty { |
|
enum vdpp_buffer buffer_type; |
|
uint32_t mincount; |
|
uint32_t maxcount; |
|
uint32_t actualcount; |
|
size_t buffer_size; |
|
uint32_t alignment; |
|
uint32_t buf_poolid; |
|
size_t frame_size; |
|
}; |
|
|
|
struct vdpp_bufferpayload { |
|
void *bufferaddr; |
|
size_t buffer_len; |
|
int pmem_fd; |
|
size_t offset; |
|
size_t mmaped_size; |
|
}; |
|
|
|
struct vdpp_framesize { |
|
uint32_t left; |
|
uint32_t top; |
|
uint32_t right; |
|
uint32_t bottom; |
|
}; |
|
|
|
struct vdpp_setbuffer_cmd { |
|
enum vdpp_buffer buffer_type; |
|
struct vdpp_bufferpayload buffer; |
|
}; |
|
|
|
struct vdpp_output_frameinfo { |
|
void *bufferaddr; |
|
size_t offset; |
|
size_t len; |
|
uint32_t flags; |
|
int64_t time_stamp; |
|
void *client_data; |
|
struct vdpp_framesize framesize; |
|
|
|
}; |
|
|
|
union vdpp_msgdata { |
|
struct v4l2_rect ar_result; |
|
struct vdpp_output_frameinfo output_frame; |
|
void *input_frame_clientdata; |
|
}; |
|
|
|
struct vdpp_msginfo { |
|
uint32_t status_code; |
|
uint32_t msgcode; |
|
union vdpp_msgdata msgdata; |
|
size_t msgdatasize; |
|
}; |
|
|
|
struct vdpp_framerate { |
|
unsigned long fps_denominator; |
|
unsigned long fps_numerator; |
|
}; |
|
|
|
#ifdef STUB_VPU |
|
typedef struct vcap_etb_ftb_info |
|
{ |
|
int etb_cnt; // only simulate 1-to-1 |
|
__u32 etb_index; |
|
size_t etb_len; |
|
int ftb_cnt; |
|
__u32 ftb_index; |
|
size_t ftb_len; |
|
}vcap_etb_ftb_info; |
|
#endif |
|
|
|
struct video_vpu_context |
|
{ |
|
int video_vpu_fd; |
|
uint32_t output_format; |
|
enum v4l2_field interlace; |
|
struct vdpp_picsize video_resolution_input; |
|
struct vdpp_picsize video_resolution_output; |
|
struct vdpp_allocatorproperty ip_buf; |
|
struct vdpp_allocatorproperty op_buf; |
|
struct vdpp_bufferpayload *ptr_inputbuffer; |
|
struct vdpp_bufferpayload *ptr_outputbuffer; |
|
struct vdpp_output_frameinfo *ptr_respbuffer; |
|
#ifdef USE_ION |
|
struct vdpp_ion *ip_buf_ion_info; |
|
struct vdpp_ion *op_buf_ion_info; |
|
#endif |
|
struct vdpp_framerate frame_rate; |
|
bool timestamp_adjust; |
|
char kind[128]; |
|
struct extradata_buffer_info extradata_info; |
|
int input_num_planes; |
|
int output_num_planes; |
|
double input_bytesperpixel[2]; |
|
double output_bytesperpixel[2]; |
|
int sessionsSupported; |
|
int sessionAttached; |
|
#ifdef STUB_VPU |
|
bool thread_exit; |
|
vcap_etb_ftb_info etb_ftb_info; |
|
sem_t async_lock; |
|
#endif |
|
}; |
|
|
|
typedef struct _VdppExtensionData_t |
|
{ |
|
bool activeRegionDetectionDirtyFlag; |
|
QOMX_ACTIVEREGIONDETECTIONTYPE activeRegionDetection; |
|
bool activeRegionDetectionStatusDirtyFlag; |
|
QOMX_ACTIVEREGIONDETECTION_STATUSTYPE activeRegionDetectionStatus; |
|
bool scalingModeDirtyFlag; |
|
QOMX_SCALINGMODETYPE scalingMode; |
|
bool noiseReductionDirtyFlag; |
|
QOMX_NOISEREDUCTIONTYPE noiseReduction; |
|
bool imageEnhancementDirtyFlag; |
|
QOMX_IMAGEENHANCEMENTTYPE imageEnhancement; |
|
} VdppExtensionData_t; |
|
|
|
// OMX video decoder class |
|
class omx_vdpp: public qc_omx_component |
|
{ |
|
|
|
public: |
|
omx_vdpp(); // constructor |
|
virtual ~omx_vdpp(); // destructor |
|
|
|
static int async_message_process (void *context, void* message); |
|
static void process_event_cb(void *ctxt,unsigned char id); |
|
struct omx_event |
|
{ |
|
unsigned param1; |
|
unsigned param2; |
|
unsigned id; |
|
}; |
|
struct omx_cmd_queue |
|
{ |
|
omx_event m_q[OMX_CORE_CONTROL_CMDQ_SIZE]; |
|
unsigned m_read; |
|
unsigned m_write; |
|
unsigned m_size; |
|
|
|
omx_cmd_queue(); |
|
~omx_cmd_queue(); |
|
bool insert_entry(unsigned p1, unsigned p2, unsigned id); |
|
bool pop_entry(unsigned *p1,unsigned *p2, unsigned *id); |
|
// get msgtype of the first ele from the queue |
|
unsigned get_q_msg_type(); |
|
|
|
}; |
|
|
|
OMX_ERRORTYPE allocate_buffer( |
|
OMX_HANDLETYPE hComp, |
|
OMX_BUFFERHEADERTYPE **bufferHdr, |
|
OMX_U32 port, |
|
OMX_PTR appData, |
|
OMX_U32 bytes |
|
); |
|
|
|
|
|
OMX_ERRORTYPE component_deinit(OMX_HANDLETYPE hComp); |
|
|
|
OMX_ERRORTYPE component_init(OMX_STRING role); |
|
|
|
OMX_ERRORTYPE component_role_enum( |
|
OMX_HANDLETYPE hComp, |
|
OMX_U8 *role, |
|
OMX_U32 index |
|
); |
|
|
|
OMX_ERRORTYPE component_tunnel_request( |
|
OMX_HANDLETYPE hComp, |
|
OMX_U32 port, |
|
OMX_HANDLETYPE peerComponent, |
|
OMX_U32 peerPort, |
|
OMX_TUNNELSETUPTYPE *tunnelSetup |
|
); |
|
|
|
OMX_ERRORTYPE empty_this_buffer( |
|
OMX_HANDLETYPE hComp, |
|
OMX_BUFFERHEADERTYPE *buffer |
|
); |
|
|
|
|
|
|
|
OMX_ERRORTYPE fill_this_buffer( |
|
OMX_HANDLETYPE hComp, |
|
OMX_BUFFERHEADERTYPE *buffer |
|
); |
|
|
|
|
|
OMX_ERRORTYPE free_buffer( |
|
OMX_HANDLETYPE hComp, |
|
OMX_U32 port, |
|
OMX_BUFFERHEADERTYPE *buffer |
|
); |
|
|
|
OMX_ERRORTYPE get_component_version( |
|
OMX_HANDLETYPE hComp, |
|
OMX_STRING componentName, |
|
OMX_VERSIONTYPE *componentVersion, |
|
OMX_VERSIONTYPE *specVersion, |
|
OMX_UUIDTYPE *componentUUID |
|
); |
|
|
|
OMX_ERRORTYPE get_config( |
|
OMX_HANDLETYPE hComp, |
|
OMX_INDEXTYPE configIndex, |
|
OMX_PTR configData |
|
); |
|
|
|
OMX_ERRORTYPE get_extension_index( |
|
OMX_HANDLETYPE hComp, |
|
OMX_STRING paramName, |
|
OMX_INDEXTYPE *indexType |
|
); |
|
|
|
OMX_ERRORTYPE get_parameter(OMX_HANDLETYPE hComp, |
|
OMX_INDEXTYPE paramIndex, |
|
OMX_PTR paramData); |
|
|
|
OMX_ERRORTYPE get_state(OMX_HANDLETYPE hComp, |
|
OMX_STATETYPE *state); |
|
|
|
|
|
|
|
OMX_ERRORTYPE send_command(OMX_HANDLETYPE hComp, |
|
OMX_COMMANDTYPE cmd, |
|
OMX_U32 param1, |
|
OMX_PTR cmdData); |
|
|
|
|
|
OMX_ERRORTYPE set_callbacks(OMX_HANDLETYPE hComp, |
|
OMX_CALLBACKTYPE *callbacks, |
|
OMX_PTR appData); |
|
|
|
OMX_ERRORTYPE set_config(OMX_HANDLETYPE hComp, |
|
OMX_INDEXTYPE configIndex, |
|
OMX_PTR configData); |
|
|
|
OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE hComp, |
|
OMX_INDEXTYPE paramIndex, |
|
OMX_PTR paramData); |
|
|
|
OMX_ERRORTYPE use_buffer(OMX_HANDLETYPE hComp, |
|
OMX_BUFFERHEADERTYPE **bufferHdr, |
|
OMX_U32 port, |
|
OMX_PTR appData, |
|
OMX_U32 bytes, |
|
OMX_U8 *buffer); |
|
|
|
OMX_ERRORTYPE use_input_heap_buffers( |
|
OMX_HANDLETYPE hComp, |
|
OMX_BUFFERHEADERTYPE** bufferHdr, |
|
OMX_U32 port, |
|
OMX_PTR appData, |
|
OMX_U32 bytes, |
|
OMX_U8* buffer); |
|
|
|
OMX_ERRORTYPE use_input_buffers( |
|
OMX_HANDLETYPE hComp, |
|
OMX_BUFFERHEADERTYPE** bufferHdr, |
|
OMX_U32 port, |
|
OMX_PTR appData, |
|
OMX_U32 bytes, |
|
OMX_U8* buffer); |
|
|
|
OMX_ERRORTYPE use_EGL_image(OMX_HANDLETYPE hComp, |
|
OMX_BUFFERHEADERTYPE **bufferHdr, |
|
OMX_U32 port, |
|
OMX_PTR appData, |
|
void * eglImage); |
|
|
|
void complete_pending_buffer_done_cbs(); |
|
struct video_vpu_context drv_ctx; |
|
int update_resolution(uint32_t width, uint32_t height, uint32_t stride, uint32_t scan_lines); |
|
|
|
int m_pipe_in; |
|
int m_pipe_out; |
|
int m_ctrl_in; |
|
int m_ctrl_out; |
|
|
|
pthread_t msg_thread_id; |
|
pthread_t async_thread_id; |
|
omx_cmd_queue m_index_q_ftb; |
|
omx_cmd_queue m_index_q_etb; |
|
bool m_ar_callback_setup; |
|
private: |
|
// Bit Positions |
|
enum flags_bit_positions |
|
{ |
|
// Defer transition to IDLE |
|
OMX_COMPONENT_IDLE_PENDING =0x1, |
|
// Defer transition to LOADING |
|
OMX_COMPONENT_LOADING_PENDING =0x2, |
|
// First Buffer Pending |
|
OMX_COMPONENT_FIRST_BUFFER_PENDING =0x3, |
|
// Second Buffer Pending |
|
OMX_COMPONENT_SECOND_BUFFER_PENDING =0x4, |
|
// Defer transition to Enable |
|
OMX_COMPONENT_INPUT_ENABLE_PENDING =0x5, |
|
// Defer transition to Enable |
|
OMX_COMPONENT_OUTPUT_ENABLE_PENDING =0x6, |
|
// Defer transition to Disable |
|
OMX_COMPONENT_INPUT_DISABLE_PENDING =0x7, |
|
// Defer transition to Disable |
|
OMX_COMPONENT_OUTPUT_DISABLE_PENDING =0x8, |
|
//defer flush notification |
|
OMX_COMPONENT_OUTPUT_FLUSH_PENDING =0x9, |
|
OMX_COMPONENT_INPUT_FLUSH_PENDING =0xA, |
|
OMX_COMPONENT_PAUSE_PENDING =0xB, |
|
OMX_COMPONENT_EXECUTE_PENDING =0xC, |
|
OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING =0xD, |
|
OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED=0xE |
|
}; |
|
|
|
// Deferred callback identifiers |
|
enum |
|
{ |
|
//Event Callbacks from the vidpp component thread context |
|
OMX_COMPONENT_GENERATE_EVENT = 0x1, |
|
//Buffer Done callbacks from the vidpp component thread context |
|
OMX_COMPONENT_GENERATE_BUFFER_DONE = 0x2, |
|
//Frame Done callbacks from the vidpp component thread context |
|
OMX_COMPONENT_GENERATE_FRAME_DONE = 0x3, |
|
//Buffer Done callbacks from the vidpp component thread context |
|
OMX_COMPONENT_GENERATE_FTB = 0x4, |
|
//Frame Done callbacks from the vidpp component thread context |
|
OMX_COMPONENT_GENERATE_ETB = 0x5, |
|
//Command |
|
OMX_COMPONENT_GENERATE_COMMAND = 0x6, |
|
//Push-Pending Buffers |
|
OMX_COMPONENT_PUSH_PENDING_BUFS = 0x7, |
|
// Empty Buffer Done callbacks |
|
OMX_COMPONENT_GENERATE_EBD = 0x8, |
|
//Flush Event Callbacks from the vidpp component thread context |
|
OMX_COMPONENT_GENERATE_EVENT_FLUSH = 0x9, |
|
OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH = 0x0A, |
|
OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH = 0x0B, |
|
OMX_COMPONENT_GENERATE_FBD = 0xc, |
|
OMX_COMPONENT_GENERATE_START_DONE = 0xD, |
|
OMX_COMPONENT_GENERATE_PAUSE_DONE = 0xE, |
|
OMX_COMPONENT_GENERATE_RESUME_DONE = 0xF, |
|
OMX_COMPONENT_GENERATE_STOP_DONE = 0x10, |
|
OMX_COMPONENT_GENERATE_HARDWARE_ERROR = 0x11, |
|
OMX_COMPONENT_GENERATE_ETB_ARBITRARY = 0x12, |
|
OMX_COMPONENT_GENERATE_PORT_RECONFIG = 0x13, |
|
OMX_COMPONENT_GENERATE_EOS_DONE = 0x14, |
|
OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG = 0x15, |
|
OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED = 0x16, |
|
OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING = 0x17, |
|
|
|
// extensions |
|
OMX_COMPONENT_GENERATE_ACTIVE_REGION_DETECTION_STATUS = 0x18, |
|
}; |
|
|
|
enum v4l2_ports |
|
{ |
|
CAPTURE_PORT, |
|
OUTPUT_PORT, |
|
MAX_PORT |
|
}; |
|
|
|
#ifdef _ANDROID_ |
|
struct ts_entry |
|
{ |
|
OMX_TICKS timestamp; |
|
bool valid; |
|
}; |
|
|
|
struct ts_arr_list |
|
{ |
|
ts_entry m_ts_arr_list[MAX_NUM_INPUT_OUTPUT_BUFFERS]; |
|
|
|
ts_arr_list(); |
|
~ts_arr_list(); |
|
|
|
bool insert_ts(OMX_TICKS ts); |
|
bool pop_min_ts(OMX_TICKS &ts); |
|
bool reset_ts_list(); |
|
}; |
|
#endif |
|
|
|
bool allocate_done(void); |
|
bool allocate_input_done(void); |
|
bool allocate_output_done(void); |
|
|
|
OMX_ERRORTYPE free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr); |
|
OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr); |
|
void free_output_buffer_header(); |
|
void free_input_buffer_header(); |
|
|
|
OMX_ERRORTYPE allocate_input_heap_buffer(OMX_HANDLETYPE hComp, |
|
OMX_BUFFERHEADERTYPE **bufferHdr, |
|
OMX_U32 port, |
|
OMX_PTR appData, |
|
OMX_U32 bytes); |
|
|
|
OMX_ERRORTYPE allocate_input_buffer(OMX_HANDLETYPE hComp, |
|
OMX_BUFFERHEADERTYPE **bufferHdr, |
|
OMX_U32 port, |
|
OMX_PTR appData, |
|
OMX_U32 bytes); |
|
|
|
OMX_ERRORTYPE allocate_output_buffer(OMX_HANDLETYPE hComp, |
|
OMX_BUFFERHEADERTYPE **bufferHdr, |
|
OMX_U32 port,OMX_PTR appData, |
|
OMX_U32 bytes); |
|
OMX_ERRORTYPE use_output_buffer(OMX_HANDLETYPE hComp, |
|
OMX_BUFFERHEADERTYPE **bufferHdr, |
|
OMX_U32 port, |
|
OMX_PTR appData, |
|
OMX_U32 bytes, |
|
OMX_U8 *buffer); |
|
|
|
OMX_ERRORTYPE allocate_output_headers(); |
|
bool execute_omx_flush(OMX_U32); |
|
bool execute_output_flush(); |
|
bool execute_input_flush(); |
|
OMX_ERRORTYPE empty_buffer_done(OMX_HANDLETYPE hComp, |
|
OMX_BUFFERHEADERTYPE * buffer); |
|
|
|
OMX_ERRORTYPE fill_buffer_done(OMX_HANDLETYPE hComp, |
|
OMX_BUFFERHEADERTYPE * buffer); |
|
OMX_ERRORTYPE empty_this_buffer_proxy(OMX_HANDLETYPE hComp, |
|
OMX_BUFFERHEADERTYPE *buffer); |
|
|
|
OMX_ERRORTYPE fill_this_buffer_proxy(OMX_HANDLETYPE hComp, |
|
OMX_BUFFERHEADERTYPE *buffer); |
|
bool release_done(); |
|
|
|
bool release_output_done(); |
|
bool release_input_done(); |
|
OMX_ERRORTYPE get_buffer_req(vdpp_allocatorproperty *buffer_prop); |
|
OMX_ERRORTYPE set_buffer_req(vdpp_allocatorproperty *buffer_prop); |
|
OMX_ERRORTYPE start_port_reconfig(); |
|
|
|
int stream_off(OMX_U32 port); |
|
void adjust_timestamp(OMX_S64 &act_timestamp); |
|
void set_frame_rate(OMX_S64 act_timestamp); |
|
OMX_ERRORTYPE enable_extradata(OMX_U32 requested_extradata, bool enable = true); |
|
OMX_ERRORTYPE update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn); |
|
bool align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size, |
|
OMX_U32 alignment); |
|
#ifdef USE_ION |
|
int alloc_map_ion_memory(OMX_U32 buffer_size, |
|
OMX_U32 alignment, struct ion_allocation_data *alloc_data, |
|
struct ion_fd_data *fd_data,int flag); |
|
void free_ion_memory(struct vdpp_ion *buf_ion_info); |
|
#endif |
|
|
|
|
|
OMX_ERRORTYPE send_command_proxy(OMX_HANDLETYPE hComp, |
|
OMX_COMMANDTYPE cmd, |
|
OMX_U32 param1, |
|
OMX_PTR cmdData); |
|
bool post_event( unsigned int p1, |
|
unsigned int p2, |
|
unsigned int id |
|
); |
|
|
|
void setFormatParams(int pixelFormat, double bytesperpixel[], unsigned char *planesCount); |
|
|
|
int openInput(const char* inputName); |
|
|
|
/** |
|
* int clip2 - return an integer value in 2 to the nth power |
|
* legacy code from video decoder (rounded up till 256) |
|
* |
|
*/ |
|
inline int clip2(int x) |
|
{ |
|
x = x -1; |
|
x = x | x >> 1; |
|
x = x | x >> 2; |
|
x = x | x >> 4; |
|
x = x | x >> 16; |
|
x = x + 1; |
|
return x; |
|
} |
|
/** |
|
* int paddedFrameWidth - return frame width in a multiple of 128 (rounded up). |
|
* |
|
* @width - the original frame width. |
|
*/ |
|
inline int paddedFrameWidth128(int width) |
|
{ |
|
return (((width + 127) / 128 )* 128); |
|
} |
|
|
|
/** |
|
* int paddedFrameWidth32 - return frame width in a multiple of 32 (rounded up). |
|
* |
|
* @width - the original frame width. |
|
*/ |
|
inline int paddedFrameWidth32(int width) |
|
{ |
|
return (((width + 31) / 32 )* 32); |
|
} |
|
|
|
/** |
|
* int roundToNearestInt - round to nearest integer value. |
|
* |
|
* @value - the decimal value to be rounded to nearest integer. |
|
*/ |
|
inline int roundToNearestInt(double value) |
|
{ |
|
if((ceil(value) - value) > 0.5) |
|
return floor(value); |
|
else |
|
return ceil(value); |
|
} |
|
|
|
inline void omx_report_error () |
|
{ |
|
if (m_cb.EventHandler && !m_error_propogated) |
|
{ |
|
ALOGE("\nERROR: Sending OMX_EventError to Client"); |
|
m_error_propogated = true; |
|
m_cb.EventHandler(&m_cmp,m_app_data, |
|
OMX_EventError,OMX_ErrorHardware,0,NULL); |
|
} |
|
} |
|
|
|
inline void omx_report_unsupported_setting () |
|
{ |
|
if (m_cb.EventHandler && !m_error_propogated) |
|
{ |
|
DEBUG_PRINT_ERROR( |
|
"\nERROR: Sending OMX_ErrorUnsupportedSetting to Client"); |
|
m_error_propogated = true; |
|
m_cb.EventHandler(&m_cmp,m_app_data, |
|
OMX_EventError,OMX_ErrorUnsupportedSetting,0,NULL); |
|
} |
|
} |
|
|
|
#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) |
|
OMX_ERRORTYPE use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data); |
|
#endif |
|
#if defined (_ANDROID_ICS_) |
|
struct nativebuffer{ |
|
native_handle_t *nativehandle; |
|
private_handle_t *privatehandle; |
|
int inuse; |
|
}; |
|
nativebuffer native_buffer[MAX_NUM_INPUT_OUTPUT_BUFFERS]; |
|
#endif |
|
|
|
|
|
//************************************************************* |
|
//*******************MEMBER VARIABLES ************************* |
|
//************************************************************* |
|
pthread_mutex_t m_lock; |
|
//sem to handle the minimum procesing of commands |
|
sem_t m_cmd_lock; |
|
bool m_error_propogated; |
|
|
|
// OMX State |
|
OMX_STATETYPE m_state; |
|
// Application data |
|
OMX_PTR m_app_data; |
|
// Application callbacks |
|
OMX_CALLBACKTYPE m_cb; |
|
OMX_PRIORITYMGMTTYPE m_priority_mgm ; |
|
OMX_PARAM_BUFFERSUPPLIERTYPE m_buffer_supplier; |
|
// fill this buffer queue |
|
omx_cmd_queue m_ftb_q; |
|
// Command Q for rest of the events |
|
omx_cmd_queue m_cmd_q; |
|
omx_cmd_queue m_etb_q; |
|
// Input memory pointer |
|
OMX_BUFFERHEADERTYPE *m_inp_mem_ptr; |
|
// Output memory pointer |
|
OMX_BUFFERHEADERTYPE *m_out_mem_ptr; |
|
// number of input bitstream error frame count |
|
unsigned int m_inp_err_count; |
|
#ifdef _ANDROID_ |
|
// Timestamp list |
|
ts_arr_list m_timestamp_list; |
|
#endif |
|
|
|
bool input_flush_progress; |
|
bool output_flush_progress; |
|
bool input_use_buffer; |
|
bool output_use_buffer; |
|
bool ouput_egl_buffers; |
|
OMX_BOOL m_use_output_pmem; |
|
OMX_BOOL m_out_mem_region_smi; |
|
OMX_BOOL m_out_pvt_entry_pmem; |
|
|
|
int pending_input_buffers; |
|
int pending_output_buffers; |
|
|
|
int input_qbuf_count; |
|
int input_dqbuf_count; |
|
int output_qbuf_count; |
|
int output_dqbuf_count; |
|
|
|
#ifdef OUTPUT_BUFFER_LOG |
|
int output_buffer_write_counter; |
|
int input_buffer_write_counter; |
|
#endif |
|
// bitmask array size for output side |
|
unsigned int m_out_bm_count; |
|
// bitmask array size for input side |
|
unsigned int m_inp_bm_count; |
|
//Input port Populated |
|
OMX_BOOL m_inp_bPopulated; |
|
//Output port Populated |
|
OMX_BOOL m_out_bPopulated; |
|
// encapsulate the waiting states. |
|
unsigned int m_flags; |
|
|
|
// store I/P PORT state |
|
OMX_BOOL m_inp_bEnabled; |
|
// store O/P PORT state |
|
OMX_BOOL m_out_bEnabled; |
|
OMX_U32 m_in_alloc_cnt; |
|
OMX_U8 m_cRole[OMX_MAX_STRINGNAME_SIZE]; |
|
// Platform specific details |
|
OMX_QCOM_PLATFORM_PRIVATE_LIST *m_platform_list; |
|
OMX_QCOM_PLATFORM_PRIVATE_ENTRY *m_platform_entry; |
|
OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *m_pmem_info; |
|
|
|
/*Variables for arbitrary Byte parsing support*/ |
|
omx_cmd_queue m_input_pending_q; |
|
omx_cmd_queue m_input_free_q; |
|
|
|
OMX_BUFFERHEADERTYPE *psource_frame; |
|
OMX_BUFFERHEADERTYPE *pdest_frame; |
|
OMX_BUFFERHEADERTYPE *m_inp_heap_ptr; |
|
OMX_BUFFERHEADERTYPE **m_phdr_pmem_ptr; |
|
unsigned int m_heap_inp_bm_count; |
|
|
|
OMX_S64 prev_ts; |
|
bool rst_prev_ts; |
|
OMX_U32 frm_int; |
|
|
|
struct vdpp_allocatorproperty op_buf_rcnfg; |
|
bool in_reconfig; |
|
OMX_U32 client_extradata; |
|
#ifdef _ANDROID_ |
|
bool m_debug_timestamp; |
|
bool perf_flag; |
|
OMX_U32 proc_frms, latency; |
|
bool m_enable_android_native_buffers; |
|
bool m_use_android_native_buffers; |
|
bool m_debug_extradata; |
|
bool m_debug_concealedmb; |
|
#endif |
|
|
|
OMX_PARAM_PORTDEFINITIONTYPE m_port_def; |
|
|
|
int capture_capability; |
|
int output_capability; |
|
bool streaming[MAX_PORT]; |
|
OMX_CONFIG_RECTTYPE rectangle; |
|
int prev_n_filled_len; |
|
|
|
bool msg_thread_created; |
|
bool async_thread_created; |
|
|
|
unsigned int m_fill_output_msg; |
|
bool client_set_fps; |
|
bool interlace_user_flag; |
|
// OMX extensions |
|
VdppExtensionData_t mExtensionData; |
|
}; |
|
#endif // __OMX_VDPP_H__
|
|
|