111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*-------------------------------------------------------------------------- 22e1e93b75bc282dafdff24eb3b473af177e3e35bThierry StrudelCopyright (c) 2010-2017, Linux Foundation. All rights reserved. 311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRedistribution and use in source and binary forms, with or without 511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelmodification, are permitted provided that the following conditions are met: 611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Redistributions of source code must retain the above copyright 711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel notice, this list of conditions and the following disclaimer. 811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Redistributions in binary form must reproduce the above copyright 911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel notice, this list of conditions and the following disclaimer in the 1011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel documentation and/or other materials provided with the distribution. 1111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Neither the name of The Linux Foundation nor 1211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel the names of its contributors may be used to endorse or promote 1311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel products derived from this software without specific prior written 1411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel permission. 1511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 1711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelIMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 1911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelNON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 2011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 2111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 2211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 2311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 2511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 2611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel--------------------------------------------------------------------------*/ 2811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*============================================================================ 2911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel O p e n M A X w r a p p e r s 3011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel O p e n M A X C o r e 3111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 3211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel*//** @file omx_video_base.cpp 3311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel This module contains the implementation of the OpenMAX core & component. 3411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 3511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel*//*========================================================================*/ 3611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 3711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel////////////////////////////////////////////////////////////////////////////// 3811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// Include Files 3911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel////////////////////////////////////////////////////////////////////////////// 4011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 4111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define __STDC_FORMAT_MACROS //enables the format specifiers in inttypes.h 4211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <inttypes.h> 4311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <string.h> 4411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "omx_video_base.h" 4511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <stdlib.h> 4611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <errno.h> 4711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <fcntl.h> 4811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <unistd.h> 4911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <sys/prctl.h> 50b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel#include <sys/ioctl.h> 5111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ICS_ 5211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <media/hardware/HardwareAPI.h> 5311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <gralloc_priv.h> 5411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 55b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel#ifdef _USE_GLIB_ 5611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <glib.h> 5711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define strlcpy g_strlcpy 5811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 5911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define H264_SUPPORTED_WIDTH (480) 6011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define H264_SUPPORTED_HEIGHT (368) 6111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 6211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MPEG4_SUPPORTED_WIDTH (480) 6311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MPEG4_SUPPORTED_HEIGHT (368) 6411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 6511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_SP_MP_START_CODE 0xC5000000 6611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_SP_MP_START_CODE_MASK 0xFF000000 6711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_AP_START_CODE 0x00000100 6811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_AP_START_CODE_MASK 0xFFFFFF00 6911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_STRUCT_C_PROFILE_MASK 0xF0 7011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_STRUCT_B_LEVEL_MASK 0xE0000000 7111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_SIMPLE_PROFILE 0 7211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_MAIN_PROFILE 1 7311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_ADVANCE_PROFILE 3 7411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_SIMPLE_PROFILE_LOW_LEVEL 0 7511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_SIMPLE_PROFILE_MED_LEVEL 2 7611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_STRUCT_C_LEN 4 7711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_STRUCT_C_POS 8 7811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_STRUCT_A_POS 12 7911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_STRUCT_B_POS 24 8011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VC1_SEQ_LAYER_SIZE 36 8111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 8211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SZ_4K 0x1000 8311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SZ_1M 0x100000 842601808ee2992a94c325d05e4065aba60b01840bThierry Strudel#define ALIGN(x, to_align) ((((unsigned long) x) + (to_align - 1)) & ~(to_align - 1)) 8511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 8611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef ION_FLAG_CP_BITSTREAM 8711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define ION_FLAG_CP_BITSTREAM 0 8811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 8911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 9011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef ION_FLAG_CP_PIXEL 9111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define ION_FLAG_CP_PIXEL 0 9211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 9311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 9411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#undef MEM_HEAP_ID 9511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 9611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef MASTER_SIDE_CP 9711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 9811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MEM_HEAP_ID ION_SECURE_HEAP_ID 9911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SECURE_ALIGN SZ_4K 10011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SECURE_FLAGS_INPUT_BUFFER (ION_SECURE | ION_FLAG_CP_PIXEL) 10111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SECURE_FLAGS_OUTPUT_BUFFER (ION_SECURE | ION_FLAG_CP_BITSTREAM) 10211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 10311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else //SLAVE_SIDE_CP 10411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 10511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MEM_HEAP_ID ION_CP_MM_HEAP_ID 10611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SECURE_ALIGN SZ_1M 10711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SECURE_FLAGS_INPUT_BUFFER ION_SECURE 10811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SECURE_FLAGS_OUTPUT_BUFFER ION_SECURE 10911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 11011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 11111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 11211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudeltypedef struct OMXComponentCapabilityFlagsType { 11311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ////////////////// OMX COMPONENT CAPABILITY RELATED MEMBERS 11411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 nSize; 11511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VERSIONTYPE nVersion; 11611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BOOL iIsOMXComponentMultiThreaded; 11711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BOOL iOMXComponentSupportsExternalOutputBufferAlloc; 11811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BOOL iOMXComponentSupportsExternalInputBufferAlloc; 11911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BOOL iOMXComponentSupportsMovableInputBuffers; 12011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BOOL iOMXComponentSupportsPartialFrames; 12111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BOOL iOMXComponentUsesNALStartCodes; 12211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BOOL iOMXComponentCanHandleIncompleteFrames; 12311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BOOL iOMXComponentUsesFullAVCFrames; 12411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 12511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} OMXComponentCapabilityFlagsType; 12611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_COMPONENT_CAPABILITY_TYPE_INDEX 0xFF7A347 12711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 12811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid* message_thread_enc(void *input) 12911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 13011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_video* omx = reinterpret_cast<omx_video*>(input); 13111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned char id; 13211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int n; 13311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 13411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd_set readFds; 13511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int res = 0; 13611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct timeval tv; 13711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 13811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("omx_venc: message thread start"); 13911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prctl(PR_SET_NAME, (unsigned long)"VideoEncMsgThread", 0, 0, 0); 14011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (!omx->msg_thread_stop) { 14111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 14211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel tv.tv_sec = 2; 14311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel tv.tv_usec = 0; 14411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 14511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FD_ZERO(&readFds); 14611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FD_SET(omx->m_pipe_in, &readFds); 14711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 14811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel res = select(omx->m_pipe_in + 1, &readFds, NULL, NULL, &tv); 14911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (res < 0) { 15011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("select() ERROR: %s", strerror(errno)); 15111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel continue; 15211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (res == 0 /*timeout*/ || omx->msg_thread_stop) { 15311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel continue; 15411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 15511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 15611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel n = read(omx->m_pipe_in, &id, 1); 15711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (0 == n) { 15811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 15911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 16011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 16111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (1 == n) { 16211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->process_event_cb(omx, id); 16311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 16411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef QLE_BUILD 16511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (n < 0) break; 16611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 16711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((n < 0) && (errno != EINTR)) { 16811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("ERROR: read from pipe failed, ret %d errno %d", n, errno); 16911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 17011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 17111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 17211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 17311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("omx_venc: message thread stop"); 17411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 0; 17511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 17611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 17711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid post_message(omx_video *omx, unsigned char id) 17811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 17911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_venc: post_message %d", id); 18011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ret_value; 18111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret_value = write(omx->m_pipe_out, &id, 1); 18211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret_value <= 0) { 18311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("post_message to pipe failed : %s", strerror(errno)); 18411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 18511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("post_message to pipe done %d",ret_value); 18611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 18711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 18811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 18911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// omx_cmd_queue destructor 19011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_video::omx_cmd_queue::~omx_cmd_queue() 19111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 19211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Nothing to do 19311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 19411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 19511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// omx cmd queue constructor 19611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_video::omx_cmd_queue::omx_cmd_queue(): m_read(0),m_write(0),m_size(0) 19711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 19811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(m_q,0,sizeof(omx_event)*OMX_CORE_CONTROL_CMDQ_SIZE); 19911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 20011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 20111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// omx cmd queue insert 20211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_video::omx_cmd_queue::insert_entry(unsigned long p1, unsigned long p2, unsigned long id) 20311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 20411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool ret = true; 20511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_size < OMX_CORE_CONTROL_CMDQ_SIZE) { 20611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_q[m_write].id = id; 20711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_q[m_write].param1 = p1; 20811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_q[m_write].param2 = p2; 20911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_write++; 21011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_size ++; 21111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_write >= OMX_CORE_CONTROL_CMDQ_SIZE) { 21211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_write = 0; 21311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 21411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 21511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = false; 21611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR!!! Command Queue Full"); 21711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 21811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 21911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 22011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 22111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// omx cmd queue pop 22211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_video::omx_cmd_queue::pop_entry(unsigned long *p1, unsigned long *p2, unsigned long *id) 22311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 22411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool ret = true; 22511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_size > 0) { 22611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *id = m_q[m_read].id; 22711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *p1 = m_q[m_read].param1; 22811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *p2 = m_q[m_read].param2; 22911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Move the read pointer ahead 23011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ++m_read; 23111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel --m_size; 23211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_read >= OMX_CORE_CONTROL_CMDQ_SIZE) { 23311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_read = 0; 23411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 23511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 23611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = false; 23711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 23811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 23911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 24011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 24111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// Retrieve the first mesg type in the queue 24211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelunsigned omx_video::omx_cmd_queue::get_q_msg_type() 24311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 24411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return m_q[m_read].id; 24511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 24611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 24711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 24811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 24911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 25011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_venc::omx_venc 25111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 25211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 25311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Constructor 25411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 25511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 25611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None 25711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 25811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 25911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 26011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 26111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_video::omx_video(): 26211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel c2d_opened(false), 26311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame(NULL), 26411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame(NULL), 26511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel secure_session(false), 26611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mEmptyEosBuffer(NULL), 26711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pipe_in(-1), 26811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pipe_out(-1), 26911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_pmem(NULL), 27011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_pmem(NULL), 27111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 27211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_ion(NULL), 27311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_ion(NULL), 27411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 27511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_error_propogated(false), 27611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state(OMX_StateInvalid), 27711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_app_data(NULL), 27811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_use_input_pmem(OMX_FALSE), 27911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_use_output_pmem(OMX_FALSE), 28011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sExtraData(0), 28111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_input_msg_id(OMX_COMPONENT_GENERATE_ETB), 28211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_mem_ptr(NULL), 28311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr(NULL), 28411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_flush_progress (false), 28511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_flush_progress (false), 28611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_use_buffer (false), 28711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_use_buffer (false), 28811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_input_buffers(0), 28911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_output_buffers(0), 290e885df20a0031ad020a06a796f7c7b33ceec437eSanthosh Behara allocate_native_handle(false), 29111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_bm_count(0), 292b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara m_client_out_bm_count(0), 293b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara m_client_in_bm_count(0), 29411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_bm_count(0), 29511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_flags(0), 29611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_etb_count(0), 29711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_fbd_count(0), 29811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_event_port_settings_sent(false), 29911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel hw_overload(false), 300b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara m_graphicbuffer_size(0), 301b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara m_buffer_freed(0) 30211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 30311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("omx_video(): Inside Constructor()"); 30411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_cmp,0,sizeof(m_cmp)); 30511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_pCallbacks,0,sizeof(m_pCallbacks)); 30611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_thread_created = false; 30711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel msg_thread_created = false; 30811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel msg_thread_stop = false; 30911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 31011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INIT_STRUCT(&m_blurInfo, OMX_QTI_VIDEO_CONFIG_BLURINFO); 31111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_blurInfo.nPortIndex == (OMX_U32)PORT_INDEX_IN; 31211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 31311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mUsesColorConversion = false; 31411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_init(&m_lock, NULL); 31511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_init(×tamp.m_lock, NULL); 31611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel timestamp.is_buffer_pending = false; 31711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_init(&m_cmd_lock,0,0); 31811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("meta_buffer_hdr = %p", meta_buffer_hdr); 31911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 32011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(m_platform, 0, sizeof(m_platform)); 32111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 32211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char platform_name[PROPERTY_VALUE_MAX] = {0}; 32311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("ro.board.platform", platform_name, "0"); 32411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy(m_platform, platform_name, sizeof(m_platform)); 32511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 326b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara 327b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara pthread_mutex_init(&m_buf_lock, NULL); 32811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 32911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 33011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 33111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 33211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 33311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_venc::~omx_venc 33411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 33511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 33611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Destructor 33711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 33811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 33911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None 34011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 34111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 34211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 34311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 34411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_video::~omx_video() 34511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 34611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("~omx_video(): Inside Destructor()"); 34711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (msg_thread_created) { 34811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel msg_thread_stop = true; 34911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_message(this, OMX_COMPONENT_CLOSE_MSG); 35011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("omx_video: Waiting on Msg Thread exit"); 35111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_join(msg_thread_id,NULL); 35211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 35311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(m_pipe_in); 35411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(m_pipe_out); 35511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pipe_in = -1; 35611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pipe_out = -1; 35711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("omx_video: Waiting on Async Thread exit"); 35811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*For V4L2 based drivers, pthread_join is done in device_close 35911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * so no need to do it here*/ 36011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef _MSM8974_ 36111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (async_thread_created) 36211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_join(async_thread_id,NULL); 36311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 36411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_destroy(&m_lock); 36511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_destroy(×tamp.m_lock); 36611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_destroy(&m_cmd_lock); 36711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("m_etb_count = %" PRIu64 ", m_fbd_count = %" PRIu64, m_etb_count, 36811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_fbd_count); 369b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara 370b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara pthread_mutex_destroy(&m_buf_lock); 37111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("omx_video: Destructor exit"); 37211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Exiting OMX Video Encoder ..."); 37311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 37411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 37511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 37611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 37711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_venc::OMXCntrlProcessMsgCb 37811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 37911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 38011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel IL Client callbacks are generated through this routine. The decoder 38111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel provides the thread context for this routine. 38211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 38311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 38411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctxt -- Context information related to the self. 38511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel id -- Event identifier. This could be any of the following: 38611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1. Command completion event 38711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 2. Buffer done callback event 38811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 3. Frame done callback event 38911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 39011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 39111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 39211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 39311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 39411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_video::process_event_cb(void *ctxt, unsigned char id) 39511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 39611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long p1; // Parameter - 1 39711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long p2; // Parameter - 2 39811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long ident; 39911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned qsize=0; // qsize 40011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_video *pThis = (omx_video *) ctxt; 40111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 40211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!pThis) { 40311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:ProcessMsgCb:Context is incorrect; bailing out"); 40411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 40511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 40611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 40711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Protect the shared queue data structure 40811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel do { 40911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Read the message id's from the queue*/ 41011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 41111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&pThis->m_lock); 41211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel qsize = pThis->m_cmd_q.m_size; 41311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (qsize) { 41411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_cmd_q.pop_entry(&p1,&p2,&ident); 41511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 41611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 41711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (qsize == 0) { 41811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel qsize = pThis->m_ftb_q.m_size; 41911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (qsize) { 42011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_ftb_q.pop_entry(&p1,&p2,&ident); 42111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 42211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 42311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 42411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (qsize == 0) { 42511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel qsize = pThis->m_etb_q.m_size; 42611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (qsize) { 42711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_etb_q.pop_entry(&p1,&p2,&ident); 42811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 42911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 43011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 43111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&pThis->m_lock); 43211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 43311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*process message if we have one*/ 43411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (qsize > 0) { 43511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel id = ident; 43611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (id) { 43711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_EVENT: 43811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_pCallbacks.EventHandler) { 43911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (p1) { 44011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_CommandStateSet: 44111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_state = (OMX_STATETYPE) p2; 44211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Process -> state set to %d", pThis->m_state); 443b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara if (pThis->m_state == OMX_StateLoaded) { 444b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara m_buffer_freed = false; 445b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara } 44611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data, 44711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete, p1, p2, NULL); 44811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 44911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 45011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_EventError: 45111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: OMX_EventError: p2 = %lu", p2); 45211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p2 == (unsigned)OMX_ErrorHardware) { 45311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data, 45411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventError,OMX_ErrorHardware,0,NULL); 45511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 45611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data, 45711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventError, p2, 0, 0); 45811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 45911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 46011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 46111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 46211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_CommandPortDisable: 46311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Process -> Port %lu set to PORT_STATE_DISABLED" \ 46411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "state", p2); 46511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data, 46611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete, p1, p2, NULL ); 46711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 46811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_CommandPortEnable: 46911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Process ->Port %lu set PORT_STATE_ENABLED state" \ 47011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel , p2); 47111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data,\ 47211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete, p1, p2, NULL ); 47311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 47411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 47511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 47611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("process_event_cb forwarding EventCmdComplete %lu", p1); 47711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data, 47811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete, p1, p2, NULL ); 47911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 48011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 48111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 48211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 48311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: ProcessMsgCb NULL callbacks"); 48411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 48511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 48611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_ETB_OPQ: 48711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_ETB_OPQ"); 48811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->empty_this_buffer_opaque((OMX_HANDLETYPE)p1,\ 48911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) { 49011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: ETBProxy() failed!"); 49111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 49211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 49311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 49411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_ETB: { 49511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE iret; 49611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_ETB"); 49711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel iret = pThis->empty_this_buffer_proxy((OMX_HANDLETYPE)p1, (OMX_BUFFERHEADERTYPE *)p2); 49811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (iret == OMX_ErrorInsufficientResources) { 49911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("empty_this_buffer_proxy failure due to HW overload"); 50011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_hw_overload (); 50111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (iret != OMX_ErrorNone) { 50211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("empty_this_buffer_proxy failure"); 50311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 50411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 50511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 50611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 50711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 50811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_FTB: 50911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( pThis->fill_this_buffer_proxy((OMX_HANDLETYPE)p1,\ 51011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *)p2) != OMX_ErrorNone) { 51111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: FTBProxy() failed!"); 51211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 51311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 51411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 51511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 51611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_COMMAND: 51711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->send_command_proxy(&pThis->m_cmp,(OMX_COMMANDTYPE)p1,\ 51811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_U32)p2,(OMX_PTR)NULL); 51911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 52011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 52111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_EBD: 52211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( pThis->empty_buffer_done(&pThis->m_cmp, 52311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) { 52411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: empty_buffer_done() failed!"); 52511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 52611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 52711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 52811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 52911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_FBD: 53011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( pThis->fill_buffer_done(&pThis->m_cmp, 53111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) { 53211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: fill_buffer_done() failed!"); 53311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 53411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 53511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 53611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 53711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH: 53811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 53911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->input_flush_progress = false; 54011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("m_etb_count at i/p flush = %" PRIu64, m_etb_count); 54111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_etb_count = 0; 54211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_pCallbacks.EventHandler) { 54311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Check if we need generate event for Flush done*/ 54411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&pThis->m_flags, 54511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_INPUT_FLUSH_PENDING)) { 54611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_INPUT_FLUSH_PENDING); 54711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data, 54811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete,OMX_CommandFlush, 54911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PORT_INDEX_IN,NULL ); 55011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (BITMASK_PRESENT(&pThis->m_flags, 55111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_IDLE_PENDING)) { 55211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!pThis->output_flush_progress) { 55311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("dev_stop called after input flush complete"); 55411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dev_stop() != 0) { 55511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: dev_stop() failed in i/p flush!"); 55611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 55711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 55811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 55911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 56011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 56111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 56211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 56311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 56411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH: 56511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 56611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->output_flush_progress = false; 56711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("m_fbd_count at o/p flush = %" PRIu64, m_fbd_count); 56811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_fbd_count = 0; 56911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_pCallbacks.EventHandler) { 57011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Check if we need generate event for Flush done*/ 57111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&pThis->m_flags, 57211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_OUTPUT_FLUSH_PENDING)) { 57311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR (&pThis->m_flags,OMX_COMPONENT_OUTPUT_FLUSH_PENDING); 57411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 57511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data, 57611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete,OMX_CommandFlush, 57711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PORT_INDEX_OUT,NULL ); 57811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (BITMASK_PRESENT(&pThis->m_flags ,OMX_COMPONENT_IDLE_PENDING)) { 57911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("dev_stop called after Output flush complete"); 58011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!pThis->input_flush_progress) { 58111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dev_stop() != 0) { 58211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: dev_stop() failed in o/p flush!"); 58311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 58411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 58511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 58611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 58711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 58811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 58911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 59011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_START_DONE: 59111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_START_DONE msg"); 59211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 59311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_pCallbacks.EventHandler) { 59411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_START_DONE Success"); 59511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) { 59611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_START_DONE Move to \ 59711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel executing"); 59811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Send the callback now 59911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING); 60011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_state = OMX_StateExecuting; 60111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data, 60211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete,OMX_CommandStateSet, 60311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_StateExecuting, NULL); 60411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (BITMASK_PRESENT(&pThis->m_flags, 60511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_PAUSE_PENDING)) { 60611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dev_pause()) { 60711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: dev_pause() failed in Start Done!"); 60811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 60911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 61011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (BITMASK_PRESENT(&pThis->m_flags, 61111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_LOADED_START_PENDING)) { 61211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dev_loaded_start_done()) { 61311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("successful loaded Start Done!"); 61411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 61511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: failed in loaded Start Done!"); 61611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 61711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 61811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_LOADED_START_PENDING); 61911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 62011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("ERROR: unknown flags=%" PRIx64, pThis->m_flags); 62111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 62211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 62311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Event Handler callback is NULL"); 62411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 62511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 62611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 62711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_PAUSE_DONE: 62811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_PAUSE_DONE msg"); 62911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_pCallbacks.EventHandler) { 63011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_PAUSE_PENDING)) { 63111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //Send the callback now 63211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->complete_pending_buffer_done_cbs(); 63311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("omx_video::process_event_cb() Sending PAUSE complete after all pending EBD/FBD"); 63411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_PAUSE_PENDING); 63511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_state = OMX_StatePause; 63611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data, 63711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete,OMX_CommandStateSet, 63811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_StatePause, NULL); 63911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 64011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 64111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 64211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 64311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 64411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_RESUME_DONE: 64511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_RESUME_DONE msg"); 64611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_pCallbacks.EventHandler) { 64711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_EXECUTE_PENDING)) { 64811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Send the callback now 64911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_EXECUTE_PENDING); 65011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_state = OMX_StateExecuting; 65111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_pCallbacks.EventHandler(&pThis->m_cmp, pThis->m_app_data, 65211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete,OMX_CommandStateSet, 65311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_StateExecuting,NULL); 65411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 65511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 65611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 65711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 65811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 65911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_STOP_DONE: 66011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMX_COMPONENT_GENERATE_STOP_DONE msg"); 66111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_pCallbacks.EventHandler) { 66211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->complete_pending_buffer_done_cbs(); 66311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&pThis->m_flags,OMX_COMPONENT_IDLE_PENDING)) { 66411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Send the callback now 66511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_IDLE_PENDING); 66611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_state = OMX_StateIdle; 66711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_pCallbacks.EventHandler(&pThis->m_cmp,pThis->m_app_data, 66811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete,OMX_CommandStateSet, 66911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_StateIdle,NULL); 67011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (BITMASK_PRESENT(&pThis->m_flags, 67111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_LOADED_STOP_PENDING)) { 67211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dev_loaded_stop_done()) { 67311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("successful loaded Stop Done!"); 67411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 67511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: failed in loaded Stop Done!"); 67611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 67711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 67811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&pThis->m_flags),OMX_COMPONENT_LOADED_STOP_PENDING); 67911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 68011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("ERROR: unknown flags=%" PRIx64, pThis->m_flags); 68111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 68211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 68311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 68411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 68511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 68611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_HARDWARE_ERROR: 68711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: OMX_COMPONENT_GENERATE_HARDWARE_ERROR!"); 68811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_error (); 68911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 69011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef _MSM8974_ 69111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_LTRUSE_FAILED: 69211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: OMX_COMPONENT_GENERATE_LTRUSE_FAILED!"); 69311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pThis->m_pCallbacks.EventHandler) { 69411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Sending QOMX_ErrorLTRUseFailed, p2 = 0x%x", p2); 69511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_pCallbacks.EventHandler( 69611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &pThis->m_cmp, pThis->m_app_data, 69711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventError, QOMX_ErrorLTRUseFailed, NULL, NULL); 69811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 69911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 70011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 70111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING: 70211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING"); 70311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_unsupported_setting(); 70411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 70511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 70611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD: 70711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD"); 70811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->omx_report_hw_overload(); 70911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 71011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 71111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 71211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("process_event_cb unknown msg id 0x%02x", id); 71311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 71411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 71511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 71611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 71711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&pThis->m_lock); 71811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel qsize = pThis->m_cmd_q.m_size + pThis->m_ftb_q.m_size +\ 71911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pThis->m_etb_q.m_size; 72011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 72111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&pThis->m_lock); 72211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 72311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } while (qsize>0); 72411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("exited the while loop"); 72511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 72611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 72711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 72811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 72911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 73011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 73111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 73211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 73311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_venc::GetComponentVersion 73411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 73511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 73611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Returns the component version. 73711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 73811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 73911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel TBD. 74011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 74111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 74211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ErrorNone. 74311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 74411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 74511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_video::get_component_version 74611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel( 74711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE hComp, 74811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_STRING componentName, 74911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_VERSIONTYPE* componentVersion, 75011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_VERSIONTYPE* specVersion, 75111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_UUIDTYPE* componentUUID 75211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ) 75311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 75411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void)hComp; 75511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void)componentName; 75611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void)componentVersion; 75711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void)componentUUID; 75811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) { 75911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Get Comp Version in Invalid State"); 76011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 76111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 76211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* TBD -- Return the proper version */ 76311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (specVersion) { 76411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel specVersion->nVersion = OMX_SPEC_VERSION; 76511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 76611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 76711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 76811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 76911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 77011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_venc::SendCommand 77111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 77211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 77311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Returns zero if all the buffers released.. 77411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 77511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 77611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 77711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 77811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 77911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 78011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 78111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 78211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_video::send_command(OMX_IN OMX_HANDLETYPE hComp, 78311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_COMMANDTYPE cmd, 78411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 param1, 78511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR cmdData 78611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ) 78711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 78811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void)hComp; 78911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) { 79011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Send Command in Invalid State"); 79111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 79211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 79311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 79411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (cmd == OMX_CommandFlush || cmd == OMX_CommandPortDisable || cmd == OMX_CommandPortEnable) { 79511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((param1 != (OMX_U32)PORT_INDEX_IN) && (param1 != (OMX_U32)PORT_INDEX_OUT) && (param1 != (OMX_U32)PORT_INDEX_BOTH)) { 79611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: omx_video::send_command-->bad port index"); 79711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadPortIndex; 79811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 79911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 80011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (cmd == OMX_CommandMarkBuffer) { 80111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (param1 != PORT_INDEX_IN) { 80211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: omx_video::send_command-->bad port index"); 80311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadPortIndex; 80411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 80511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!cmdData) { 80611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: omx_video::send_command-->param is null"); 80711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 80811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 80911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 81011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 81111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event((unsigned long)cmd,(unsigned long)param1,OMX_COMPONENT_GENERATE_COMMAND); 81211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_wait(&m_cmd_lock); 81311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 81411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 81511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 81611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 81711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 81811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_venc::SendCommand 81911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 82011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 82111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Returns zero if all the buffers released.. 82211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 82311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 82411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 82511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 82611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 82711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 82811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 82911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 83011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_video::send_command_proxy(OMX_IN OMX_HANDLETYPE hComp, 83111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_COMMANDTYPE cmd, 83211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 param1, 83311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR cmdData 83411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ) 83511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 83611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void)hComp; 83711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void)cmdData; 83811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 83911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 84011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_STATETYPE eState = (OMX_STATETYPE) param1; 84111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int bFlag = 1; 84211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 84311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (cmd == OMX_CommandStateSet) { 84411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /***************************/ 84511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Current State is Loaded */ 84611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /***************************/ 84711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateLoaded) { 84811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eState == OMX_StateIdle) { 84911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //if all buffers are allocated or all ports disabled 85011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (allocate_done() || 85111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ( m_sInPortDef.bEnabled == OMX_FALSE && m_sOutPortDef.bEnabled == OMX_FALSE)) { 85211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMXCORE-SM: Loaded-->Idle"); 85311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 85411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMXCORE-SM: Loaded-->Idle-Pending"); 85511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_IDLE_PENDING); 85611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Skip the event notification 85711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 85811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 85911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 86011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Loaded to Loaded */ 86111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateLoaded) { 86211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Loaded-->Loaded"); 86311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorSameState,\ 86411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 86511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorSameState; 86611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 86711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Loaded to WaitForResources */ 86811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateWaitForResources) { 86911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Since error is None , we will post an event 87011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel at the end of this function definition */ 87111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMXCORE-SM: Loaded-->WaitForResources"); 87211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 87311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Loaded to Executing */ 87411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateExecuting) { 87511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Loaded-->Executing"); 87611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 87711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 87811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 87911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 88011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Loaded to Pause */ 88111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StatePause) { 88211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Loaded-->Pause"); 88311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 88411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 88511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 88611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 88711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Loaded to Invalid */ 88811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateInvalid) { 88911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Loaded-->Invalid"); 89011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 89111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidState; 89211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 89311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Loaded-->%d Not Handled",\ 89411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eState); 89511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 89611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 89711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 89811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 89911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /***************************/ 90011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Current State is IDLE */ 90111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /***************************/ 90211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_state == OMX_StateIdle) { 90311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eState == OMX_StateLoaded) { 90411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (release_done()) { 90511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* 90611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Since error is None , we will post an event at the end 90711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel of this function definition 90811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 90911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMXCORE-SM: Idle-->Loaded"); 91011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dev_stop() != 0) { 91111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: dev_stop() failed at Idle --> Loaded"); 91211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorHardware; 91311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 91411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 91511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMXCORE-SM: Idle-->Loaded-Pending"); 91611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_LOADING_PENDING); 91711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Skip the event notification 91811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 91911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 92011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 92111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Idle to Executing */ 92211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateExecuting) { 92311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( dev_start() ) { 92411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: dev_start() failed in SCP on Idle --> Exe"); 92511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_report_error (); 92611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorHardware; 92711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 92811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags,OMX_COMPONENT_EXECUTE_PENDING); 92911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMXCORE-SM: Idle-->Executing"); 93011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 93111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 93211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 93311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dev_start_done(); 93411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 93511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Idle to Idle */ 93611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateIdle) { 93711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Idle-->Idle"); 93811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorSameState,\ 93911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 94011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorSameState; 94111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 94211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Idle to WaitForResources */ 94311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateWaitForResources) { 94411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Idle-->WaitForResources"); 94511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 94611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 94711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 94811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 94911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Idle to Pause */ 95011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StatePause) { 95111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*To pause the Video core we need to start the driver*/ 95211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( dev_start() ) { 95311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: dev_start() failed in SCP on Idle --> Pause"); 95411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_report_error (); 95511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorHardware; 95611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 95711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING); 95811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMXCORE-SM: Idle-->Pause"); 95911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 96011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 96111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 96211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Idle to Invalid */ 96311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateInvalid) { 96411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Idle-->Invalid"); 96511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 96611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidState; 96711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 96811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Idle --> %d Not Handled",eState); 96911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 97011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 97111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 97211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 97311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /******************************/ 97411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Current State is Executing */ 97511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /******************************/ 97611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_state == OMX_StateExecuting) { 97711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Executing to Idle */ 97811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eState == OMX_StateIdle) { 97911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Since error is None , we will post an event 98011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel at the end of this function definition 98111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 98211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMXCORE-SM: Executing --> Idle"); 98311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //here this should be Pause-Idle pending and should be cleared when flush is complete and change the state to Idle 98411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING); 98511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel execute_omx_flush(OMX_ALL); 98611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 98711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 98811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Executing to Paused */ 98911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StatePause) { 99011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 99111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dev_pause()) { 99211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: dev_pause() failed in SCP on Exe --> Pause"); 99311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorHardware,\ 99411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 99511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorHardware; 99611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 99711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags,OMX_COMPONENT_PAUSE_PENDING); 99811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMXCORE-SM: Executing-->Pause"); 99911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 100011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 100111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 100211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Executing to Loaded */ 100311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateLoaded) { 100411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Executing --> Loaded"); 100511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 100611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 100711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 100811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 100911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Executing to WaitForResources */ 101011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateWaitForResources) { 101111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Executing --> WaitForResources"); 101211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 101311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 101411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 101511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 101611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Executing to Executing */ 101711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateExecuting) { 101811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Executing --> Executing"); 101911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorSameState,\ 102011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 102111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorSameState; 102211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 102311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Executing to Invalid */ 102411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateInvalid) { 102511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Executing --> Invalid"); 102611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 102711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidState; 102811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 102911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Executing --> %d Not Handled",eState); 103011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 103111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 103211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 103311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /***************************/ 103411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Current State is Pause */ 103511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /***************************/ 103611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_state == OMX_StatePause) { 103711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Pause to Executing */ 103811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eState == OMX_StateExecuting) { 103911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Pause --> Executing"); 104011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( dev_resume() ) { 104111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorHardware,\ 104211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 104311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorHardware; 104411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 104511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags,OMX_COMPONENT_EXECUTE_PENDING); 104611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMXCORE-SM: Pause-->Executing"); 104711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event (0, 0, OMX_COMPONENT_GENERATE_RESUME_DONE); 104811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 104911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 105011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 105111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Pause to Idle */ 105211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateIdle) { 105311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Since error is None , we will post an event 105411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel at the end of this function definition */ 105511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Pause --> Idle"); 105611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING); 105711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel execute_omx_flush(OMX_ALL); 105811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 105911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 106011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Pause to loaded */ 106111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateLoaded) { 106211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Pause --> loaded"); 106311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 106411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 106511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 106611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 106711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Pause to WaitForResources */ 106811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateWaitForResources) { 106911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Pause --> WaitForResources"); 107011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 107111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 107211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 107311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 107411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Pause to Pause */ 107511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StatePause) { 107611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Pause --> Pause"); 107711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorSameState,\ 107811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 107911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorSameState; 108011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 108111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from Pause to Invalid */ 108211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateInvalid) { 108311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Pause --> Invalid"); 108411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 108511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidState; 108611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 108711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Paused --> %d Not Handled",eState); 108811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 108911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 109011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 109111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /***************************/ 109211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Current State is WaitForResources */ 109311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /***************************/ 109411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_state == OMX_StateWaitForResources) { 109511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from WaitForResources to Loaded */ 109611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eState == OMX_StateLoaded) { 109711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Since error is None , we will post an event 109811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel at the end of this function definition */ 109911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMXCORE-SM: WaitForResources-->Loaded"); 110011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 110111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from WaitForResources to WaitForResources */ 110211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateWaitForResources) { 110311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: WaitForResources-->WaitForResources"); 110411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorSameState, 110511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 110611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorSameState; 110711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 110811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from WaitForResources to Executing */ 110911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateExecuting) { 111011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: WaitForResources-->Executing"); 111111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 111211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 111311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 111411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 111511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from WaitForResources to Pause */ 111611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StatePause) { 111711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: WaitForResources-->Pause"); 111811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorIncorrectStateTransition,\ 111911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 112011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorIncorrectStateTransition; 112111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 112211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from WaitForResources to Invalid */ 112311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (eState == OMX_StateInvalid) { 112411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: WaitForResources-->Invalid"); 112511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,eState,OMX_COMPONENT_GENERATE_EVENT); 112611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidState; 112711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 112811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Requesting transition from WaitForResources to Loaded - 112911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is NOT tested by Khronos TS */ 113011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 113111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 113211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: %d --> %d(Not Handled)",m_state,eState); 113311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 113411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 113511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 113611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /********************************/ 113711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Current State is Invalid */ 113811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*******************************/ 113911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_state == OMX_StateInvalid) { 114011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* State Transition from Inavlid to any state */ 114111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eState == (OMX_StateLoaded || OMX_StateWaitForResources 114211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel || OMX_StateIdle || OMX_StateExecuting 114311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel || OMX_StatePause || OMX_StateInvalid)) { 114411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: OMXCORE-SM: Invalid -->Loaded"); 114511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError,OMX_ErrorInvalidState,\ 114611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 114711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidState; 114811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 114911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (cmd == OMX_CommandFlush) { 115011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (0 == param1 || OMX_ALL == param1) { 115111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_FLUSH_PENDING); 115211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 115311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (1 == param1 || OMX_ALL == param1) { 115411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //generate output flush event only. 115511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_FLUSH_PENDING); 115611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 115711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 115811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel execute_omx_flush(param1); 115911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 116011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ( cmd == OMX_CommandPortEnable) { 116111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (param1 == PORT_INDEX_IN || param1 == OMX_ALL) { 116211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sInPortDef.bEnabled = OMX_TRUE; 116311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 116411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( (m_state == OMX_StateLoaded && 116511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 116611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel || allocate_input_done()) { 116711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortEnable,PORT_INDEX_IN, 116811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 116911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 117011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMXCORE-SM: Disabled-->Enabled Pending"); 117111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_ENABLE_PENDING); 117211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Skip the event notification 117311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 117411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 117511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 117611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (param1 == PORT_INDEX_OUT || param1 == OMX_ALL) { 117711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sOutPortDef.bEnabled = OMX_TRUE; 117811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 117911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( (m_state == OMX_StateLoaded && 118011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) 118111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel || (allocate_output_done())) { 118211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortEnable,PORT_INDEX_OUT, 118311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 118411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 118511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 118611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMXCORE-SM: Disabled-->Enabled Pending"); 118711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 118811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Skip the event notification 118911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 119011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 119111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 119211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (cmd == OMX_CommandPortDisable) { 119311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (param1 == PORT_INDEX_IN || param1 == OMX_ALL) { 119411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sInPortDef.bEnabled = OMX_FALSE; 119511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle) 119611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && release_input_done()) { 119711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortDisable,PORT_INDEX_IN, 119811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 119911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 120011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_INPUT_DISABLE_PENDING); 120111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) { 120211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel execute_omx_flush(PORT_INDEX_IN); 120311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 120411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 120511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Skip the event notification 120611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 120711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 120811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 120911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (param1 == PORT_INDEX_OUT || param1 == OMX_ALL) { 121011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sOutPortDef.bEnabled = OMX_FALSE; 121111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 121211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((m_state == OMX_StateLoaded || m_state == OMX_StateIdle) 121311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && release_output_done()) { 121411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortDisable,PORT_INDEX_OUT,\ 121511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 121611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 121711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_OUTPUT_DISABLE_PENDING); 121811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StatePause ||m_state == OMX_StateExecuting) { 121911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel execute_omx_flush(PORT_INDEX_OUT); 122011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 122111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Skip the event notification 122211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFlag = 0; 122311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 122411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 122511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 122611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 122711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Invalid Command received other than StateSet (%d)",cmd); 122811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNotImplemented; 122911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 123011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone && bFlag) { 123111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(cmd,eState,OMX_COMPONENT_GENERATE_EVENT); 123211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 123311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_post(&m_cmd_lock); 123411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 123511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 123611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 123711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 123811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 123911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_venc::ExecuteOmxFlush 124011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 124111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 124211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Executes the OMX flush. 124311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 124411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 124511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel flushtype - input flush(1)/output flush(0)/ both. 124611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 124711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 124811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 124911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 125011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 125111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_video::execute_omx_flush(OMX_U32 flushType) 125211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 125311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = false; 125411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("execute_omx_flush - %u", (unsigned int)flushType); 125511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_ 125611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* XXX: The driver/hardware does not support flushing of individual ports 125711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * in all states. So we pretty much need to flush both ports internally, 125811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * but client should only get the FLUSH_(INPUT|OUTPUT)_DONE for the one it 125911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * requested. Since OMX_COMPONENT_(OUTPUT|INPUT)_FLUSH_PENDING isn't set, 126011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * we automatically omit sending the FLUSH done for the "opposite" port. */ 126111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 126211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_flush_progress = true; 126311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_flush_progress = true; 126411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = execute_flush_all(); 126511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 126611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (flushType == 0 || flushType == OMX_ALL) { 126711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_flush_progress = true; 126811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //flush input only 126911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = execute_input_flush(); 127011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 127111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (flushType == 1 || flushType == OMX_ALL) { 127211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //flush output only 127311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_flush_progress = true; 127411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = execute_output_flush(); 127511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 127611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 127711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 127811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 127911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*========================================================================= 128011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION : execute_output_flush 128111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 128211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 128311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelExecutes the OMX flush at OUTPUT PORT. 128411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 128511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 128611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelNone. 128711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 128811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 128911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudeltrue/false 129011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel==========================================================================*/ 129111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_video::execute_output_flush(void) 129211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 129311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long p1 = 0; // Parameter - 1 129411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long p2 = 0; // Parameter - 2 129511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long ident = 0; 129611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = true; 129711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 129811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Generate FBD for all Buffers in the FTBq*/ 129911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("execute_output_flush"); 130011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&m_lock); 130111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (m_ftb_q.m_size) { 130211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ftb_q.pop_entry(&p1,&p2,&ident); 130311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 130411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ident == OMX_COMPONENT_GENERATE_FTB ) { 130511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_output_buffers++; 1306b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("FTB-pending", pending_output_buffers); 130711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2); 130811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (ident == OMX_COMPONENT_GENERATE_FBD) { 130911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1); 131011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 131111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 131211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 131311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&m_lock); 131411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Check if there are buffers with the Driver*/ 131511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dev_flush(PORT_INDEX_OUT)) { 131611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: o/p dev_flush() Failed"); 131711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 131811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 131911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 132011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 132111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 132211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*========================================================================= 132311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION : execute_input_flush 132411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 132511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 132611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelExecutes the OMX flush at INPUT PORT. 132711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 132811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 132911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelNone. 133011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 133111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 133211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudeltrue/false 133311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel==========================================================================*/ 133411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_video::execute_input_flush(void) 133511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 133611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long p1 = 0; // Parameter - 1 133711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long p2 = 0; // Parameter - 2 133811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long ident = 0; 133911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = true; 134011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 134111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Generate EBD for all Buffers in the ETBq*/ 134211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("execute_input_flush"); 134311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 134411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&m_lock); 134511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (m_etb_q.m_size) { 134611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_etb_q.pop_entry(&p1,&p2,&ident); 134711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ident == OMX_COMPONENT_GENERATE_ETB) { 134811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_input_buffers++; 1349b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("ETB-pending", pending_input_buffers); 135011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2); 135111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (ident == OMX_COMPONENT_GENERATE_EBD) { 135211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1); 135311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (ident == OMX_COMPONENT_GENERATE_ETB_OPQ) { 135411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pCallbacks.EmptyBufferDone(&m_cmp,m_app_data,(OMX_BUFFERHEADERTYPE *)p2); 135511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 135611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 135711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (mUseProxyColorFormat) { 135811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (psource_frame) { 135911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pCallbacks.EmptyBufferDone(&m_cmp,m_app_data,psource_frame); 136011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame = NULL; 136111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 136211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (m_opq_meta_q.m_size) { 136311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long p1,p2,id; 136411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_opq_meta_q.pop_entry(&p1,&p2,&id); 136511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pCallbacks.EmptyBufferDone(&m_cmp,m_app_data, 136611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *)p1); 136711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 136811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pdest_frame) { 136911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_opq_pmem_q.insert_entry((unsigned long)pdest_frame,0,0); 137011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = NULL; 137111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 137211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 137311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&m_lock); 137411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Check if there are buffers with the Driver*/ 137511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dev_flush(PORT_INDEX_IN)) { 137611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: i/p dev_flush() Failed"); 137711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 137811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 137911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 138011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 138111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 138211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 138311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 138411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*========================================================================= 138511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelFUNCTION : execute_flush 138611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 138711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelDESCRIPTION 138811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelExecutes the OMX flush at INPUT & OUTPUT PORT. 138911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 139011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPARAMETERS 139111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelNone. 139211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 139311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRETURN VALUE 139411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudeltrue/false 139511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel==========================================================================*/ 139611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_ 139711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_video::execute_flush_all(void) 139811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 139911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long p1 = 0; // Parameter - 1 140011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long p2 = 0; // Parameter - 2 140111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long ident = 0; 140211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = true; 140311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 140411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("execute_flush_all"); 140511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 140611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Generate EBD for all Buffers in the ETBq*/ 140711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&m_lock); 140811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (m_etb_q.m_size) { 140911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_etb_q.pop_entry(&p1,&p2,&ident); 141011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ident == OMX_COMPONENT_GENERATE_ETB) { 141111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_input_buffers++; 1412b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("ETB-pending", pending_input_buffers); 141311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2); 141411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (ident == OMX_COMPONENT_GENERATE_EBD) { 141511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel empty_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1); 141611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if(ident == OMX_COMPONENT_GENERATE_ETB_OPQ) { 141711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pCallbacks.EmptyBufferDone(&m_cmp,m_app_data,(OMX_BUFFERHEADERTYPE *)p2); 141811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 141911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 142011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(mUseProxyColorFormat) { 142111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(psource_frame) { 142211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pCallbacks.EmptyBufferDone(&m_cmp,m_app_data,psource_frame); 142311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame = NULL; 142411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 142511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while(m_opq_meta_q.m_size) { 142611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long p1,p2,id; 142711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_opq_meta_q.pop_entry(&p1,&p2,&id); 142811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pCallbacks.EmptyBufferDone(&m_cmp,m_app_data, 142911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *)p1); 143011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 143111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(pdest_frame){ 143211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_opq_pmem_q.insert_entry((unsigned long)pdest_frame,0,0); 143311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = NULL; 143411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 143511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 143611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 143711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Generate FBD for all Buffers in the FTBq*/ 143811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("execute_output_flush"); 143911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (m_ftb_q.m_size) { 144011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ftb_q.pop_entry(&p1,&p2,&ident); 144111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 144211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ident == OMX_COMPONENT_GENERATE_FTB ) { 144311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_output_buffers++; 1444b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("FTB-pending", pending_output_buffers); 144511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p2); 144611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (ident == OMX_COMPONENT_GENERATE_FBD) { 144711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fill_buffer_done(&m_cmp,(OMX_BUFFERHEADERTYPE *)p1); 144811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 144911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 145011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 145111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&m_lock); 145211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 145311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Check if there are buffers with the Driver*/ 145411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dev_flush(PORT_INDEX_BOTH)) { 145511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: dev_flush() Failed"); 145611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 145711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 145811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 145911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 146011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 146111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 146211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 146311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 146411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 146511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_venc::SendCommandEvent 146611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 146711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 146811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Send the event to decoder pipe. This is needed to generate the callbacks 146911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel in decoder thread context. 147011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 147111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 147211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 147311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 147411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 147511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 147611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 147711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 147811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_video::post_event(unsigned long p1, 147911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long p2, 148011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long id) 148111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 148211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = false; 148311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 148411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&m_lock); 148511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 148611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((id == OMX_COMPONENT_GENERATE_FTB) || 148711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (id == OMX_COMPONENT_GENERATE_FBD) || 148811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (id == OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH)) { 148911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ftb_q.insert_entry(p1,p2,id); 149011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ((id == OMX_COMPONENT_GENERATE_ETB) || 149111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (id == OMX_COMPONENT_GENERATE_EBD) || 149211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (id == OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH)) { 149311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_etb_q.insert_entry(p1,p2,id); 149411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 149511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cmd_q.insert_entry(p1,p2,id); 149611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 149711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 149811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 149911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Value of this pointer in post_event %p",this); 150011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_message(this, id); 150111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&m_lock); 150211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 150311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 150411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 150511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 150611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 150711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 150811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_venc::GetParameter 150911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 151011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 151111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Get Parameter method implementation 151211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 151311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 151411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 151511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 151611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 151711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Error None if successful. 151811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 151911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 152011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_video::get_parameter(OMX_IN OMX_HANDLETYPE hComp, 152111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_INDEXTYPE paramIndex, 152211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_PTR paramData) 152311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 152411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void)hComp; 152511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 152611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int height=0,width = 0; 152711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 152811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter:"); 152911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) { 153011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Get Param in Invalid State"); 153111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 153211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 153311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (paramData == NULL) { 153411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Get Param in Invalid paramData"); 153511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 153611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 153711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch ((int)paramIndex) { 153811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamPortDefinition: 153911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 154011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_PORTDEFINITIONTYPE); 154111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_PORTDEFINITIONTYPE *portDefn; 154211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData; 154311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 154411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPortDefinition"); 154511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (portDefn->nPortIndex == (OMX_U32) PORT_INDEX_IN) { 154611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dev_get_buf_req (&m_sInPortDef.nBufferCountMin, 154711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &m_sInPortDef.nBufferCountActual, 154811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &m_sInPortDef.nBufferSize, 154911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sInPortDef.nPortIndex); 155011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("m_sInPortDef: size = %u, min cnt = %u, actual cnt = %u", 155111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)m_sInPortDef.nBufferSize, (unsigned int)m_sInPortDef.nBufferCountMin, 155211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)m_sInPortDef.nBufferCountActual); 155311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(portDefn, &m_sInPortDef, sizeof(m_sInPortDef)); 155411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ICS_ 155511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (meta_mode_enable) { 155611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // request size of largest metadata (happens to be NativeHandleSource) since 155711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // we do not know the exact metadata-type yet 155811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->nBufferSize = sizeof(LEGACY_CAM_METADATA_TYPE); 155911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 156011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (mUseProxyColorFormat) { 156111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn->format.video.eColorFormat = 156211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FormatAndroidOpaque; 156311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 156411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 156511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (portDefn->nPortIndex == (OMX_U32) PORT_INDEX_OUT) { 156611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state != OMX_StateExecuting) { 156711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dev_get_buf_req (&m_sOutPortDef.nBufferCountMin, 156811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &m_sOutPortDef.nBufferCountActual, 156911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &m_sOutPortDef.nBufferSize, 157011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sOutPortDef.nPortIndex); 157111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 157211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("m_sOutPortDef: size = %u, min cnt = %u, actual cnt = %u", 157311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)m_sOutPortDef.nBufferSize, (unsigned int)m_sOutPortDef.nBufferCountMin, 157411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)m_sOutPortDef.nBufferCountActual); 157511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(portDefn, &m_sOutPortDef, sizeof(m_sOutPortDef)); 1576a2a3cfbab02cae786abdd9614212cc98d16cf471Thierry Strudel 1577a2a3cfbab02cae786abdd9614212cc98d16cf471Thierry Strudel if (secure_session || allocate_native_handle) { 1578a2a3cfbab02cae786abdd9614212cc98d16cf471Thierry Strudel portDefn->nBufferSize = 1579a2a3cfbab02cae786abdd9614212cc98d16cf471Thierry Strudel sizeof(native_handle_t) + (sizeof(int) * (1/*numFds*/ + 3/*numInts*/)); 1580a2a3cfbab02cae786abdd9614212cc98d16cf471Thierry Strudel } 158111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 158211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: GetParameter called on Bad Port Index"); 158311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 158411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 158511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 158611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 158711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoInit: 158811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 158911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_PORT_PARAM_TYPE); 159011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PORT_PARAM_TYPE *portParamType = 159111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_PORT_PARAM_TYPE *) paramData; 159211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoInit"); 159311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 159411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(portParamType, &m_sPortParam, sizeof(m_sPortParam)); 159511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 159611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 159711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoPortFormat: 159811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 159911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PORTFORMATTYPE); 160011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt = 160111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData; 160211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoPortFormat"); 160311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 160411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (portFmt->nPortIndex == (OMX_U32) PORT_INDEX_IN) { 160511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned index = portFmt->nIndex; 160611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 160711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _UBWC_ 160811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //we support following formats 160911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //index 0 - Compressed (UBWC) Venus flavour of YUV420SP 161011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //index 1 - Venus flavour of YUV420SP 161111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //index 2 - Compressed (UBWC) Venus flavour of RGBA8888 161211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //index 3 - Venus flavour of RGBA8888 161311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //index 4 - opaque which internally maps to YUV420SP. 161411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //index 5 - vannilla YUV420SP 161511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //this can be extended in the future 161611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int supportedFormats[] = { 161711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel [0] = QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed, 161811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel [1] = QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m, 161911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel [2] = QOMX_COLOR_Format32bitRGBA8888Compressed, 162011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel [3] = QOMX_COLOR_Format32bitRGBA8888, 162111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel [4] = QOMX_COLOR_FormatAndroidOpaque, 162211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel [5] = OMX_COLOR_FormatYUV420SemiPlanar, 162311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel }; 162411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 162511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //we support two formats 162611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //index 0 - Venus flavour of YUV420SP 162711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //index 1 - opaque which internally maps to YUV420SP. 162811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //index 2 - vannilla YUV420SP 162911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //this can be extended in the future 163011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int supportedFormats[] = { 163111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel [0] = QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m, 163211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel [1] = QOMX_COLOR_FormatAndroidOpaque, 163311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel [2] = OMX_COLOR_FormatYUV420SemiPlanar, 163411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel }; 163511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 163611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (index > (sizeof(supportedFormats)/sizeof(*supportedFormats) - 1)) 163711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 163811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else { 163911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(portFmt, &m_sInPortFormat, sizeof(m_sInPortFormat)); 164011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->nIndex = index; //restore index set from client 164111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt->eColorFormat = (OMX_COLOR_FORMATTYPE)supportedFormats[index]; 164211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 164311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (portFmt->nPortIndex == (OMX_U32) PORT_INDEX_OUT) { 164411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(portFmt, &m_sOutPortFormat, sizeof(m_sOutPortFormat)); 164511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 164611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: GetParameter called on Bad Port Index"); 164711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 164811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 164911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 165011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 165111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoBitrate: 165211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 165311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_BITRATETYPE); 165411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_BITRATETYPE* pParam = (OMX_VIDEO_PARAM_BITRATETYPE*)paramData; 165511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoBitrate"); 165611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 165711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) { 165811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(pParam, &m_sParamBitrate, sizeof(m_sParamBitrate)); 165911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 166011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: GetParameter called on Bad Port Index"); 166111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 166211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 166311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 166411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 166511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 166611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoMpeg4: 166711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 166811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_MPEG4TYPE); 166911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_MPEG4TYPE* pParam = (OMX_VIDEO_PARAM_MPEG4TYPE*)paramData; 167011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoMpeg4"); 167111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(pParam, &m_sParamMPEG4, sizeof(m_sParamMPEG4)); 167211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 167311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 167411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoH263: 167511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 167611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_H263TYPE); 167711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_H263TYPE* pParam = (OMX_VIDEO_PARAM_H263TYPE*)paramData; 167811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoH263"); 167911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(pParam, &m_sParamH263, sizeof(m_sParamH263)); 168011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 168111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 168211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoAvc: 168311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 168411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_AVCTYPE); 168511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_AVCTYPE* pParam = (OMX_VIDEO_PARAM_AVCTYPE*)paramData; 168611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoAvc"); 168711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(pParam, &m_sParamAVC, sizeof(m_sParamAVC)); 168811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 168911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 169011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case (OMX_INDEXTYPE)OMX_IndexParamVideoVp8: 169111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 169211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_VP8TYPE); 169311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_VP8TYPE* pParam = (OMX_VIDEO_PARAM_VP8TYPE*)paramData; 169411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoVp8"); 169511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(pParam, &m_sParamVP8, sizeof(m_sParamVP8)); 169611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 169711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 169811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case (OMX_INDEXTYPE)OMX_IndexParamVideoHevc: 169911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 170011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_HEVCTYPE); 170111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_HEVCTYPE* pParam = (OMX_VIDEO_PARAM_HEVCTYPE*)paramData; 170211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoHevc"); 170311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(pParam, &m_sParamHEVC, sizeof(m_sParamHEVC)); 170411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 170511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 170611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoProfileLevelQuerySupported: 170711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 170811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PROFILELEVELTYPE); 170911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam = (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData; 171011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported"); 171111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = get_supported_profile_level(pParam); 171211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet && eRet != OMX_ErrorNoMore) 171311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid entry returned from get_supported_profile_level %u, %u", 171411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)pParam->eProfile, (unsigned int)pParam->eLevel); 171511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 171611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 171711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoProfileLevelCurrent: 171811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 171911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PROFILELEVELTYPE); 172011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam = (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData; 172111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelCurrent"); 172211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(pParam, &m_sParamProfileLevel, sizeof(m_sParamProfileLevel)); 172311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 172411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 172511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexConfigH264EntropyCodingCabac: 172611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 172711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_H264ENTROPYCODINGTYPE); 172811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_VIDEO_H264ENTROPYCODINGTYPE * pParam = (QOMX_VIDEO_H264ENTROPYCODINGTYPE*)paramData; 172911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_QcomIndexConfigH264EntropyCodingCabac"); 173011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(pParam, &m_sParamEntropy, sizeof(m_sParamEntropy)); 173111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 173211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 173311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Component should support this port definition*/ 173411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamAudioInit: 173511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 173611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_PORT_PARAM_TYPE); 173711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PORT_PARAM_TYPE *audioPortParamType = (OMX_PORT_PARAM_TYPE *) paramData; 173811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamAudioInit"); 173911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(audioPortParamType, &m_sPortParam_audio, sizeof(m_sPortParam_audio)); 174011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 174111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 174211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Component should support this port definition*/ 174311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamImageInit: 174411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 174511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_PORT_PARAM_TYPE); 174611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PORT_PARAM_TYPE *imagePortParamType = (OMX_PORT_PARAM_TYPE *) paramData; 174711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamImageInit"); 174811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(imagePortParamType, &m_sPortParam_img, sizeof(m_sPortParam_img)); 174911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 175011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 175111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 175211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Component should support this port definition*/ 175311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamOtherInit: 175411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 175511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: get_parameter: OMX_IndexParamOtherInit %08x", paramIndex); 175611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet =OMX_ErrorUnsupportedIndex; 175711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 175811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 175911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamStandardComponentRole: 176011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 176111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_COMPONENTROLETYPE); 176211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_COMPONENTROLETYPE *comp_role; 176311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData; 176411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel comp_role->nVersion.nVersion = OMX_SPEC_VERSION; 176511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel comp_role->nSize = sizeof(*comp_role); 176611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 176711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Getparameter: OMX_IndexParamStandardComponentRole %d",paramIndex); 176811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char*)comp_role->cRole,(const char*)m_cRole,OMX_MAX_STRINGNAME_SIZE); 176911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 177011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 177111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Added for parameter test */ 177211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamPriorityMgmt: 177311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 177411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_PRIORITYMGMTTYPE); 177511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PRIORITYMGMTTYPE *priorityMgmType = (OMX_PRIORITYMGMTTYPE *) paramData; 177611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamPriorityMgmt"); 177711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(priorityMgmType, &m_sPriorityMgmt, sizeof(m_sPriorityMgmt)); 177811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 177911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 178011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Added for parameter test */ 178111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamCompBufferSupplier: 178211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 178311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_BUFFERSUPPLIERTYPE); 178411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData; 178511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamCompBufferSupplier"); 178611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bufferSupplierType->nPortIndex ==(OMX_U32) PORT_INDEX_IN) { 178711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(bufferSupplierType, &m_sInBufSupplier, sizeof(m_sInBufSupplier)); 178811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (bufferSupplierType->nPortIndex ==(OMX_U32) PORT_INDEX_OUT) { 178911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(bufferSupplierType, &m_sOutBufSupplier, sizeof(m_sOutBufSupplier)); 179011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 179111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: GetParameter called on Bad Port Index"); 179211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 179311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 179411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 179511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 179611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 179711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoQuantization: 179811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 179911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_QUANTIZATIONTYPE); 180011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_QUANTIZATIONTYPE *session_qp = (OMX_VIDEO_PARAM_QUANTIZATIONTYPE*) paramData; 180111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoQuantization"); 180211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(session_qp, &m_sSessionQuantization, sizeof(m_sSessionQuantization)); 180311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 180411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 180511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 180611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamVideoQPRange: 180711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 180811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_VIDEO_PARAM_QPRANGETYPE); 180911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_VIDEO_PARAM_QPRANGETYPE *qp_range = (OMX_QCOM_VIDEO_PARAM_QPRANGETYPE*) paramData; 181011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_QcomIndexParamVideoQPRange"); 181111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(qp_range, &m_sSessionQPRange, sizeof(m_sSessionQPRange)); 181211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 181311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 181411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 18152601808ee2992a94c325d05e4065aba60b01840bThierry Strudel case OMX_QcomIndexParamVideoIPBQPRange: 18162601808ee2992a94c325d05e4065aba60b01840bThierry Strudel { 18172601808ee2992a94c325d05e4065aba60b01840bThierry Strudel OMX_QCOM_VIDEO_PARAM_IPB_QPRANGETYPE *qp_range = (OMX_QCOM_VIDEO_PARAM_IPB_QPRANGETYPE*) paramData; 18182601808ee2992a94c325d05e4065aba60b01840bThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_QCOM_VIDEO_PARAM_IPB_QPRANGETYPE"); 18192601808ee2992a94c325d05e4065aba60b01840bThierry Strudel memcpy(qp_range, &m_sSessionIPBQPRange, sizeof(m_sSessionIPBQPRange)); 18202601808ee2992a94c325d05e4065aba60b01840bThierry Strudel break; 18212601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 18222601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 182311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoErrorCorrection: 182411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 182511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE); 182611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* errorresilience = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE*)paramData; 182711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMX_IndexParamVideoErrorCorrection"); 182811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel errorresilience->bEnableHEC = m_sErrorCorrection.bEnableHEC; 182911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel errorresilience->bEnableResync = m_sErrorCorrection.bEnableResync; 183011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel errorresilience->nResynchMarkerSpacing = m_sErrorCorrection.nResynchMarkerSpacing; 183111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 183211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 183311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoIntraRefresh: 183411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 183511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_INTRAREFRESHTYPE); 183611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_INTRAREFRESHTYPE* intrarefresh = (OMX_VIDEO_PARAM_INTRAREFRESHTYPE*)paramData; 183711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMX_IndexParamVideoIntraRefresh"); 183811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel intrarefresh->eRefreshMode = m_sIntraRefresh.eRefreshMode; 183911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel intrarefresh->nCirMBs = m_sIntraRefresh.nCirMBs; 184011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 184111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 184211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexPortDefn: 184311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //TODO 184411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 184511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_CAPABILITY_TYPE_INDEX: 184611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 184711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMXComponentCapabilityFlagsType); 184811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMXComponentCapabilityFlagsType *pParam = reinterpret_cast<OMXComponentCapabilityFlagsType*>(paramData); 184911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_COMPONENT_CAPABILITY_TYPE_INDEX"); 185011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->iIsOMXComponentMultiThreaded = OMX_TRUE; 185111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->iOMXComponentSupportsExternalOutputBufferAlloc = OMX_FALSE; 185211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->iOMXComponentSupportsExternalInputBufferAlloc = OMX_TRUE; 185311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->iOMXComponentSupportsMovableInputBuffers = OMX_TRUE; 185411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->iOMXComponentUsesNALStartCodes = OMX_TRUE; 185511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->iOMXComponentSupportsPartialFrames = OMX_FALSE; 185611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->iOMXComponentCanHandleIncompleteFrames = OMX_FALSE; 185711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->iOMXComponentUsesFullAVCFrames = OMX_FALSE; 185811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_use_input_pmem = OMX_TRUE; 185911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Supporting capability index in encoder node"); 186011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 186111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 186211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if !defined(MAX_RES_720P) || defined(_MSM8974_) 186311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamIndexExtraDataType: 186411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 186511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_INDEXEXTRADATATYPE); 186611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_QcomIndexParamIndexExtraDataType"); 186711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_INDEXEXTRADATATYPE *pParam = (QOMX_INDEXEXTRADATATYPE *)paramData; 186811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam->nIndex == (OMX_INDEXTYPE)OMX_ExtraDataVideoEncoderSliceInfo) { 186911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam->nPortIndex == PORT_INDEX_OUT) { 187011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->bEnabled = 187111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BOOL)(m_sExtraData & VENC_EXTRADATA_SLICEINFO); 187211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Slice Info extradata %d", pParam->bEnabled); 187311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 187411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_parameter: slice information is " 187511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "valid for output port only"); 187611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedIndex; 187711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 187811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (pParam->nIndex == (OMX_INDEXTYPE)OMX_ExtraDataVideoEncoderMBInfo) { 187911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam->nPortIndex == PORT_INDEX_OUT) { 188011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->bEnabled = 188111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BOOL)(m_sExtraData & VENC_EXTRADATA_MBINFO); 188211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("MB Info extradata %d", pParam->bEnabled); 188311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 188411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_parameter: MB information is " 188511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "valid for output port only"); 188611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedIndex; 188711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 188811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (pParam->nIndex == (OMX_INDEXTYPE)OMX_ExtraDataFrameDimension) { 188911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam->nPortIndex == PORT_INDEX_IN) { 189011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->bEnabled = 189111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BOOL)((m_sExtraData & VENC_EXTRADATA_FRAMEDIMENSION) ? 1 : 0); 189211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Frame dimension extradata %d", pParam->bEnabled); 189311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 189411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_parameter: frame dimension is " 189511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "valid for input port only"); 189611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedIndex; 189711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 189811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 189911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (pParam->nIndex == (OMX_INDEXTYPE)OMX_ExtraDataVideoLTRInfo) { 190011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam->nPortIndex == PORT_INDEX_OUT) { 190111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->bEnabled = 190211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BOOL)(m_sExtraData & VEN_EXTRADATA_LTRINFO); 190311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("LTR Info extradata %d", pParam->bEnabled); 190411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 190511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_parameter: LTR information is " 190611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "valid for output port only"); 190711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedIndex; 190811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 190911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 191011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else { 191111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_parameter: unsupported extradata index (0x%x)", 191211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->nIndex); 191311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedIndex; 191411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 191511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 191611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 191711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case QOMX_IndexParamVideoLTRCountRangeSupported: 191811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 191911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_EXTNINDEX_RANGETYPE); 192011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("get_parameter: QOMX_IndexParamVideoLTRCountRangeSupported"); 192111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_EXTNINDEX_RANGETYPE *pParam = (QOMX_EXTNINDEX_RANGETYPE *)paramData; 192211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam->nPortIndex == PORT_INDEX_OUT) { 192311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 min = 0, max = 0, step_size = 0; 192411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dev_get_capability_ltrcount(&min, &max, &step_size)) { 192511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->nMin = min; 192611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->nMax = max; 192711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->nStepSize = step_size; 192811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 192911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_parameter: get_capability_ltrcount failed"); 193011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUndefined; 193111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 193211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 193311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("LTR count range is valid for output port only"); 193411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedIndex; 193511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 193611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 193711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 193811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamVideoLTRCount: 193911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 194011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_VIDEO_PARAM_LTRCOUNT_TYPE); 194111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_QcomIndexParamVideoLTRCount"); 194211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_VIDEO_PARAM_LTRCOUNT_TYPE *pParam = 194311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel reinterpret_cast<OMX_QCOM_VIDEO_PARAM_LTRCOUNT_TYPE*>(paramData); 194411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(pParam, &m_sParamLTRCount, sizeof(m_sParamLTRCount)); 194511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 194611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 194711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 194811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case QOMX_IndexParamVideoSyntaxHdr: 194911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 195011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_EXTNINDEX_PARAMTYPE); 195111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("QOMX_IndexParamVideoSyntaxHdr"); 195211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_EXTNINDEX_PARAMTYPE* pParam = 195311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel reinterpret_cast<QOMX_EXTNINDEX_PARAMTYPE*>(paramData); 195411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam->pData == NULL) { 195511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error: Data buffer is NULL"); 195611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadParameter; 195711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 195811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 195911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (get_syntaxhdr_enable == false) { 196011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: get_parameter: Get syntax header disabled"); 196111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedIndex; 196211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 196311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 196411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_LOADED_START_PENDING); 196511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dev_loaded_start()) { 196611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("device start successful"); 196711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 196811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("device start failed"); 196911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR(&m_flags, OMX_COMPONENT_LOADED_START_PENDING); 197011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorHardware; 197111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 197211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dev_get_seq_hdr(pParam->pData, 197311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned)(pParam->nSize - sizeof(QOMX_EXTNINDEX_PARAMTYPE)), 197411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned *)(void *)&pParam->nDataSize)) { 197511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("get syntax header successful (hdrlen = %u)", 197611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)pParam->nDataSize); 197711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (unsigned i = 0; i < pParam->nDataSize; i++) { 197811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Header[%d] = %x", i, *((char *)pParam->pData + i)); 197911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 198011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 198111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error returned from GetSyntaxHeader()"); 198211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorHardware; 198311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 198411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_flags, OMX_COMPONENT_LOADED_STOP_PENDING); 198511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dev_loaded_stop()) { 198611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("device stop successful"); 198711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 198811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("device stop failed"); 198911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR(&m_flags, OMX_COMPONENT_LOADED_STOP_PENDING); 199011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorHardware; 199111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 199211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 199311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 199411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexHierarchicalStructure: 199511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 199611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_HIERARCHICALLAYERS); 199711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_VIDEO_HIERARCHICALLAYERS* hierp = (QOMX_VIDEO_HIERARCHICALLAYERS*) paramData; 199811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_QcomIndexHierarchicalStructure"); 199911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(hierp, &m_sHierLayers, sizeof(m_sHierLayers)); 200011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 200111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 200211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamMBIStatisticsMode: 200311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 200411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_QOMX_VIDEO_MBI_STATISTICS); 200511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QOMX_VIDEO_MBI_STATISTICS* mbi_mode = (OMX_QOMX_VIDEO_MBI_STATISTICS*) paramData; 200611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_QcomIndexParamMBIStatisticsMode"); 200711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(mbi_mode, &m_sMBIStatistics, sizeof(m_sMBIStatistics)); 200811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 200911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 201011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamPerfLevel: 201111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 201211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_VIDEO_PARAM_PERF_LEVEL); 201311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 perflevel; 201411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_VIDEO_PARAM_PERF_LEVEL *pParam = 201511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel reinterpret_cast<OMX_QCOM_VIDEO_PARAM_PERF_LEVEL*>(paramData); 201611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_QcomIndexParamPerfLevel"); 201711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!dev_get_performance_level(&perflevel)) { 201811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid entry returned from get_performance_level %d", 201911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->ePerfLevel); 202011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 202111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->ePerfLevel = (QOMX_VIDEO_PERF_LEVEL)perflevel; 202211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 202311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 202411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 202511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamH264VUITimingInfo: 202611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 202711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_VIDEO_PARAM_VUI_TIMING_INFO); 202811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 enabled; 202911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_VIDEO_PARAM_VUI_TIMING_INFO *pParam = 203011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel reinterpret_cast<OMX_QCOM_VIDEO_PARAM_VUI_TIMING_INFO*>(paramData); 203111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_QcomIndexParamH264VUITimingInfo"); 203211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!dev_get_vui_timing_info(&enabled)) { 203311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid entry returned from get_vui_Timing_info %d", 203411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->bEnable); 203511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 203611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->bEnable = (OMX_BOOL)enabled; 203711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 203811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 203911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 204011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QTIIndexParamVQZIPSEIType: 204111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 204211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_QTI_VIDEO_PARAM_VQZIP_SEI_TYPE); 204311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 enabled; 204411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QTI_VIDEO_PARAM_VQZIP_SEI_TYPE *pParam = 204511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel reinterpret_cast<OMX_QTI_VIDEO_PARAM_VQZIP_SEI_TYPE*>(paramData); 204611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_QTIIndexParamVQZIPSEIType"); 204711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!dev_get_vqzip_sei_info(&enabled)) { 204811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid entry returned from get_vqzip_sei_type %d", 204911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->bEnable); 205011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 205111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->bEnable = (OMX_BOOL)enabled; 205211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 205311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 205411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 205511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamPeakBitrate: 205611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 205711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_VIDEO_PARAM_PEAK_BITRATE); 205811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 peakbitrate; 205911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_VIDEO_PARAM_PEAK_BITRATE *pParam = 206011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel reinterpret_cast<OMX_QCOM_VIDEO_PARAM_PEAK_BITRATE*>(paramData); 206111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_QcomIndexParamPeakBitrate"); 206211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!dev_get_peak_bitrate(&peakbitrate)) { 206311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid entry returned from get_peak_bitrate %u", 206411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)pParam->nPeakBitrate); 206511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 206611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->nPeakBitrate = peakbitrate; 206711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 206811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 206911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 207011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case QOMX_IndexParamVideoInitialQp: 207111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 207211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_EXTNINDEX_VIDEO_INITIALQP); 207311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_EXTNINDEX_VIDEO_INITIALQP* initqp = 207411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel reinterpret_cast<QOMX_EXTNINDEX_VIDEO_INITIALQP *>(paramData); 207511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(initqp, &m_sParamInitqp, sizeof(m_sParamInitqp)); 207611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 207711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 207811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamBatchSize: 207911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 208011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_U32TYPE); 208111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_U32TYPE* batch = 208211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel reinterpret_cast<OMX_PARAM_U32TYPE *>(paramData); 208311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 208411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_QcomIndexParamBatchSize"); 208511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!dev_get_batch_size(&batch->nU32)) { 208611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid entry returned from dev_get_batch_size %u", 208711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)batch->nSize); 208811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorUnsupportedIndex; 208911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 209011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 209111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 209211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel batch->nPortIndex = PORT_INDEX_IN; 209311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 209411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 209511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamSequenceHeaderWithIDR: 209611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 209711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, PrependSPSPPSToIDRFramesParams); 209811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PrependSPSPPSToIDRFramesParams * pParam = 209911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel reinterpret_cast<PrependSPSPPSToIDRFramesParams *>(paramData); 210011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_QcomIndexParamSequenceHeaderWithIDR"); 210111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(pParam, &m_sPrependSPSPPS, sizeof(m_sPrependSPSPPS)); 210211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 210311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 210411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamVencAspectRatio: 210511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 210611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_EXTNINDEX_VIDEO_VENC_SAR); 210711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_EXTNINDEX_VIDEO_VENC_SAR * pParam = 210811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel reinterpret_cast<QOMX_EXTNINDEX_VIDEO_VENC_SAR *>(paramData); 210911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(pParam, &m_sSar, sizeof(m_sSar)); 211011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 211111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 211211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QTIIndexParamLowLatencyMode: 211311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 211411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_EXTNINDEX_VIDEO_VENC_LOW_LATENCY_MODE); 211511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_EXTNINDEX_VIDEO_VENC_LOW_LATENCY_MODE * pParam = 211611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel reinterpret_cast<QOMX_EXTNINDEX_VIDEO_VENC_LOW_LATENCY_MODE *>(paramData); 211711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(pParam, &m_slowLatencyMode, sizeof(m_slowLatencyMode)); 211811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 211911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 2120fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case OMX_IndexParamAndroidVideoTemporalLayering: 2121fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel { 2122fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_ANDROID_TEMPORALLAYERINGTYPE); 2123fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel OMX_VIDEO_PARAM_ANDROID_TEMPORALLAYERINGTYPE *pLayerInfo = 2124fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel reinterpret_cast<OMX_VIDEO_PARAM_ANDROID_TEMPORALLAYERINGTYPE*>(paramData); 2125fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (!dev_get_temporal_layer_caps(&m_sParamTemporalLayers.nLayerCountMax, 2126fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel &m_sParamTemporalLayers.nBLayerCountMax)) { 2127fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Failed to get temporal layer capabilities"); 2128e2b75a9c0959cc95f9c17d7ff183dbe1b210ab43Thierry Strudel eRet = OMX_ErrorUnsupportedIndex; 2129fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 2130fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel memcpy(pLayerInfo, &m_sParamTemporalLayers, sizeof(m_sParamTemporalLayers)); 2131fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 2132fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 21332e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel case OMX_QTIIndexParamDisablePQ: 21342e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel { 21352e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel VALIDATE_OMX_PARAM_DATA(paramData, QOMX_DISABLETYPE); 21362e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel OMX_BOOL pq_status; 21372e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel QOMX_DISABLETYPE *pParam = 21382e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel reinterpret_cast<QOMX_DISABLETYPE*>(paramData); 21392e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel if (!dev_get_pq_status(&pq_status)) { 21402e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel DEBUG_PRINT_ERROR("Failed to get PQ status"); 21412e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel eRet = OMX_ErrorHardware; 21422e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel } 21432e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel pParam->bDisable = pq_status ? OMX_FALSE : OMX_TRUE; 21442e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel break; 21452e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel } 214611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoSliceFMO: 214711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 214811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 214911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("ERROR: get_parameter: unknown param %08x", paramIndex); 215011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet =OMX_ErrorUnsupportedIndex; 215111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 215211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 215311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 215411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 215511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 215611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 215711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 215811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 215911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 216011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 216111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_video::GetConfig 216211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 216311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 216411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Get Config Method implementation. 216511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 216611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 216711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 216811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 216911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 217011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if successful. 217111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 217211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 217311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_video::get_config(OMX_IN OMX_HANDLETYPE hComp, 217411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_INDEXTYPE configIndex, 217511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_PTR configData) 217611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 217711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void)hComp; 217811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //////////////////////////////////////////////////////////////// 217911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Supported Config Index Type 218011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // ============================================================= 218111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // OMX_IndexConfigVideoBitrate OMX_VIDEO_CONFIG_BITRATETYPE 218211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // OMX_IndexConfigVideoFramerate OMX_CONFIG_FRAMERATETYPE 218311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // OMX_IndexConfigCommonRotate OMX_CONFIG_ROTATIONTYPE 218411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //////////////////////////////////////////////////////////////// 218511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 218611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (configData == NULL) { 218711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: param is null"); 218811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 218911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 219011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 219111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) { 219211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: can't be in invalid state"); 219311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorIncorrectStateOperation; 219411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 219511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 219611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //@todo need to validate params 219711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch ((int)configIndex) { 219811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexConfigVideoBitrate: 219911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 220011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_CONFIG_BITRATETYPE); 220111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_CONFIG_BITRATETYPE* pParam = reinterpret_cast<OMX_VIDEO_CONFIG_BITRATETYPE*>(configData); 220211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(pParam, &m_sConfigBitrate, sizeof(m_sConfigBitrate)); 220311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 220411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 220511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexConfigVideoFramerate: 220611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 220711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(configData, OMX_CONFIG_FRAMERATETYPE); 220811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CONFIG_FRAMERATETYPE* pParam = reinterpret_cast<OMX_CONFIG_FRAMERATETYPE*>(configData); 220911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(pParam, &m_sConfigFramerate, sizeof(m_sConfigFramerate)); 221011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 221111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 221211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexConfigCommonRotate: 221311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 221411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(configData, OMX_CONFIG_ROTATIONTYPE); 221511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CONFIG_ROTATIONTYPE* pParam = reinterpret_cast<OMX_CONFIG_ROTATIONTYPE*>(configData); 221611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(pParam, &m_sConfigFrameRotation, sizeof(m_sConfigFrameRotation)); 221711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 221811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 221911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case QOMX_IndexConfigVideoIntraperiod: 222011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 222111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_config:QOMX_IndexConfigVideoIntraperiod"); 222211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(configData, QOMX_VIDEO_INTRAPERIODTYPE); 222311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_VIDEO_INTRAPERIODTYPE* pParam = reinterpret_cast<QOMX_VIDEO_INTRAPERIODTYPE*>(configData); 222411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(pParam, &m_sIntraperiod, sizeof(m_sIntraperiod)); 222511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 222611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 222711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexConfigVideoAVCIntraPeriod: 222811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 222911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_CONFIG_AVCINTRAPERIOD); 223011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_CONFIG_AVCINTRAPERIOD *pParam = 223111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel reinterpret_cast<OMX_VIDEO_CONFIG_AVCINTRAPERIOD*>(configData); 223211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_config: OMX_IndexConfigVideoAVCIntraPeriod"); 223311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(pParam, &m_sConfigAVCIDRPeriod, sizeof(m_sConfigAVCIDRPeriod)); 223411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 223511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 223611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexConfigCommonDeinterlace: 223711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 223811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_CONFIG_DEINTERLACE); 223911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_CONFIG_DEINTERLACE *pParam = 224011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel reinterpret_cast<OMX_VIDEO_CONFIG_DEINTERLACE*>(configData); 224111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_config: OMX_IndexConfigCommonDeinterlace"); 224211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(pParam, &m_sConfigDeinterlace, sizeof(m_sConfigDeinterlace)); 224311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 224411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 224511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexConfigVideoVp8ReferenceFrame: 224611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 224711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_VP8REFERENCEFRAMETYPE); 224811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_VP8REFERENCEFRAMETYPE* pParam = 224911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel reinterpret_cast<OMX_VIDEO_VP8REFERENCEFRAMETYPE*>(configData); 225011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_config: OMX_IndexConfigVideoVp8ReferenceFrame"); 225111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(pParam, &m_sConfigVp8ReferenceFrame, sizeof(m_sConfigVp8ReferenceFrame)); 225211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 225311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 225411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexConfigPerfLevel: 225511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 225611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(configData, OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL); 225711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 perflevel; 225811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL *pParam = 225911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel reinterpret_cast<OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL*>(configData); 226011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_config: OMX_QcomIndexConfigPerfLevel"); 226111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!dev_get_performance_level(&perflevel)) { 226211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid entry returned from get_performance_level %d", 226311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->ePerfLevel); 226411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 226511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->ePerfLevel = (QOMX_VIDEO_PERF_LEVEL)perflevel; 226611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 226711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 226811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 226911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexConfigNumHierPLayers: 227011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 227111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(configData, QOMX_EXTNINDEX_VIDEO_HIER_P_LAYERS); 227211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_EXTNINDEX_VIDEO_HIER_P_LAYERS* pParam = 227311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel reinterpret_cast<QOMX_EXTNINDEX_VIDEO_HIER_P_LAYERS*>(configData); 227411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_config: OMX_QcomIndexConfigNumHierPLayers"); 227511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(pParam, &m_sHPlayers, sizeof(m_sHPlayers)); 227611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 227711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 227811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexConfigQp: 227911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 228011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(configData, OMX_SKYPE_VIDEO_CONFIG_QP); 228111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SKYPE_VIDEO_CONFIG_QP* pParam = 228211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel reinterpret_cast<OMX_SKYPE_VIDEO_CONFIG_QP*>(configData); 228311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_config: OMX_QcomIndexConfigQp"); 228411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(pParam, &m_sConfigQP, sizeof(m_sConfigQP)); 228511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 228611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 228711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexConfigBaseLayerId: 228811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 228911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(configData, OMX_SKYPE_VIDEO_CONFIG_BASELAYERPID); 229011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SKYPE_VIDEO_CONFIG_BASELAYERPID* pParam = 229111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel reinterpret_cast<OMX_SKYPE_VIDEO_CONFIG_BASELAYERPID*>(configData); 229211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_config: OMX_QcomIndexConfigBaseLayerId"); 229311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(pParam, &m_sBaseLayerID, sizeof(m_sBaseLayerID)); 229411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 229511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 229611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef SUPPORT_CONFIG_INTRA_REFRESH 229711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexConfigAndroidIntraRefresh: 229811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 229911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE); 230011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE* pParam = 230111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel reinterpret_cast<OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE*>(configData); 230211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_config: OMX_IndexConfigAndroidIntraRefresh"); 230311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(pParam, &m_sConfigIntraRefresh, sizeof(m_sConfigIntraRefresh)); 230411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 230511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 230611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 230711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QTIIndexConfigVideoBlurResolution: 230811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 230911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VALIDATE_OMX_PARAM_DATA(configData, OMX_QTI_VIDEO_CONFIG_BLURINFO); 231011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QTI_VIDEO_CONFIG_BLURINFO* pParam = 231111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel reinterpret_cast<OMX_QTI_VIDEO_CONFIG_BLURINFO*>(configData); 231211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_config: OMX_QTIIndexConfigVideoBlurResolution"); 231311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(pParam, &m_blurInfo, sizeof(m_blurInfo)); 231411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 231511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 2316fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case OMX_QTIIndexConfigDescribeColorAspects: 2317fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel { 2318fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel VALIDATE_OMX_PARAM_DATA(configData, DescribeColorAspectsParams); 2319fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DescribeColorAspectsParams* pParam = 2320fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel reinterpret_cast<DescribeColorAspectsParams*>(configData); 2321fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_LOW("get_config: OMX_QTIIndexConfigDescribeColorAspects"); 2322fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (pParam->bRequestingDataSpace) { 2323e2b75a9c0959cc95f9c17d7ff183dbe1b210ab43Thierry Strudel DEBUG_PRINT_HIGH("Does not handle dataspace request"); 2324fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return OMX_ErrorUnsupportedSetting; 2325fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 2326fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (pParam->bDataSpaceChanged == OMX_TRUE) { 2327fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 2328fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel print_debug_color_aspects(&(pParam->sAspects), "get_config (dataspace changed) Client says"); 2329fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // If the dataspace says RGB, recommend 601-limited; 2330fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // since that is the destination colorspace that C2D or Venus will convert to. 2331fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (pParam->nPixelFormat == HAL_PIXEL_FORMAT_RGBA_8888) { 2332e2b75a9c0959cc95f9c17d7ff183dbe1b210ab43Thierry Strudel DEBUG_PRINT_HIGH("get_config (dataspace changed): ColorSpace: Recommend 601-limited for RGBA8888"); 2333fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel pParam->sAspects.mPrimaries = ColorAspects::PrimariesBT601_6_625; 2334fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel pParam->sAspects.mRange = ColorAspects::RangeLimited; 2335fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel pParam->sAspects.mTransfer = ColorAspects::TransferSMPTE170M; 2336fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel pParam->sAspects.mMatrixCoeffs = ColorAspects::MatrixBT601_6; 2337fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else { 2338fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // For IMPLEMENTATION_DEFINED (or anything else), stick to client's defaults. 2339e2b75a9c0959cc95f9c17d7ff183dbe1b210ab43Thierry Strudel DEBUG_PRINT_HIGH("get_config (dataspace changed): ColorSpace: use client-default for format=%x", 2340fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel pParam->nPixelFormat); 2341fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 2342fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel print_debug_color_aspects(&(pParam->sAspects), "get_config (dataspace changed) recommended"); 2343fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else { 2344fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel memcpy(pParam, &m_sConfigColorAspects, sizeof(m_sConfigColorAspects)); 2345fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel print_debug_color_aspects(&(pParam->sAspects), "get_config"); 2346fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 2347fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 2348fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 2349fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case OMX_IndexParamAndroidVideoTemporalLayering: 2350fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel { 2351fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_CONFIG_ANDROID_TEMPORALLAYERINGTYPE); 2352fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel OMX_VIDEO_CONFIG_ANDROID_TEMPORALLAYERINGTYPE *layerConfig = 2353fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel (OMX_VIDEO_CONFIG_ANDROID_TEMPORALLAYERINGTYPE *)configData; 2354fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_LOW("get_config: OMX_IndexConfigAndroidVideoTemporalLayering"); 2355fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel memcpy(configData, &m_sConfigTemporalLayers, sizeof(m_sConfigTemporalLayers)); 2356fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 2357fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 2358aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel case OMX_IndexConfigAndroidVendorExtension: 2359aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel { 2360aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel VALIDATE_OMX_PARAM_DATA(configData, OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE); 2361aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 2362aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE *ext = 2363aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel reinterpret_cast<OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE *>(configData); 2364aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel VALIDATE_OMX_VENDOR_EXTENSION_PARAM_DATA(ext); 2365aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel return get_vendor_extension_config(ext); 2366aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel } 2367fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 236811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 2369e2b75a9c0959cc95f9c17d7ff183dbe1b210ab43Thierry Strudel DEBUG_PRINT_HIGH("WARNING: get_config: unsupported index %x", (int) configIndex); 237011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUnsupportedIndex; 237111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 237211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 237311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 237411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 237511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 2376fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#define extn_equals(param, extn) (!strcmp(param, extn)) 2377fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 237811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 237911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 238011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_video::GetExtensionIndex 238111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 238211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 238311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX GetExtensionIndex method implementaion. <TBD> 238411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 238511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 238611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 238711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 238811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 238911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if everything successful. 239011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 239111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 239211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_video::get_extension_index(OMX_IN OMX_HANDLETYPE hComp, 239311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_STRING paramName, 239411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_INDEXTYPE* indexType) 239511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 239611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void)hComp; 239711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) { 239811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Get Extension Index in Invalid State"); 239911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 240011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 240111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef MAX_RES_1080P 2402fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (extn_equals(paramName, "OMX.QCOM.index.param.SliceDeliveryMode")) { 240311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexEnableSliceDeliveryMode; 240411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 240511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 240611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 240711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ICS_ 2408fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (extn_equals(paramName, "OMX.google.android.index.storeMetaDataInBuffers")) { 240911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoMetaBufferMode; 241011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 241111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 241211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 2413fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (extn_equals(paramName, "OMX.google.android.index.prependSPSPPSToIDRFrames")) { 241411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamSequenceHeaderWithIDR; 241511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 241611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 241711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 2418fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (extn_equals(paramName, "OMX.QCOM.index.param.video.HierStructure")) { 241911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexHierarchicalStructure; 242011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 242111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 242211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 2423fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (extn_equals(paramName, "OMX.QCOM.index.param.video.LTRCount")) { 242411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVideoLTRCount; 242511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 242611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 242711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 2428fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (extn_equals(paramName, "OMX.QCOM.index.param.video.LTRPeriod")) { 242911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 243011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 243111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 2432fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (extn_equals(paramName, "OMX.QCOM.index.config.video.LTRUse")) { 243311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexConfigVideoLTRUse; 243411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 243511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 243611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 2437fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (extn_equals(paramName, "OMX.QCOM.index.config.video.LTRMark")) { 243811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexConfigVideoLTRMark; 243911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 244011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 244111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 2442fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (extn_equals(paramName, "OMX.QCOM.index.config.video.hierplayers")) { 244311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexConfigNumHierPLayers; 244411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 244511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 244611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 2447fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (extn_equals(paramName, "OMX.QCOM.index.param.video.baselayerid")) { 244811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexConfigBaseLayerId; 244911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 245011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 245111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 2452fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (extn_equals(paramName, "OMX.QCOM.index.config.video.qp")) { 245311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexConfigQp; 245411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 245511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 245611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 2457fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (extn_equals(paramName, "OMX.QCOM.index.param.video.sar")) { 245811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamVencAspectRatio; 245911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 246011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 246111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 2462fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (extn_equals(paramName, "OMX.QCOM.index.param.video.InputBatch")) { 246311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QcomIndexParamBatchSize; 246411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 246511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 246611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 2467fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (extn_equals(paramName, "OMX.QTI.index.param.video.LowLatency")) { 246811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamLowLatencyMode; 246911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 247011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 247111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 2472fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (extn_equals(paramName, OMX_QTI_INDEX_CONFIG_VIDEO_SETTIMEDATA)) { 247311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_IndexConfigTimePosition; 247411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 247511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 247611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 2477fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (extn_equals(paramName, OMX_QTI_INDEX_PARAM_VIDEO_ENABLE_ROIINFO)) { 247811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QTIIndexParamVideoEnableRoiInfo; 247911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 248011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 248111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 2482fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (extn_equals(paramName, OMX_QTI_INDEX_CONFIG_VIDEO_ROIINFO)) { 248311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QTIIndexConfigVideoRoiInfo; 248411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 248511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 248611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 2487fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (extn_equals(paramName, OMX_QTI_INDEX_CONFIG_VIDEO_BLURINFO)) { 248811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QTIIndexConfigVideoBlurResolution; 248911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 249011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 249111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 2492fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (extn_equals(paramName, "OMX.google.android.index.describeColorAspects")) { 2493fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel *indexType = (OMX_INDEXTYPE)OMX_QTIIndexConfigDescribeColorAspects; 2494fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return OMX_ErrorNone; 2495fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 2496a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel 2497a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel if (extn_equals(paramName, "OMX.google.android.index.allocateNativeHandle")) { 2498a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel *indexType = (OMX_INDEXTYPE)OMX_GoogleAndroidIndexAllocateNativeHandle; 2499a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel return OMX_ErrorNone; 2500a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel } 2501a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel 250211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNotImplemented; 250311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 250411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 250511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 250611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 250711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_video::GetState 250811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 250911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 251011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Returns the state information back to the caller.<TBD> 251111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 251211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 251311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 251411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 251511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 251611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Error None if everything is successful. 251711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 251811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_video::get_state(OMX_IN OMX_HANDLETYPE hComp, 251911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_STATETYPE* state) 252011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 252111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void)hComp; 252211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *state = m_state; 252311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_state: Returning the state %d",*state); 252411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 252511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 252611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 252711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 252811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 252911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_video::ComponentTunnelRequest 253011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 253111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 253211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Component Tunnel Request method implementation. <TBD> 253311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 253411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 253511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 253611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 253711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 253811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if everything successful. 253911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 254011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 254111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_video::component_tunnel_request(OMX_IN OMX_HANDLETYPE hComp, 254211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 254311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE peerComponent, 254411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 peerPort, 254511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup) 254611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 254711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) hComp, (void) port, (void) peerComponent, (void) peerPort, (void) tunnelSetup; 254811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: component_tunnel_request Not Implemented"); 254911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNotImplemented; 255011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 255111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 255211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 255311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 255411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_video::UseInputBuffer 255511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 255611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 255711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Helper function for Use buffer in the input pin 255811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 255911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 256011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 256111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 256211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 256311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 256411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 256511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 256611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_video::use_input_buffer( 256711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE hComp, 256811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 256911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 257011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR appData, 257111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 bytes, 257211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U8* buffer) 257311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 257411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) hComp; 257511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 257611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 257711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i = 0; 257811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned char *buf_addr = NULL; 257911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 258011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("use_input_buffer: port = %u appData = %p bytes = %u buffer = %p",(unsigned int)port,appData,(unsigned int)bytes,buffer); 258111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bytes < m_sInPortDef.nBufferSize) { 258211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: use_input_buffer: Size Mismatch!! " 258311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "bytes[%u] < Port.nBufferSize[%u]", (unsigned int)bytes, (unsigned int)m_sInPortDef.nBufferSize); 258411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 258511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 258611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 258711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_inp_mem_ptr) { 258811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_use_buffer = true; 258911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \ 259011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc( (sizeof(OMX_BUFFERHEADERTYPE)), m_sInPortDef.nBufferCountActual); 259111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_mem_ptr == NULL) { 259211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: calloc() Failed for m_inp_mem_ptr"); 259311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 259411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 259511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Successfully allocated m_inp_mem_ptr = %p", m_inp_mem_ptr); 259611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 259711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 259811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_pmem = (struct pmem *) calloc(sizeof (struct pmem), m_sInPortDef.nBufferCountActual); 259911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_pInput_pmem == NULL) { 260011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: calloc() Failed for m_pInput_pmem"); 260111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 260211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 260311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 260411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_ion = (struct venc_ion *) calloc(sizeof (struct venc_ion), m_sInPortDef.nBufferCountActual); 260511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_pInput_ion == NULL) { 260611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: calloc() Failed for m_pInput_ion"); 260711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 260811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 260911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 261011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 261111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i=0; i< m_sInPortDef.nBufferCountActual; i++) { 261211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_pmem[i].fd = -1; 261311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 261411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_ion[i].ion_device_fd =-1; 261511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_ion[i].fd_ion_data.fd =-1; 261611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_ion[i].ion_alloc_data.handle = 0; 261711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 261811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 261911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 262011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 262111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 262211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i=0; i< m_sInPortDef.nBufferCountActual; i++) { 262311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_ABSENT(&m_inp_bm_count,i)) { 262411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 262511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 262611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 262711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 262811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (i < m_sInPortDef.nBufferCountActual) { 262911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 263011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *bufferHdr = (m_inp_mem_ptr + i); 263111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_inp_bm_count,i); 2632b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara BITMASK_SET(&m_client_in_bm_count,i); 263311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 263411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->pBuffer = (OMX_U8 *)buffer; 263511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->nSize = sizeof(OMX_BUFFERHEADERTYPE); 263611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->nVersion.nVersion = OMX_SPEC_VERSION; 263711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->nAllocLen = m_sInPortDef.nBufferSize; 263811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->pAppPrivate = appData; 263911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->nInputPortIndex = PORT_INDEX_IN; 264011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 264111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_use_input_pmem) { 264211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 264311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_ 264411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_ion[i].ion_device_fd = alloc_map_ion_memory(m_sInPortDef.nBufferSize, 264511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &m_pInput_ion[i].ion_alloc_data, 264611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &m_pInput_ion[i].fd_ion_data, 264711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel secure_session ? SECURE_FLAGS_INPUT_BUFFER : 0); 264811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 264911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_ion[i].ion_device_fd = alloc_map_ion_memory(m_sInPortDef.nBufferSize, 265011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &m_pInput_ion[i].ion_alloc_data, 265111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &m_pInput_ion[i].fd_ion_data, ION_FLAG_CACHED); 265211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 265311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_pInput_ion[i].ion_device_fd < 0) { 265411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:ION device open() Failed"); 265511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 265611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 265711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_pmem[i].fd = m_pInput_ion[i].fd_ion_data.fd; 265811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 265911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_pmem[i].fd = open (MEM_DEVICE,O_RDWR); 266011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_pInput_pmem[i].fd == 0) { 266111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_pmem[i].fd = open (MEM_DEVICE,O_RDWR); 266211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 266311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 266411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_pInput_pmem[i] .fd < 0) { 266511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: /dev/pmem_adsp open() Failed"); 266611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 266711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 266811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 266911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_pmem[i].size = m_sInPortDef.nBufferSize; 267011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_pmem[i].offset = 0; 267111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 26722601808ee2992a94c325d05e4065aba60b01840bThierry Strudel m_pInput_pmem[i].buffer = NULL; 267311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!secure_session) { 267411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_pmem[i].buffer = (unsigned char *)mmap( 267511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel NULL,m_pInput_pmem[i].size,PROT_READ|PROT_WRITE, 267611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel MAP_SHARED,m_pInput_pmem[i].fd,0); 267711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 267811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_pInput_pmem[i].buffer == MAP_FAILED) { 267911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: mmap() Failed"); 26802601808ee2992a94c325d05e4065aba60b01840bThierry Strudel m_pInput_pmem[i].buffer = NULL; 268111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(m_pInput_pmem[i].fd); 268211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 268311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_ion_memory(&m_pInput_ion[i]); 268411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 268511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 268611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 268711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 268811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 268911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 269011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pParam = reinterpret_cast<OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *>((*bufferHdr)->pAppPrivate); 269111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Inside qcom_ext with luma:(fd:%lu,offset:0x%x)", pParam->pmem_fd, (unsigned)pParam->offset); 269211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 269311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam) { 269411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_pmem[i].fd = pParam->pmem_fd; 269511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_pmem[i].offset = pParam->offset; 269611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_pmem[i].size = m_sInPortDef.nBufferSize; 269711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_pmem[i].buffer = (unsigned char *)buffer; 269811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("DBG:: pParam->pmem_fd = %u, pParam->offset = %u", 269911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)pParam->pmem_fd, (unsigned int)pParam->offset); 270011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 270111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Invalid AppData given for PMEM i/p UseBuffer case"); 270211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 270311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 270411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 270511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 270611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("use_inp:: bufhdr = %p, pBuffer = %p, m_pInput_pmem[i].buffer = %p", 270711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr), (*bufferHdr)->pBuffer, m_pInput_pmem[i].buffer); 270811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( dev_use_buf(&m_pInput_pmem[i],PORT_INDEX_IN,i) != true) { 270911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: dev_use_buf() Failed for i/p buf"); 271011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 271111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 271211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 271311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: All buffers are already used, invalid use_buf call for " 271411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "index = %u", i); 271511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 271611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 271711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 271811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 271911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 272011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 272111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 272211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 272311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 272411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 272511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_video::UseOutputBuffer 272611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 272711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 272811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Helper function for Use buffer in the input pin 272911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 273011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 273111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 273211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 273311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 273411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 273511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 273611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 273711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_video::use_output_buffer( 273811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE hComp, 273911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 274011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 274111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR appData, 274211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 bytes, 274311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U8* buffer) 274411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 274511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void)hComp, (void)port; 274611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 274711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header 274811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i= 0; // Temporary counter 274911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned char *buf_addr = NULL; 275011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_ 275111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int align_size; 275211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 275311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 275411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Inside use_output_buffer()"); 275511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bytes < m_sOutPortDef.nBufferSize) { 275611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: use_output_buffer: Size Mismatch!! " 275711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "bytes[%u] < Port.nBufferSize[%u]", (unsigned int)bytes, (unsigned int)m_sOutPortDef.nBufferSize); 275811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 275911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 276011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 276111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_out_mem_ptr) { 276211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_use_buffer = true; 276311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int nBufHdrSize = 0; 276411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 276511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Allocating First Output Buffer(%u)",(unsigned int)m_sOutPortDef.nBufferCountActual); 276611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nBufHdrSize = m_sOutPortDef.nBufferCountActual * sizeof(OMX_BUFFERHEADERTYPE); 276711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* 276811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Memory for output side involves the following: 276911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 1. Array of Buffer Headers 277011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 2. Bitmask array to hold the buffer allocation details 277111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * In order to minimize the memory management entire allocation 277211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * is done in one step. 277311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 277411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //OMX Buffer header 277511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr = (OMX_BUFFERHEADERTYPE *)calloc(nBufHdrSize,1); 277611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_out_mem_ptr == NULL) { 277711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: calloc() Failed for m_out_mem_ptr"); 277811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 277911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 278011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 278111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_pmem = (struct pmem *) calloc(sizeof (struct pmem), m_sOutPortDef.nBufferCountActual); 278211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_pOutput_pmem == NULL) { 278311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: calloc() Failed for m_pOutput_pmem"); 278411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 278511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 278611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 278711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_ion = (struct venc_ion *) calloc(sizeof (struct venc_ion), m_sOutPortDef.nBufferCountActual); 278811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_pOutput_ion == NULL) { 278911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: calloc() Failed for m_pOutput_ion"); 279011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 279111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 279211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 279311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_out_mem_ptr) { 279411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr = m_out_mem_ptr; 279511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Memory Allocation Succeeded for OUT port%p",m_out_mem_ptr); 279611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Settting the entire storage nicely 279711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i=0; i < m_sOutPortDef.nBufferCountActual ; i++) { 279811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE); 279911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nVersion.nVersion = OMX_SPEC_VERSION; 280011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nAllocLen = bytes; 280111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nFilledLen = 0; 280211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->pAppPrivate = appData; 280311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nOutputPortIndex = PORT_INDEX_OUT; 280411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->pBuffer = NULL; 280511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr++; 280611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_pmem[i].fd = -1; 280711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 280811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_ion[i].ion_device_fd =-1; 280911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_ion[i].fd_ion_data.fd=-1; 281011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_ion[i].ion_alloc_data.handle = 0; 281111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 281211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 281311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 281411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Output buf mem alloc failed[0x%p]",m_out_mem_ptr); 281511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 281611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 281711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 281811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 281911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i=0; i< m_sOutPortDef.nBufferCountActual; i++) { 282011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_ABSENT(&m_out_bm_count,i)) { 282111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 282211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 282311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 282411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 282511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) { 282611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (i < m_sOutPortDef.nBufferCountActual) { 282711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *bufferHdr = (m_out_mem_ptr + i ); 282811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->pBuffer = (OMX_U8 *)buffer; 282911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->pAppPrivate = appData; 283011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 283111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_use_output_pmem) { 283211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 283311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_ 283411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel align_size = (m_sOutPortDef.nBufferSize + (SZ_4K - 1)) & ~(SZ_4K - 1); 283511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_ion[i].ion_device_fd = alloc_map_ion_memory(align_size, 283611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &m_pOutput_ion[i].ion_alloc_data, 283711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &m_pOutput_ion[i].fd_ion_data, 283811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel secure_session ? SECURE_FLAGS_OUTPUT_BUFFER : 0); 283911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 284011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_ion[i].ion_device_fd = alloc_map_ion_memory( 284111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sOutPortDef.nBufferSize, 284211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &m_pOutput_ion[i].ion_alloc_data, 284311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &m_pOutput_ion[i].fd_ion_data, ION_FLAG_CACHED); 284411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 284511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_pOutput_ion[i].ion_device_fd < 0) { 284611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:ION device open() Failed"); 284711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 284811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 284911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_pmem[i].fd = m_pOutput_ion[i].fd_ion_data.fd; 285011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 285111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_pmem[i].fd = open (MEM_DEVICE,O_RDWR); 285211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 285311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_pOutput_pmem[i].fd == 0) { 285411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_pmem[i].fd = open (MEM_DEVICE,O_RDWR); 285511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 285611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 285711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_pOutput_pmem[i].fd < 0) { 285811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: /dev/pmem_adsp open() Failed"); 285911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 286011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 286111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 286211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_pmem[i].size = m_sOutPortDef.nBufferSize; 286311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_pmem[i].offset = 0; 286411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 28652601808ee2992a94c325d05e4065aba60b01840bThierry Strudel m_pOutput_pmem[i].buffer = NULL; 286611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!secure_session) { 286711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_ 286811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_pmem[i].buffer = (unsigned char *)mmap(NULL, 286911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel align_size,PROT_READ|PROT_WRITE, 287011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel MAP_SHARED,m_pOutput_pmem[i].fd,0); 287111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 287211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_pmem[i].buffer = (unsigned char *)mmap(NULL, 287311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_pmem[i].size,PROT_READ|PROT_WRITE, 287411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel MAP_SHARED,m_pOutput_pmem[i].fd,0); 287511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 287611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_pOutput_pmem[i].buffer == MAP_FAILED) { 287711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: mmap() Failed"); 28782601808ee2992a94c325d05e4065aba60b01840bThierry Strudel m_pOutput_pmem[i].buffer = NULL; 287911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(m_pOutput_pmem[i].fd); 288011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 288111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_ion_memory(&m_pOutput_ion[i]); 288211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 288311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 288411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 288511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 288611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 288711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *pParam = reinterpret_cast<OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO*>((*bufferHdr)->pAppPrivate); 288811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Inside qcom_ext pParam: %p", pParam); 288911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 289011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam) { 289111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Inside qcom_ext with luma:(fd:%lu,offset:0x%x)", pParam->pmem_fd, (int)pParam->offset); 289211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_pmem[i].fd = pParam->pmem_fd; 289311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_pmem[i].offset = pParam->offset; 289411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_pmem[i].size = m_sOutPortDef.nBufferSize; 289511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_pmem[i].buffer = (unsigned char *)buffer; 289611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 289711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Invalid AppData given for PMEM o/p UseBuffer case"); 289811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 289911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 290011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_addr = (unsigned char *)buffer; 290111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 290211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 290311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("use_out:: bufhdr = %p, pBuffer = %p, m_pOutput_pmem[i].buffer = %p", 290411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr), (*bufferHdr)->pBuffer, m_pOutput_pmem[i].buffer); 290511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dev_use_buf(&m_pOutput_pmem[i],PORT_INDEX_OUT,i) != true) { 290611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: dev_use_buf Failed for o/p buf"); 290711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 290811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 290911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 291011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_out_bm_count,i); 2911b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara BITMASK_SET(&m_client_out_bm_count,i); 291211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 291311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: All o/p Buffers have been Used, invalid use_buf call for " 291411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "index = %u", i); 291511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 291611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 291711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 291811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 291911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 292011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 292111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 292211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 292311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 292411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_video::UseBuffer 292511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 292611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 292711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Use Buffer method implementation. 292811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 292911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 293011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 293111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 293211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 293311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None , if everything successful. 293411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 293511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 293611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_video::use_buffer( 293711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE hComp, 293811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 293911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 294011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR appData, 294111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 bytes, 294211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U8* buffer) 294311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 294411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 294511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) { 294611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Use Buffer in Invalid State"); 294711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 294811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 2949b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara 2950b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara auto_lock l(m_buf_lock); 295111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (port == PORT_INDEX_IN) { 295211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = use_input_buffer(hComp,bufferHdr,port,appData,bytes,buffer); 295311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (port == PORT_INDEX_OUT) { 295411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = use_output_buffer(hComp,bufferHdr,port,appData,bytes,buffer); 295511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 295611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Invalid Port Index received %d",(int)port); 295711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 295811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 295911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) { 296011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (allocate_done()) { 296111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) { 296211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Send the callback now 296311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING); 296411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandStateSet,OMX_StateIdle, 296511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 296611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 296711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 296811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (port == PORT_INDEX_IN && m_sInPortDef.bPopulated) { 296911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) { 297011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING); 297111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortEnable, 297211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PORT_INDEX_IN, 297311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 297411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 297511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 297611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (port == PORT_INDEX_OUT && m_sOutPortDef.bPopulated) { 297711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) { 297811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 297911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortEnable, 298011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PORT_INDEX_OUT, 298111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 298211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_event_port_settings_sent = false; 298311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 298411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 298511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 298611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 298711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 298811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 298911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_video::free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr) 299011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 299111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int index = 0; 299211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 *temp_buff ; 299311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 299411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bufferHdr == NULL || m_inp_mem_ptr == NULL) { 299511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: free_input: Invalid bufferHdr[%p] or m_inp_mem_ptr[%p]", 299611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufferHdr, m_inp_mem_ptr); 299711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 299811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 299911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 300011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel index = bufferHdr - ((!meta_mode_enable)?m_inp_mem_ptr:meta_buffer_hdr); 300111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ICS_ 300211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (meta_mode_enable) { 300311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (index < m_sInPortDef.nBufferCountActual) { 300411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&meta_buffer_hdr[index], 0, sizeof(meta_buffer_hdr[index])); 300511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&meta_buffers[index], 0, sizeof(meta_buffers[index])); 300611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 300711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!mUseProxyColorFormat) 300811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 300911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else { 301011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel c2d_conv.close(); 301111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel opaque_buffer_hdr[index] = NULL; 301211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 301311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 301411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 301511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (index < m_sInPortDef.nBufferCountActual && !mUseProxyColorFormat && 301611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dev_free_buf(&m_pInput_pmem[index],PORT_INDEX_IN) != true) { 301711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("ERROR: dev_free_buf() Failed for i/p buf"); 301811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 301911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 302011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (index < m_sInPortDef.nBufferCountActual && m_pInput_pmem) { 302111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 3022aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel if (mUseProxyColorFormat) { 3023aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel if (m_opq_pmem_q.m_size) { 3024aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel unsigned long addr, p1, id; 3025aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel m_opq_pmem_q.pop_entry(&addr, &p1, &id); 3026aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel DEBUG_PRINT_LOW("Removed entry in m_opq_pmem_q: address %lu", addr); 3027aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel } 3028aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel } 3029aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 303011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_pInput_pmem[index].fd > 0 && input_use_buffer == false) { 303111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("FreeBuffer:: i/p AllocateBuffer case"); 303211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!secure_session) { 303311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel munmap (m_pInput_pmem[index].buffer,m_pInput_pmem[index].size); 303411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 303511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(m_pInput_pmem[index].buffer); 303611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 303711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_pmem[index].buffer = NULL; 303811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close (m_pInput_pmem[index].fd); 303911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 304011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_ion_memory(&m_pInput_ion[index]); 304111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 304211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_pmem[index].fd = -1; 304311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_pInput_pmem[index].fd > 0 && (input_use_buffer == true && 304411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_use_input_pmem == OMX_FALSE)) { 304511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("FreeBuffer:: i/p Heap UseBuffer case"); 304611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dev_free_buf(&m_pInput_pmem[index],PORT_INDEX_IN) != true) { 304711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: dev_free_buf() Failed for i/p buf"); 304811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 304911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!secure_session) { 305011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel munmap (m_pInput_pmem[index].buffer,m_pInput_pmem[index].size); 305111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_pmem[index].buffer = NULL; 305211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 305311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close (m_pInput_pmem[index].fd); 305411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 305511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_ion_memory(&m_pInput_ion[index]); 305611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 305711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_pmem[index].fd = -1; 305811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 305911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("FreeBuffer:: fd is invalid or i/p PMEM UseBuffer case"); 306011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 306111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 306211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 306311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 306411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 306511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_video::free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr) 306611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 306711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int index = 0; 306811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 *temp_buff ; 306911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 307011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bufferHdr == NULL || m_out_mem_ptr == NULL) { 307111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: free_output: Invalid bufferHdr[%p] or m_out_mem_ptr[%p]", 307211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufferHdr, m_out_mem_ptr); 307311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 307411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 307511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel index = bufferHdr - m_out_mem_ptr; 307611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 307711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (index < m_sOutPortDef.nBufferCountActual && 307811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dev_free_buf(&m_pOutput_pmem[index],PORT_INDEX_OUT) != true) { 307911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: dev_free_buf Failed for o/p buf"); 308011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 308111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 308211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (index < m_sOutPortDef.nBufferCountActual && m_pOutput_pmem) { 308311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_pOutput_pmem[index].fd > 0 && output_use_buffer == false ) { 308411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("FreeBuffer:: o/p AllocateBuffer case"); 308511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!secure_session) { 308611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel munmap (m_pOutput_pmem[index].buffer, 308711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_pmem[index].size); 308811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 3089a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel if (allocate_native_handle) { 3090a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel native_handle_t *handle = NULL; 3091a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel handle = (native_handle_t *)m_pOutput_pmem[index].buffer; 3092a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel native_handle_close(handle); 3093a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel native_handle_delete(handle); 3094a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel } else { 3095a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel char *data = (char*) m_pOutput_pmem[index].buffer; 3096a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel native_handle_t *handle = NULL; 3097a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel memcpy(&handle, data + sizeof(OMX_U32), sizeof(native_handle_t*)); 3098a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel native_handle_delete(handle); 3099a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel free(m_pOutput_pmem[index].buffer); 3100a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel } 310111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 310211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close (m_pOutput_pmem[index].fd); 310311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 310411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_ion_memory(&m_pOutput_ion[index]); 310511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 310611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_pmem[index].fd = -1; 310711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ( m_pOutput_pmem[index].fd > 0 && (output_use_buffer == true 310811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && m_use_output_pmem == OMX_FALSE)) { 310911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("FreeBuffer:: o/p Heap UseBuffer case"); 311011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dev_free_buf(&m_pOutput_pmem[index],PORT_INDEX_OUT) != true) { 311111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: dev_free_buf Failed for o/p buf"); 311211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 311311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!secure_session) { 311411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel munmap (m_pOutput_pmem[index].buffer, 311511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_pmem[index].size); 311611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 311711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close (m_pOutput_pmem[index].fd); 311811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 311911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_ion_memory(&m_pOutput_ion[index]); 312011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 312111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_pmem[index].fd = -1; 312211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 312311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("FreeBuffer:: fd is invalid or o/p PMEM UseBuffer case"); 312411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 312511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 312611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 312711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 312811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ICS_ 312911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_video::allocate_input_meta_buffer( 313011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_HANDLETYPE hComp, 313111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE **bufferHdr, 313211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PTR appData, 313311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 bytes) 313411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 313511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned index = 0; 313611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // In meta-mode alloc-length is not known conclusively 313711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Allow allocation for atleast gralloc metadata handles 313811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // and check for size in ETB 313911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!bufferHdr || bytes < sizeof(VideoGrallocMetadata)) { 314011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("wrong params allocate_input_meta_buffer Hdr %p len %u", 314111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufferHdr, (unsigned int)bytes); 314211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 314311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 314411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 314511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_inp_mem_ptr && !mUseProxyColorFormat) { 314611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_mem_ptr = meta_buffer_hdr; 314711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("use meta_buffer_hdr (%p) as m_inp_mem_ptr = %p", 314811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel meta_buffer_hdr, m_inp_mem_ptr); 314911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 315011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (index = 0; ((index < m_sInPortDef.nBufferCountActual) && 3151a353607795ce19c8ca306a7b57ab8f3513e64f30Thierry Strudel meta_buffer_hdr[index].pBuffer && 3152a353607795ce19c8ca306a7b57ab8f3513e64f30Thierry Strudel BITMASK_PRESENT(&m_inp_bm_count, index)); index++); 3153a353607795ce19c8ca306a7b57ab8f3513e64f30Thierry Strudel 315411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (index == m_sInPortDef.nBufferCountActual) { 315511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("All buffers are allocated input_meta_buffer"); 315611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 315711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 315811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (mUseProxyColorFormat) { 315911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (opaque_buffer_hdr[index]) { 316011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("All buffers are allocated opaque_buffer_hdr"); 316111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 316211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 316311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (allocate_input_buffer(hComp,&opaque_buffer_hdr[index], 316411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PORT_INDEX_IN,appData,m_sInPortDef.nBufferSize) != OMX_ErrorNone) { 316511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("All buffers are allocated opaque_buffer_hdr"); 316611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 316711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 316811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 316911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_inp_bm_count,index); 317011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *bufferHdr = &meta_buffer_hdr[index]; 317111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&meta_buffer_hdr[index], 0, sizeof(meta_buffer_hdr[index])); 317211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel meta_buffer_hdr[index].nSize = sizeof(meta_buffer_hdr[index]); 317311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel meta_buffer_hdr[index].nAllocLen = bytes; 317411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel meta_buffer_hdr[index].nVersion.nVersion = OMX_SPEC_VERSION; 317511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel meta_buffer_hdr[index].nInputPortIndex = PORT_INDEX_IN; 317611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel meta_buffer_hdr[index].pBuffer = (OMX_U8*)&meta_buffers[index]; 317711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel meta_buffer_hdr[index].pAppPrivate = appData; 317811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (mUseProxyColorFormat) { 317911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_opq_pmem_q.insert_entry((unsigned long)opaque_buffer_hdr[index],0,0); 318011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("opaque_buffer_hdr insert %p", opaque_buffer_hdr[index]); 318111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 318211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 318311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 318411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 318511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 318611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 318711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_venc::AllocateInputBuffer 318811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 318911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 319011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Helper function for allocate buffer in the input pin 319111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 319211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 319311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 319411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 319511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 319611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 319711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 319811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 319911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_video::allocate_input_buffer( 320011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE hComp, 320111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 320211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 320311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR appData, 320411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 bytes) 320511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 320611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void)hComp, (void)port; 320711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 320811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i = 0; 320911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 321011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("allocate_input_buffer()::"); 321111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bytes < m_sInPortDef.nBufferSize) { 321211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Buffer size mismatch error: bytes[%u] < nBufferSize[%u]", 321311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)bytes, (unsigned int)m_sInPortDef.nBufferSize); 321411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 321511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 321611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 321711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_inp_mem_ptr) { 321811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("%s: size = %u, actual cnt %u", __FUNCTION__, 321911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)m_sInPortDef.nBufferSize, (unsigned int)m_sInPortDef.nBufferCountActual); 322011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_inp_mem_ptr = (OMX_BUFFERHEADERTYPE*) \ 322111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc( (sizeof(OMX_BUFFERHEADERTYPE)), m_sInPortDef.nBufferCountActual); 322211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_mem_ptr == NULL) { 322311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: calloc() Failed for m_inp_mem_ptr"); 322411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 322511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 322611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 322711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Successfully allocated m_inp_mem_ptr = %p", m_inp_mem_ptr); 322811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_pmem = (struct pmem *) calloc(sizeof (struct pmem), m_sInPortDef.nBufferCountActual); 322911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 323011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_pInput_pmem == NULL) { 323111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: calloc() Failed for m_pInput_pmem"); 323211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 323311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 323411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 323511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_ion = (struct venc_ion *) calloc(sizeof (struct venc_ion), m_sInPortDef.nBufferCountActual); 323611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_pInput_ion == NULL) { 323711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: calloc() Failed for m_pInput_ion"); 323811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 323911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 324011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 324111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i=0; i< m_sInPortDef.nBufferCountActual; i++) { 324211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_pmem[i].fd = -1; 324311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 324411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_ion[i].ion_device_fd =-1; 324511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_ion[i].fd_ion_data.fd =-1; 324611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_ion[i].ion_alloc_data.handle = 0; 324711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 324811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 324911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 325011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 325111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i=0; i< m_sInPortDef.nBufferCountActual; i++) { 325211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_ABSENT(&m_inp_bm_count,i)) { 325311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 325411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 325511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 325611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (i < m_sInPortDef.nBufferCountActual) { 325711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 325811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *bufferHdr = (m_inp_mem_ptr + i); 325911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->nSize = sizeof(OMX_BUFFERHEADERTYPE); 326011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->nVersion.nVersion = OMX_SPEC_VERSION; 326111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->nAllocLen = m_sInPortDef.nBufferSize; 326211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->pAppPrivate = appData; 326311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->nInputPortIndex = PORT_INDEX_IN; 326411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // make fd available to app layer, help with testing 326511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->pInputPortPrivate = (OMX_PTR)&m_pInput_pmem[i]; 326611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 326711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 326811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_ 326911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_ion[i].ion_device_fd = alloc_map_ion_memory(m_sInPortDef.nBufferSize, 327011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &m_pInput_ion[i].ion_alloc_data, 327111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &m_pInput_ion[i].fd_ion_data, 327211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel secure_session ? SECURE_FLAGS_INPUT_BUFFER : 0); 327311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 327411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_ion[i].ion_device_fd = alloc_map_ion_memory(m_sInPortDef.nBufferSize, 327511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &m_pInput_ion[i].ion_alloc_data, 327611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &m_pInput_ion[i].fd_ion_data, ION_FLAG_CACHED); 327711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 327811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_pInput_ion[i].ion_device_fd < 0) { 327911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:ION device open() Failed"); 328011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 328111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 328211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 328311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_pmem[i].fd = m_pInput_ion[i].fd_ion_data.fd; 328411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 328511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_pmem[i].fd = open (MEM_DEVICE,O_RDWR); 328611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 328711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_pInput_pmem[i].fd == 0) { 328811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_pmem[i].fd = open (MEM_DEVICE,O_RDWR); 328911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 329011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 329111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_pInput_pmem[i].fd < 0) { 329211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: /dev/pmem_adsp open() Failed"); 329311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 329411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 329511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 329611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_pmem[i].size = m_sInPortDef.nBufferSize; 329711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_pmem[i].offset = 0; 329811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 32992601808ee2992a94c325d05e4065aba60b01840bThierry Strudel m_pInput_pmem[i].buffer = NULL; 330011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!secure_session) { 330111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_pmem[i].buffer = (unsigned char *)mmap(NULL, 330211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_pmem[i].size,PROT_READ|PROT_WRITE, 330311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel MAP_SHARED,m_pInput_pmem[i].fd,0); 330411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_pInput_pmem[i].buffer == MAP_FAILED) { 330511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: mmap FAILED= %d", errno); 33062601808ee2992a94c325d05e4065aba60b01840bThierry Strudel m_pInput_pmem[i].buffer = NULL; 330711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(m_pInput_pmem[i].fd); 330811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 330911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_ion_memory(&m_pInput_ion[i]); 331011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 331111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 331211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 331311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 331411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //This should only be used for passing reference to source type and 331511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //secure handle fd struct native_handle_t* 331611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_pmem[i].buffer = malloc(sizeof(OMX_U32) + sizeof(native_handle_t*)); 33172601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (m_pInput_pmem[i].buffer == NULL) { 33182601808ee2992a94c325d05e4065aba60b01840bThierry Strudel DEBUG_PRINT_ERROR("%s: failed to allocate native-handle", __func__); 33192601808ee2992a94c325d05e4065aba60b01840bThierry Strudel return OMX_ErrorInsufficientResources; 33202601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 33212601808ee2992a94c325d05e4065aba60b01840bThierry Strudel (*bufferHdr)->nAllocLen = sizeof(OMX_U32) + sizeof(native_handle_t*); 332211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 332311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 332411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->pBuffer = (OMX_U8 *)m_pInput_pmem[i].buffer; 332511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Virtual address in allocate buffer is %p", m_pInput_pmem[i].buffer); 332611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_inp_bm_count,i); 332711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //here change the I/P param here from buf_adr to pmem 332811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!mUseProxyColorFormat && (dev_use_buf(&m_pInput_pmem[i],PORT_INDEX_IN,i) != true)) { 332911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: dev_use_buf FAILED for i/p buf"); 333011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 333111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 333211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 333311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: All i/p buffers are allocated, invalid allocate buf call" 333411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "for index [%d]", i); 333511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 333611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 333711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 333811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 333911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 334011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 334111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 334211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 334311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 334411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_venc::AllocateOutputBuffer 334511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 334611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 334711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Helper fn for AllocateBuffer in the output pin 334811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 334911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 335011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 335111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 335211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 335311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if everything went well. 335411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 335511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 335611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_video::allocate_output_buffer( 335711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE hComp, 335811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 335911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 336011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR appData, 336111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 bytes) 336211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 336311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void)hComp, (void)port; 336411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 336511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *bufHdr= NULL; // buffer header 336611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i= 0; // Temporary counter 336711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_ 336811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int align_size; 336911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 337011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("allocate_output_buffer()for %u bytes", (unsigned int)bytes); 337111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_out_mem_ptr) { 337211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int nBufHdrSize = 0; 337311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("%s: size = %u, actual cnt %u", __FUNCTION__, 337411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)m_sOutPortDef.nBufferSize, (unsigned int)m_sOutPortDef.nBufferCountActual); 337511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nBufHdrSize = m_sOutPortDef.nBufferCountActual * sizeof(OMX_BUFFERHEADERTYPE); 337611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 337711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* 337811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Memory for output side involves the following: 337911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 1. Array of Buffer Headers 338011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 2. Bitmask array to hold the buffer allocation details 338111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * In order to minimize the memory management entire allocation 338211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * is done in one step. 338311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 338411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr = (OMX_BUFFERHEADERTYPE *)calloc(nBufHdrSize,1); 338511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 338611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 338711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_ion = (struct venc_ion *) calloc(sizeof (struct venc_ion), m_sOutPortDef.nBufferCountActual); 338811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_pOutput_ion == NULL) { 338911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: calloc() Failed for m_pOutput_ion"); 339011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 339111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 339211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 339311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_pmem = (struct pmem *) calloc(sizeof(struct pmem), m_sOutPortDef.nBufferCountActual); 339411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_pOutput_pmem == NULL) { 339511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: calloc() Failed for m_pOutput_pmem"); 339611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 339711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 339811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_out_mem_ptr && m_pOutput_pmem) { 339911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr = m_out_mem_ptr; 340011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 340111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i=0; i < m_sOutPortDef.nBufferCountActual ; i++) { 340211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nSize = sizeof(OMX_BUFFERHEADERTYPE); 340311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nVersion.nVersion = OMX_SPEC_VERSION; 340411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Set the values when we determine the right HxW param 340511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nAllocLen = bytes; 340611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nFilledLen = 0; 340711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->pAppPrivate = appData; 340811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->nOutputPortIndex = PORT_INDEX_OUT; 340911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // make fd available to app layer, help with testing 341011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->pOutputPortPrivate = (OMX_PTR)&m_pOutput_pmem[i]; 341111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr->pBuffer = NULL; 341211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufHdr++; 341311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_pmem[i].fd = -1; 341411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 341511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_ion[i].ion_device_fd =-1; 341611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_ion[i].fd_ion_data.fd=-1; 341711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_ion[i].ion_alloc_data.handle = 0; 341811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 341911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 342011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 342111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: calloc() failed for m_out_mem_ptr/m_pOutput_pmem"); 342211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInsufficientResources; 342311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 342411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 342511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 342611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("actual cnt = %u", (unsigned int)m_sOutPortDef.nBufferCountActual); 342711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i=0; i< m_sOutPortDef.nBufferCountActual; i++) { 342811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_ABSENT(&m_out_bm_count,i)) { 342911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Found a Free Output Buffer %d",i); 343011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 343111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 343211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 343311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) { 343411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (i < m_sOutPortDef.nBufferCountActual) { 343511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 343611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_ 34372601808ee2992a94c325d05e4065aba60b01840bThierry Strudel align_size = ALIGN(m_sOutPortDef.nBufferSize, 4096); 343811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_ion[i].ion_device_fd = alloc_map_ion_memory(align_size, 343911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &m_pOutput_ion[i].ion_alloc_data, 344011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &m_pOutput_ion[i].fd_ion_data, 344111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel secure_session ? SECURE_FLAGS_OUTPUT_BUFFER : ION_FLAG_CACHED); 344211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 344311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_ion[i].ion_device_fd = alloc_map_ion_memory(m_sOutPortDef.nBufferSize, 344411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &m_pOutput_ion[i].ion_alloc_data, 344511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &m_pOutput_ion[i].fd_ion_data, ION_FLAG_CACHED); 344611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 344711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_pOutput_ion[i].ion_device_fd < 0) { 344811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR:ION device open() Failed"); 344911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 345011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 345111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 345211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_pmem[i].fd = m_pOutput_ion[i].fd_ion_data.fd; 345311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 345411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_pmem[i].fd = open (MEM_DEVICE,O_RDWR); 345511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_pOutput_pmem[i].fd == 0) { 345611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_pmem[i].fd = open (MEM_DEVICE,O_RDWR); 345711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 345811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 345911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_pOutput_pmem[i].fd < 0) { 346011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: /dev/pmem_adsp open() failed"); 346111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 346211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 346311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 346411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_pmem[i].size = m_sOutPortDef.nBufferSize; 346511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_pmem[i].offset = 0; 346611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 34672601808ee2992a94c325d05e4065aba60b01840bThierry Strudel m_pOutput_pmem[i].buffer = NULL; 34682601808ee2992a94c325d05e4065aba60b01840bThierry Strudel *bufferHdr = (m_out_mem_ptr + i ); 34692601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 347011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!secure_session) { 347111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_ 347211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_pmem[i].buffer = (unsigned char *)mmap(NULL, 347311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel align_size,PROT_READ|PROT_WRITE, 347411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel MAP_SHARED,m_pOutput_pmem[i].fd,0); 347511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 347611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_pmem[i].buffer = (unsigned char *)mmap(NULL, 347711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_pmem[i].size,PROT_READ|PROT_WRITE, 347811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel MAP_SHARED,m_pOutput_pmem[i].fd,0); 347911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 348011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_pOutput_pmem[i].buffer == MAP_FAILED) { 348111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: MMAP_FAILED in o/p alloc buffer"); 34822601808ee2992a94c325d05e4065aba60b01840bThierry Strudel m_pOutput_pmem[i].buffer = NULL; 348311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close (m_pOutput_pmem[i].fd); 348411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 348511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_ion_memory(&m_pOutput_ion[i]); 348611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 348711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 348811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 348911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 349011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else { 349111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //This should only be used for passing reference to source type and 349211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //secure handle fd struct native_handle_t* 3493a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel if (allocate_native_handle) { 3494a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel native_handle_t *nh = native_handle_create(1 /*numFds*/, 3 /*numInts*/); 3495a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel if (!nh) { 3496a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel DEBUG_PRINT_ERROR("Native handle create failed"); 3497a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel return OMX_ErrorInsufficientResources; 3498a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel } 3499a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel nh->data[0] = m_pOutput_pmem[i].fd; 3500a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel nh->data[1] = 0; 3501a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel nh->data[2] = 0; 3502a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel nh->data[3] = ALIGN(m_sOutPortDef.nBufferSize, 4096); 3503a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel m_pOutput_pmem[i].buffer = (OMX_U8 *)nh; 3504a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel } else { 3505a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel native_handle_t *handle = native_handle_create(1, 3); //fd, offset, size, alloc length 3506a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel if (!handle) { 3507a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel DEBUG_PRINT_ERROR("ERROR: native handle creation failed"); 3508a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel return OMX_ErrorInsufficientResources; 3509a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel } 3510a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel m_pOutput_pmem[i].buffer = malloc(sizeof(output_metabuffer)); 3511a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel if (m_pOutput_pmem[i].buffer == NULL) { 3512a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel DEBUG_PRINT_ERROR("%s: Failed to allocate meta buffer", __func__); 3513a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel return OMX_ErrorInsufficientResources; 3514a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel } 3515a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel (*bufferHdr)->nAllocLen = sizeof(output_metabuffer); 3516a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel handle->data[0] = m_pOutput_pmem[i].fd; 3517a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel handle->data[1] = 0; 3518a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel handle->data[2] = 0; 3519a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel handle->data[3] = ALIGN(m_sOutPortDef.nBufferSize, 4096); 3520a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel output_metabuffer *buffer = (output_metabuffer*) m_pOutput_pmem[i].buffer; 3521a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel buffer->type = 1; 3522a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel buffer->nh = handle; 35232601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 352411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 352511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 352611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->pBuffer = (OMX_U8 *)m_pOutput_pmem[i].buffer; 352711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*bufferHdr)->pAppPrivate = appData; 352811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 352911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_SET(&m_out_bm_count,i); 353011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 353111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dev_use_buf(&m_pOutput_pmem[i],PORT_INDEX_OUT,i) != true) { 353211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: dev_use_buf FAILED for o/p buf"); 353311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 353411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 353511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 353611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: All o/p buffers are allocated, invalid allocate buf call" 353711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "for index [%d] actual: %u", i, (unsigned int)m_sOutPortDef.nBufferCountActual); 353811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 353911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 354011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 354111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 354211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 354311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 354411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 354511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// AllocateBuffer -- API Call 354611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 354711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 354811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_video::AllocateBuffer 354911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 355011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 355111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Returns zero if all the buffers released.. 355211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 355311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 355411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 355511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 355611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 355711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 355811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 355911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 356011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_video::allocate_buffer(OMX_IN OMX_HANDLETYPE hComp, 356111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 356211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 356311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR appData, 356411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 bytes) 356511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 356611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 356711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; // OMX return type 356811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 356911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Allocate buffer of size = %u on port %d", (unsigned int)bytes, (int)port); 357011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) { 357111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Allocate Buf in Invalid State"); 357211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 357311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 3574b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara auto_lock l(m_buf_lock); 357511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // What if the client calls again. 357611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (port == PORT_INDEX_IN) { 357711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ICS_ 357811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (meta_mode_enable) 357911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = allocate_input_meta_buffer(hComp,bufferHdr,appData,bytes); 358011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 358111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 358211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = allocate_input_buffer(hComp,bufferHdr,port,appData,bytes); 358311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (port == PORT_INDEX_OUT) { 358411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = allocate_output_buffer(hComp,bufferHdr,port,appData,bytes); 358511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 358611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Invalid Port Index received %d",(int)port); 358711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 358811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 358911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Checking for Output Allocate buffer Done"); 359011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eRet == OMX_ErrorNone) { 359111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (allocate_done()) { 359211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) { 359311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Send the callback now 359411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_IDLE_PENDING); 359511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandStateSet,OMX_StateIdle, 359611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 359711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 359811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 359911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (port == PORT_INDEX_IN && m_sInPortDef.bPopulated) { 360011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_INPUT_ENABLE_PENDING)) { 360111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_ENABLE_PENDING); 360211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortEnable, 360311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PORT_INDEX_IN, 360411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 360511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 360611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 360711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (port == PORT_INDEX_OUT && m_sOutPortDef.bPopulated) { 360811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&m_flags,OMX_COMPONENT_OUTPUT_ENABLE_PENDING)) { 360911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_ENABLE_PENDING); 361011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortEnable, 361111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PORT_INDEX_OUT, 361211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 361311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_event_port_settings_sent = false; 361411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 361511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 361611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 361711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Allocate Buffer exit with ret Code %d",eRet); 361811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 361911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 362011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 362111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 362211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel// Free Buffer - API call 362311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 362411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 362511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_video::FreeBuffer 362611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 362711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 362811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 362911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 363011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 363111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 363211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 363311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 363411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 363511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 363611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_video::free_buffer(OMX_IN OMX_HANDLETYPE hComp, 363711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 363811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_BUFFERHEADERTYPE* buffer) 363911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 364011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void)hComp; 364111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 364211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int nPortIndex; 364311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 364411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("In for encoder free_buffer"); 3645b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara auto_lock l(m_buf_lock); 3646b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara if (port == PORT_INDEX_OUT) { //client called freebuffer, clearing client buffer bitmask right away to avoid use after free 3647b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara nPortIndex = buffer - (OMX_BUFFERHEADERTYPE*)m_out_mem_ptr; 3648b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara if(BITMASK_PRESENT(&m_client_out_bm_count, nPortIndex)) 3649b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara BITMASK_CLEAR(&m_client_out_bm_count,nPortIndex); 3650b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara } else if (port == PORT_INDEX_IN) { 3651b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara nPortIndex = buffer - (meta_mode_enable?meta_buffer_hdr:m_inp_mem_ptr); 3652b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara if(BITMASK_PRESENT(&m_client_in_bm_count, nPortIndex)) 3653b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara BITMASK_CLEAR(&m_client_in_bm_count,nPortIndex); 3654b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara } 365511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateIdle && 365611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) { 365711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" free buffer while Component in Loading pending"); 365811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ((m_sInPortDef.bEnabled == OMX_FALSE && port == PORT_INDEX_IN)|| 365911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_sOutPortDef.bEnabled == OMX_FALSE && port == PORT_INDEX_OUT)) { 366011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Free Buffer while port %u disabled", (unsigned int)port); 366111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_state == OMX_StateExecuting || m_state == OMX_StatePause) { 366211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Invalid state to free buffer,ports need to be disabled"); 3663b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara m_buffer_freed = true; 366411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError, 366511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ErrorPortUnpopulated, 366611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 366711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 366811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 366911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Invalid state to free buffer,port lost Buffers"); 3670b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara m_buffer_freed = true; 367111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_EventError, 367211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ErrorPortUnpopulated, 367311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 367411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 367511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 367611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (port == PORT_INDEX_IN) { 367711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // check if the buffer is valid 367811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex = buffer - ((!meta_mode_enable)?m_inp_mem_ptr:meta_buffer_hdr); 367911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 368011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("free_buffer on i/p port - Port idx %u, actual cnt %u", 368111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex, (unsigned int)m_sInPortDef.nBufferCountActual); 368211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (nPortIndex < m_sInPortDef.nBufferCountActual && 368311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_PRESENT(&m_inp_bm_count, nPortIndex)) { 368411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Clear the bit associated with it. 368511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR(&m_inp_bm_count,nPortIndex); 368611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_input_buffer (buffer); 368711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sInPortDef.bPopulated = OMX_FALSE; 368811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 368911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Free the Buffer Header*/ 3690fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (release_input_done()) { 369111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_use_buffer = false; 3692fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // "m_inp_mem_ptr" may point to "meta_buffer_hdr" in some modes, 3693fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // in which case, it was not explicitly allocated 3694fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (m_inp_mem_ptr && m_inp_mem_ptr != meta_buffer_hdr) { 369511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Freeing m_inp_mem_ptr"); 369611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free (m_inp_mem_ptr); 369711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 3698fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_inp_mem_ptr = NULL; 369911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_pInput_pmem) { 370011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Freeing m_pInput_pmem"); 370111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(m_pInput_pmem); 370211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_pmem = NULL; 370311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 370411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 370511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_pInput_ion) { 370611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Freeing m_pInput_ion"); 370711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(m_pInput_ion); 370811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_ion = NULL; 370911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 371011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 371111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 371211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 371311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: free_buffer ,Port Index Invalid"); 371411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 371511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 371611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 371711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING) 371811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && release_input_done()) { 371911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("MOVING TO DISABLED STATE"); 372011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_INPUT_DISABLE_PENDING); 372111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortDisable, 372211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PORT_INDEX_IN, 372311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 372411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 372511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (port == PORT_INDEX_OUT) { 372611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // check if the buffer is valid 372711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex = buffer - (OMX_BUFFERHEADERTYPE*)m_out_mem_ptr; 372811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 372911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("free_buffer on o/p port - Port idx %u, actual cnt %u", 373011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPortIndex, (unsigned int)m_sOutPortDef.nBufferCountActual); 373111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (nPortIndex < m_sOutPortDef.nBufferCountActual && 373211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_PRESENT(&m_out_bm_count, nPortIndex)) { 373311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Clear the bit associated with it. 373411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR(&m_out_bm_count,nPortIndex); 373511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sOutPortDef.bPopulated = OMX_FALSE; 373611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_output_buffer (buffer); 373711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 373811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (release_output_done()) { 373911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_use_buffer = false; 374011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_out_mem_ptr) { 374111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Freeing m_out_mem_ptr"); 374211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free (m_out_mem_ptr); 374311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_mem_ptr = NULL; 374411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 374511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_pOutput_pmem) { 374611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Freeing m_pOutput_pmem"); 374711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(m_pOutput_pmem); 374811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_pmem = NULL; 374911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 375011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 375111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_pOutput_ion) { 375211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Freeing m_pOutput_ion"); 375311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(m_pOutput_ion); 375411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pOutput_ion = NULL; 375511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 375611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 375711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 375811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 375911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: free_buffer , Port Index Invalid"); 376011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 376111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 376211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING) 376311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && release_output_done() ) { 376411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("FreeBuffer : If any Disable event pending,post it"); 376511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 376611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("MOVING TO DISABLED STATE"); 376711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_OUTPUT_DISABLE_PENDING); 376811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandPortDisable, 376911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PORT_INDEX_OUT, 377011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 377111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 377211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 377311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 377411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 377511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 377611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((eRet == OMX_ErrorNone) && 377711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (BITMASK_PRESENT(&m_flags ,OMX_COMPONENT_LOADING_PENDING))) { 377811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (release_done()) { 377911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dev_stop() != 0) { 378011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: dev_stop() FAILED"); 378111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorHardware; 378211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 378311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Send the callback now 378411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel BITMASK_CLEAR((&m_flags),OMX_COMPONENT_LOADING_PENDING); 378511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event(OMX_CommandStateSet, OMX_StateLoaded, 378611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EVENT); 378711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 3788fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("in free buffer, release not done, need to free more buffers output %" PRIx64" input %" PRIx64, 378911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_out_bm_count, m_inp_bm_count); 379011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 379111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 3792b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara if (eRet != OMX_ErrorNone) { 3793b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara m_buffer_freed = true; 3794b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara } 379511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 379611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 379711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 379811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 379911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 380011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 380111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 380211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_video::EmptyThisBuffer 380311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 380411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 380511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel This routine is used to push the encoded video frames to 380611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel the video decoder. 380711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 380811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 380911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 381011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 381111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 381211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if everything went successful. 381311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 381411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 381511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_video::empty_this_buffer(OMX_IN OMX_HANDLETYPE hComp, 381611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_BUFFERHEADERTYPE* buffer) 381711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 381811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE ret1 = OMX_ErrorNone; 381911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int nBufferIndex ; 382011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 382111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("ETB: buffer = %p, buffer->pBuffer[%p]", buffer, buffer->pBuffer); 382211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state != OMX_StateExecuting && 382311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state != OMX_StatePause && 382411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state != OMX_StateIdle) { 382511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Empty this buffer in Invalid State"); 382611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 382711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 382811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 382911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer == NULL || (buffer->nSize != sizeof(OMX_BUFFERHEADERTYPE))) { 383011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: omx_video::etb--> buffer is null or buffer size is invalid"); 383111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 383211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 383311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 383411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nVersion.nVersion != OMX_SPEC_VERSION) { 383511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: omx_video::etb--> OMX Version Invalid"); 383611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorVersionMismatch; 383711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 383811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 383911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nInputPortIndex != (OMX_U32)PORT_INDEX_IN) { 384011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Bad port index to call empty_this_buffer"); 384111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadPortIndex; 384211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 384311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_sInPortDef.bEnabled) { 384411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Cannot call empty_this_buffer while I/P port is disabled"); 384511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorIncorrectStateOperation; 384611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 384711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 384811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nBufferIndex = buffer - ((!meta_mode_enable)?m_inp_mem_ptr:meta_buffer_hdr); 384911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 385011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (nBufferIndex > m_sInPortDef.nBufferCountActual ) { 385111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: ETB: Invalid buffer index[%d]", nBufferIndex); 385211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 385311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 385411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 385511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_etb_count++; 38562e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel m_etb_timestamp = buffer->nTimeStamp; 385711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("DBG: i/p nTimestamp = %u", (unsigned)buffer->nTimeStamp); 385811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event ((unsigned long)hComp,(unsigned long)buffer,m_input_msg_id); 385911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 386011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 386111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 386211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 386311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_video::empty_this_buffer_proxy 386411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 386511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 386611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel This routine is used to push the encoded video frames to 386711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel the video decoder. 386811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 386911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 387011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 387111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 387211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 387311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if everything went successful. 387411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 387511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 387611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_video::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE hComp, 387711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_BUFFERHEADERTYPE* buffer) 387811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 3879b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_NAME_HIGH("ETB"); 388011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void)hComp; 388111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 *pmem_data_buf = NULL; 388211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int push_cnt = 0; 388311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned nBufIndex = 0; 388411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE ret = OMX_ErrorNone; 388511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel LEGACY_CAM_METADATA_TYPE *media_buffer = NULL; 388611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 388711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_ 388811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int fd = 0; 388911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 389011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("ETBProxy: buffer->pBuffer[%p]", buffer->pBuffer); 389111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer == NULL) { 389211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: ETBProxy: Invalid buffer[%p]", buffer); 389311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 389411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 389511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 389611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Buffer sanity checks 389711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (meta_mode_enable && !mUsesColorConversion) { 389811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //For color-conversion case, we have an internal buffer and not a meta buffer 389911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool met_error = false; 390011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nBufIndex = buffer - meta_buffer_hdr; 390111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (nBufIndex >= m_sInPortDef.nBufferCountActual) { 390211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: ETBProxy: Invalid meta-bufIndex = %u", nBufIndex); 390311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 390411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 390511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel media_buffer = (LEGACY_CAM_METADATA_TYPE *)meta_buffer_hdr[nBufIndex].pBuffer; 390611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!media_buffer) { 390711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("%s: invalid media_buffer",__FUNCTION__); 390811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 390911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 391011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((media_buffer->buffer_type == LEGACY_CAM_SOURCE) 391111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && buffer->nAllocLen != sizeof(LEGACY_CAM_METADATA_TYPE)) { 391211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid metadata size expected(%u) v/s recieved(%zu)", 391311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nAllocLen, sizeof(LEGACY_CAM_METADATA_TYPE)); 391411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel met_error = true; 391511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (media_buffer) { 391611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (media_buffer->buffer_type != LEGACY_CAM_SOURCE && 391711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel media_buffer->buffer_type != kMetadataBufferTypeGrallocSource) { 391811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel met_error = true; 391911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 392011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (media_buffer->buffer_type == LEGACY_CAM_SOURCE) { 392111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (media_buffer->meta_handle == NULL) 392211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel met_error = true; 392311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else { 3924b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel // TBD: revisit this check ! 392511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int nFds = media_buffer->meta_handle->numFds, 392611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nInt = media_buffer->meta_handle->numInts; 392711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel met_error = ((nFds == 1 && nInt >= 2) /*normal*/ || 392811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (nFds < 16 && nInt >= nFds*3) /*batch*/) ? false : true; 392911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (met_error) { 393011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Unbalanced fds in handle: fds=%d ints=%d", 393111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nFds, nInt); 393211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 393311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 393411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 393511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 393611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else 393711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel met_error = true; 393811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (met_error) { 393911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Unkown source/metahandle in ETB call"); 394011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event ((unsigned long)buffer,0,OMX_COMPONENT_GENERATE_EBD); 394111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 394211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 394311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 394411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nBufIndex = buffer - ((OMX_BUFFERHEADERTYPE *)m_inp_mem_ptr); 394511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (nBufIndex >= m_sInPortDef.nBufferCountActual) { 394611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: ETBProxy: Invalid bufIndex = %u", nBufIndex); 394711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 394811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 394911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 395011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 395111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_input_buffers++; 3952b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("ETB-pending", pending_input_buffers); 395311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (input_flush_progress == true) { 395411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event ((unsigned long)buffer,0, 395511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_EBD); 395611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: ETBProxy: Input flush in progress"); 395711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 395811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 395911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_ 396011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!meta_mode_enable) { 396111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd = m_pInput_pmem[nBufIndex].fd; 396211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 396311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 396411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ICS_ 396511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (meta_mode_enable && !mUsesColorConversion) { 396611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Camera or Gralloc-source meta-buffers queued with encodeable color-format 396711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct pmem Input_pmem_info; 396811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!media_buffer) { 396911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("%s: invalid media_buffer",__FUNCTION__); 397011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 397111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 397211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (media_buffer->buffer_type == LEGACY_CAM_SOURCE) { 397311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Input_pmem_info.buffer = media_buffer; 3974b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel Input_pmem_info.fd = MetaBufferUtil::getFdAt(media_buffer->meta_handle, 0); 397511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_ 397611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd = Input_pmem_info.fd; 397711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 3978b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel int offset = MetaBufferUtil::getIntAt(media_buffer->meta_handle, 0, MetaBufferUtil::INT_OFFSET); 3979b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel int size = MetaBufferUtil::getIntAt(media_buffer->meta_handle, 0, MetaBufferUtil::INT_SIZE); 3980b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel if (offset < 0 || size < 0) { 3981b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel DEBUG_PRINT_ERROR("meta-buffer is invalid!"); 3982b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel return OMX_ErrorBadParameter; 3983b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } 3984b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel Input_pmem_info.offset = offset; 3985b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel Input_pmem_info.size = size; 3986b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel DEBUG_PRINT_INFO("ETB (meta-Camera) fd = %d, offset = %d, size = %d", 398711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Input_pmem_info.fd, Input_pmem_info.offset, 398811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Input_pmem_info.size); 398911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 399011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VideoGrallocMetadata *media_buffer = (VideoGrallocMetadata *)meta_buffer_hdr[nBufIndex].pBuffer; 399111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel private_handle_t *handle = (private_handle_t *)media_buffer->pHandle; 399211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Input_pmem_info.buffer = media_buffer; 399311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Input_pmem_info.fd = handle->fd; 399411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_ 399511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd = Input_pmem_info.fd; 399611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 399711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Input_pmem_info.offset = 0; 399811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Input_pmem_info.size = handle->size; 399911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("ETB (meta-gralloc) fd = %d, offset = %d, size = %d", 400011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Input_pmem_info.fd, Input_pmem_info.offset, 400111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Input_pmem_info.size); 400211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 400311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dev_use_buf(&Input_pmem_info,PORT_INDEX_IN,nBufIndex) != true) { 400411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: in dev_use_buf"); 400511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event ((unsigned long)buffer,0,OMX_COMPONENT_GENERATE_EBD); 400611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 400711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 40082601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } else if (input_use_buffer && !m_use_input_pmem && m_pInput_pmem[nBufIndex].buffer) 400911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 40102601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (input_use_buffer && !m_use_input_pmem && m_pInput_pmem[nBufIndex].buffer) 401111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 401211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 401311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Heap UseBuffer case, so memcpy the data"); 401411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 4015b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara auto_lock l(m_buf_lock); 401611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_data_buf = (OMX_U8 *)m_pInput_pmem[nBufIndex].buffer; 4017b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara if (pmem_data_buf && BITMASK_PRESENT(&m_client_in_bm_count, nBufIndex)) { 401811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy (pmem_data_buf, (buffer->pBuffer + buffer->nOffset), 401911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFilledLen); 402011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 402111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("memcpy() done in ETBProxy for i/p Heap UseBuf"); 402211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (mUseProxyColorFormat) { 402311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Gralloc-source buffers with color-conversion 402411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd = m_pInput_pmem[nBufIndex].fd; 402511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("ETB (color-converted) fd = %d, size = %u", 402611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd, (unsigned int)buffer->nFilledLen); 402711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_sInPortDef.format.video.eColorFormat == 402811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COLOR_FormatYUV420SemiPlanar) { 402911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //For the case where YUV420SP buffers are qeueued to component 403011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //by sources other than camera (Apps via MediaCodec), conversion 403111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //to vendor flavoured NV12 color format is required. 403211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!dev_color_align(buffer, m_sInPortDef.format.video.nFrameWidth, 403311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sInPortDef.format.video.nFrameHeight)) { 403411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to adjust buffer color"); 403511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event((unsigned long)buffer, 0, OMX_COMPONENT_GENERATE_EBD); 403611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUndefined; 403711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 403811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 403911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_ 404011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dev_empty_buf(buffer, pmem_data_buf,nBufIndex,fd) != true) 404111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 404211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dev_empty_buf(buffer, pmem_data_buf,0,0) != true) 404311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 404411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 404511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: ETBProxy: dev_empty_buf failed"); 404611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ICS_ 404711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_release_meta_buffer(buffer); 404811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 404911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event ((unsigned long)buffer,0,OMX_COMPONENT_GENERATE_EBD); 405011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Generate an async error and move to invalid state*/ 405111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_input_buffers--; 4052b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("ETB-pending", pending_input_buffers); 405311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (hw_overload) { 405411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 405511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 405611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 405711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 405811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 405911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 406011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 406111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 406211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 406311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_video::FillThisBuffer 406411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 406511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 406611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel IL client uses this method to release the frame buffer 406711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel after displaying them. 406811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 406911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 407011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 407111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 407211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 407311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 407411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 407511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 407611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_video::fill_this_buffer(OMX_IN OMX_HANDLETYPE hComp, 407711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_BUFFERHEADERTYPE* buffer) 407811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 407911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("FTB: buffer->pBuffer[%p]", buffer->pBuffer); 408011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state != OMX_StateExecuting && 408111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state != OMX_StatePause && 408211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state != OMX_StateIdle) { 408311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: FTB in Invalid State"); 408411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 408511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 408611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 408711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer == NULL ||(buffer->nSize != sizeof(OMX_BUFFERHEADERTYPE))) { 408811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: omx_video::ftb-->Invalid buffer or size"); 408911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 409011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 409111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 409211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nVersion.nVersion != OMX_SPEC_VERSION) { 409311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: omx_video::ftb-->OMX Version Invalid"); 409411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorVersionMismatch; 409511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 409611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 409711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nOutputPortIndex != (OMX_U32)PORT_INDEX_OUT) { 409811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: omx_video::ftb-->Bad port index"); 409911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadPortIndex; 410011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 410111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 410211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_sOutPortDef.bEnabled) { 410311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: omx_video::ftb-->port is disabled"); 410411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorIncorrectStateOperation; 410511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 410611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 410711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event((unsigned long) hComp, (unsigned long)buffer,OMX_COMPONENT_GENERATE_FTB); 410811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 410911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 411011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 411111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 411211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 411311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_video::fill_this_buffer_proxy 411411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 411511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 411611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel IL client uses this method to release the frame buffer 411711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel after displaying them. 411811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 411911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 412011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 412111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 412211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 412311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 412411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 412511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 412611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_video::fill_this_buffer_proxy( 412711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_HANDLETYPE hComp, 412811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_BUFFERHEADERTYPE* bufferAdd) 412911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 4130b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_NAME_HIGH("FTB"); 413111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void)hComp; 413211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 *pmem_data_buf = NULL; 413311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE nRet = OMX_ErrorNone; 4134b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara auto_lock l(m_buf_lock); 4135b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara if (m_buffer_freed == true) { 4136b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara DEBUG_PRINT_ERROR("ERROR: FTBProxy: Invalid call. Called after freebuffer"); 4137b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara return OMX_ErrorBadParameter; 4138b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara } 413911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 4140b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara if (bufferAdd != NULL) { 4141b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara DEBUG_PRINT_LOW("FTBProxy: bufferAdd->pBuffer[%p]", bufferAdd->pBuffer); 4142b74baf2c2a6532d890c0d97169d140f0a3d1fe37Santhosh Behara } 414311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bufferAdd == NULL || ((bufferAdd - m_out_mem_ptr) >= (int)m_sOutPortDef.nBufferCountActual) ) { 414411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: FTBProxy: Invalid i/p params"); 414511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 414611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 414711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 414811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_output_buffers++; 4149b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("FTB-pending", pending_output_buffers); 415011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Return back the output buffer to client*/ 415111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( m_sOutPortDef.bEnabled != OMX_TRUE || output_flush_progress == true) { 415211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("o/p port is Disabled or Flush in Progress"); 415311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event ((unsigned long)bufferAdd,0, 415411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENT_GENERATE_FBD); 415511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 415611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 415711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 415811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (output_use_buffer && !m_use_output_pmem) { 415911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Heap UseBuffer case"); 416011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_data_buf = (OMX_U8 *)m_pOutput_pmem[bufferAdd - m_out_mem_ptr].buffer; 416111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 416211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 416311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dev_fill_buf(bufferAdd, pmem_data_buf,(bufferAdd - m_out_mem_ptr),m_pOutput_pmem[bufferAdd - m_out_mem_ptr].fd) != true) { 416411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: dev_fill_buf() Failed"); 416511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event ((unsigned long)bufferAdd,0,OMX_COMPONENT_GENERATE_FBD); 416611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_output_buffers--; 4167b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("FTB-pending", pending_output_buffers); 416811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 416911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 417011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 417111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 417211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 417311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 417411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 417511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 417611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_video::SetCallbacks 417711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 417811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 417911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Set the callbacks. 418011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 418111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 418211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 418311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 418411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 418511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if everything successful. 418611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 418711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 418811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_video::set_callbacks(OMX_IN OMX_HANDLETYPE hComp, 418911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_CALLBACKTYPE* callbacks, 419011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR appData) 419111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 419211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void)hComp; 419311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pCallbacks = *callbacks; 419411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Callbacks Set %p %p %p",m_pCallbacks.EmptyBufferDone,\ 419511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pCallbacks.EventHandler,m_pCallbacks.FillBufferDone); 419611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_app_data = appData; 419711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNotImplemented; 419811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 419911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 420011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 420111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 420211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 420311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_venc::UseEGLImage 420411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 420511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 420611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Use EGL Image method implementation <TBD>. 420711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 420811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 420911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 421011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 421111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 421211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Not Implemented error. 421311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 421411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 421511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_video::use_EGL_image(OMX_IN OMX_HANDLETYPE hComp, 421611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr, 421711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 port, 421811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_PTR appData, 421911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN void* eglImage) 422011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 422111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void)hComp, (void)bufferHdr, (void)port, (void)appData, (void)eglImage; 422211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: use_EGL_image: Not Implemented"); 422311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNotImplemented; 422411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 422511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 422611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 422711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 422811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_venc::ComponentRoleEnum 422911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 423011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 423111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Component Role Enum method implementation. 423211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 423311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 423411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel <TBD>. 423511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 423611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 423711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX Error None if everything is successful. 423811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 423911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_video::component_role_enum(OMX_IN OMX_HANDLETYPE hComp, 424011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OUT OMX_U8* role, 424111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_U32 index) 424211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 424311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void)hComp; 424411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 424511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp((char*)m_nkind, "OMX.qcom.video.decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) { 424611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((0 == index) && role) { 424711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)role, "video_decoder.mpeg4",OMX_MAX_STRINGNAME_SIZE); 424811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("component_role_enum: role %s",role); 424911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 425011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 425111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 425211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp((char*)m_nkind, "OMX.qcom.video.decoder.h263",OMX_MAX_STRINGNAME_SIZE)) { 425311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((0 == index) && role) { 425411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)role, "video_decoder.h263",OMX_MAX_STRINGNAME_SIZE); 425511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("component_role_enum: role %s",role); 425611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 425711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: No more roles"); 425811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 425911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 426011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp((char*)m_nkind, "OMX.qcom.video.decoder.avc",OMX_MAX_STRINGNAME_SIZE)) { 426111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((0 == index) && role) { 426211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)role, "video_decoder.avc",OMX_MAX_STRINGNAME_SIZE); 426311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("component_role_enum: role %s",role); 426411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 426511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: No more roles"); 426611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 426711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 426811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp((char*)m_nkind, "OMX.qcom.video.decoder.vc1",OMX_MAX_STRINGNAME_SIZE)) { 426911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((0 == index) && role) { 427011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)role, "video_decoder.vc1",OMX_MAX_STRINGNAME_SIZE); 427111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("component_role_enum: role %s",role); 427211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 427311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: No more roles"); 427411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 427511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 427611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 427711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) { 427811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((0 == index) && role) { 427911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)role, "video_encoder.mpeg4",OMX_MAX_STRINGNAME_SIZE); 428011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("component_role_enum: role %s",role); 428111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 428211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 428311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 428411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.h263",OMX_MAX_STRINGNAME_SIZE)) { 428511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((0 == index) && role) { 428611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)role, "video_encoder.h263",OMX_MAX_STRINGNAME_SIZE); 428711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("component_role_enum: role %s",role); 428811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 428911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: No more roles"); 429011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 429111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 429211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.avc",OMX_MAX_STRINGNAME_SIZE)) { 429311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((0 == index) && role) { 429411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)role, "video_encoder.avc",OMX_MAX_STRINGNAME_SIZE); 429511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("component_role_enum: role %s",role); 429611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 429711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: No more roles"); 429811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 429911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 430011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 430111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_ 430211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.vp8",OMX_MAX_STRINGNAME_SIZE)) { 430311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((0 == index) && role) { 430411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)role, "video_encoder.vp8",OMX_MAX_STRINGNAME_SIZE); 430511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("component_role_enum: role %s",role); 430611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 430711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: No more roles"); 430811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 430911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 431011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 431111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 431211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.hevc", OMX_MAX_STRINGNAME_SIZE)) { 431311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((0 == index) && role) { 431411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *)role, "video_encoder.hevc", OMX_MAX_STRINGNAME_SIZE); 431511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("component_role_enum: role %s", role); 431611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 431711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: No more roles"); 431811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 431911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 432011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 432111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else { 432211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Querying Role on Unknown Component"); 432311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorInvalidComponentName; 432411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 432511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 432611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 432711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 432811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 432911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 433011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 433111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 433211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 433311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_venc::AllocateDone 433411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 433511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 433611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Checks if entire buffer pool is allocated by IL Client or not. 433711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Need this to move to IDLE state. 433811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 433911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 434011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 434111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 434211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 434311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false. 434411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 434511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 434611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_video::allocate_done(void) 434711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 434811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = false; 434911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet_In = false; 435011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet_Out = false; 435111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 435211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet_In = allocate_input_done(); 435311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet_Out = allocate_output_done(); 435411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 435511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bRet_In && bRet_Out) { 435611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 435711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 435811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 435911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 436011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 436111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 436211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 436311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_venc::AllocateInputDone 436411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 436511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 436611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Checks if I/P buffer pool is allocated by IL Client or not. 436711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 436811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 436911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 437011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 437111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 437211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false. 437311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 437411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 437511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_video::allocate_input_done(void) 437611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 437711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = false; 437811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i=0; 437911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 438011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_mem_ptr == NULL) { 438111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 438211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 438311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_mem_ptr ) { 438411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (; i<m_sInPortDef.nBufferCountActual; i++) { 438511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_ABSENT(&m_inp_bm_count,i)) { 438611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 438711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 438811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 438911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 439011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (i==m_sInPortDef.nBufferCountActual) { 439111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 439211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 439311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (i==m_sInPortDef.nBufferCountActual && m_sInPortDef.bEnabled) { 439411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sInPortDef.bPopulated = OMX_TRUE; 439511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 439611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 439711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 439811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 439911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 440011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_venc::AllocateOutputDone 440111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 440211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 440311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Checks if entire O/P buffer pool is allocated by IL Client or not. 440411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 440511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 440611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 440711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 440811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 440911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false. 441011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 441111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 441211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_video::allocate_output_done(void) 441311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 441411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = false; 441511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned j=0; 441611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 441711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_out_mem_ptr == NULL) { 441811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 441911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 442011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 442111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_out_mem_ptr ) { 442211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (; j<m_sOutPortDef.nBufferCountActual; j++) { 442311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_ABSENT(&m_out_bm_count,j)) { 442411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 442511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 442611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 442711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 442811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 442911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (j==m_sOutPortDef.nBufferCountActual) { 443011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 443111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 443211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 443311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (j==m_sOutPortDef.nBufferCountActual && m_sOutPortDef.bEnabled) { 443411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sOutPortDef.bPopulated = OMX_TRUE; 443511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 443611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 443711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 443811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 443911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 444011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 444111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_venc::ReleaseDone 444211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 444311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 444411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Checks if IL client has released all the buffers. 444511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 444611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 444711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 444811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 444911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 445011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 445111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 445211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 445311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_video::release_done(void) 445411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 445511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = false; 445611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Inside release_done()"); 445711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (release_input_done()) { 445811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (release_output_done()) { 445911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 446011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 446111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 446211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 446311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 446411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 446511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 446611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 446711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 446811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_venc::ReleaseOutputDone 446911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 447011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 447111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Checks if IL client has released all the buffers. 447211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 447311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 447411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 447511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 447611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 447711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 447811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 447911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 448011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_video::release_output_done(void) 448111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 448211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = false; 448311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i=0,j=0; 448411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 448511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Inside release_output_done()"); 448611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_out_mem_ptr) { 448711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (; j<m_sOutPortDef.nBufferCountActual; j++) { 448811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (BITMASK_PRESENT(&m_out_bm_count,j)) { 448911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 449011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 449111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 449211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (j==m_sOutPortDef.nBufferCountActual) { 449311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 449411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 449511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 449611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 449711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 449811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 449911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 450011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* ====================================================================== 450111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FUNCTION 450211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_venc::ReleaseInputDone 450311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 450411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DESCRIPTION 450511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Checks if IL client has released all the buffers. 450611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 450711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PARAMETERS 450811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel None. 450911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 451011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RETURN VALUE 451111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel true/false 451211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 451311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ========================================================================== */ 451411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_video::release_input_done(void) 451511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 451611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = false; 451711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned i=0,j=0; 451811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 451911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Inside release_input_done()"); 452011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_inp_mem_ptr) { 452111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (; j<m_sInPortDef.nBufferCountActual; j++) { 452211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ( BITMASK_PRESENT(&m_inp_bm_count,j)) { 452311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 452411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 452511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 452611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (j==m_sInPortDef.nBufferCountActual) { 452711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 452811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 452911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 453011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = true; 453111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 453211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 453311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 453411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 453511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_video::fill_buffer_done(OMX_HANDLETYPE hComp, 453611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE * buffer) 453711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 4538b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_NAME_HIGH("FBD"); 453911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_ 454011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int index = buffer - m_out_mem_ptr; 454111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 454211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("fill_buffer_done: buffer->pBuffer[%p], flags=0x%x size = %u", 454311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->pBuffer, (unsigned)buffer->nFlags, (unsigned int)buffer->nFilledLen); 454411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer == NULL || ((buffer - m_out_mem_ptr) > (int)m_sOutPortDef.nBufferCountActual)) { 454511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 454611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 454711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 454811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_output_buffers--; 4549b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("FTB-pending", pending_output_buffers); 4550b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("FBD-TS", buffer->nTimeStamp / 1000); 4551b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("FBD-size", buffer->nFilledLen); 455211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 45532601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (secure_session && m_pCallbacks.FillBufferDone) { 45542601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (buffer->nFilledLen > 0) 45552601808ee2992a94c325d05e4065aba60b01840bThierry Strudel m_fbd_count++; 45562601808ee2992a94c325d05e4065aba60b01840bThierry Strudel m_pCallbacks.FillBufferDone (hComp,m_app_data,buffer); 45572601808ee2992a94c325d05e4065aba60b01840bThierry Strudel return OMX_ErrorNone; 45582601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 455911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!secure_session) { 456011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra_data_handle.create_extra_data(buffer); 456111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef _MSM8974_ 456211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nFlags & OMX_BUFFERFLAG_EXTRADATA) { 456311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("parsing extradata"); 456411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra_data_handle.parse_extra_data(buffer); 456511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 456611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 456711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 456811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 456911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* For use buffer we need to copy the data */ 457011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_pCallbacks.FillBufferDone) { 457111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nFilledLen > 0) { 457211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_fbd_count++; 457311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 457411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dev_get_output_log_flag()) { 457511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dev_output_log_buffers((const char*)buffer->pBuffer, buffer->nFilledLen); 457611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 457711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 457811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nFlags & OMX_BUFFERFLAG_EXTRADATA) { 457911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!dev_handle_output_extradata((void *)buffer, index)) 458011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to parse output extradata"); 458111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 458211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dev_extradata_log_buffers((char *)(((unsigned long)buffer->pBuffer + buffer->nOffset + 458311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nFilledLen + 3) & (~3))); 458411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 458511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pCallbacks.FillBufferDone (hComp,m_app_data,buffer); 458611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 458711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 458811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 458911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 459011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 459111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 459211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_video::empty_buffer_done(OMX_HANDLETYPE hComp, 459311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE* buffer) 459411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 4595b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_NAME_HIGH("EBD"); 459611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int buffer_index = -1; 459711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 459811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_index = buffer - ((mUseProxyColorFormat && !mUsesColorConversion) ? meta_buffer_hdr : m_inp_mem_ptr); 459911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("empty_buffer_done: buffer[%p]", buffer); 460011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer == NULL || 460111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((buffer_index > (int)m_sInPortDef.nBufferCountActual))) { 460211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR in empty_buffer_done due to index buffer"); 460311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 460411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 460511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 460611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_input_buffers--; 4607b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("ETB-pending", pending_input_buffers); 460811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 460911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (mUseProxyColorFormat && 461011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (buffer_index >= 0 && (buffer_index < (int)m_sInPortDef.nBufferCountActual))) { 461111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!pdest_frame && !input_flush_progress && mUsesColorConversion) { 461211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = buffer; 461311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("empty_buffer_done pdest_frame address is %p",pdest_frame); 461411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return push_input_buffer(hComp); 461511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 461611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //check if empty-EOS-buffer is being returned, treat this same as the 461711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //color-conversion case as we queued a color-conversion buffer to encoder 461811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool handleEmptyEosBuffer = (mEmptyEosBuffer == buffer); 461911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (mUsesColorConversion || handleEmptyEosBuffer) { 462011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (handleEmptyEosBuffer) { 462111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mEmptyEosBuffer = NULL; 462211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 462311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // return color-conversion buffer back to the pool 462411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("empty_buffer_done insert address is %p",buffer); 462511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_opq_pmem_q.insert_entry((unsigned long)buffer, 0, 0)) { 462611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("empty_buffer_done: pmem queue is full"); 462711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 462811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 462911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 463011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // We are not dealing with color-conversion, Buffer being returned 463111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // here is client's buffer, return it back to client 463211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_pCallbacks.EmptyBufferDone && buffer) { 463311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pCallbacks.EmptyBufferDone(hComp, m_app_data, buffer); 463411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("empty_buffer_done: Returning client buf %p", buffer); 463511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 463611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 463711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_pCallbacks.EmptyBufferDone) { 463811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pCallbacks.EmptyBufferDone(hComp ,m_app_data, buffer); 463911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 464011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 464111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 464211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 464311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_video::complete_pending_buffer_done_cbs() 464411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 464511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long p1; 464611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long p2; 464711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long ident; 464811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_cmd_queue tmp_q, pending_bd_q; 464911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&m_lock); 465011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // pop all pending GENERATE FDB from ftb queue 465111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (m_ftb_q.m_size) { 465211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ftb_q.pop_entry(&p1,&p2,&ident); 465311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ident == OMX_COMPONENT_GENERATE_FBD) { 465411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_bd_q.insert_entry(p1,p2,ident); 465511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 465611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel tmp_q.insert_entry(p1,p2,ident); 465711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 465811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 465911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //return all non GENERATE FDB to ftb queue 466011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (tmp_q.m_size) { 466111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel tmp_q.pop_entry(&p1,&p2,&ident); 466211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_ftb_q.insert_entry(p1,p2,ident); 466311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 466411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // pop all pending GENERATE EDB from etb queue 466511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (m_etb_q.m_size) { 466611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_etb_q.pop_entry(&p1,&p2,&ident); 466711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ident == OMX_COMPONENT_GENERATE_EBD) { 466811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_bd_q.insert_entry(p1,p2,ident); 466911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 467011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel tmp_q.insert_entry(p1,p2,ident); 467111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 467211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 467311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //return all non GENERATE FDB to etb queue 467411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (tmp_q.m_size) { 467511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel tmp_q.pop_entry(&p1,&p2,&ident); 467611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_etb_q.insert_entry(p1,p2,ident); 467711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 467811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&m_lock); 467911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // process all pending buffer dones 468011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (pending_bd_q.m_size) { 468111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pending_bd_q.pop_entry(&p1,&p2,&ident); 468211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (ident) { 468311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_EBD: 468411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (empty_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone) { 468511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: empty_buffer_done() failed!"); 468611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_report_error (); 468711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 468811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 468911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 469011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COMPONENT_GENERATE_FBD: 469111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (fill_buffer_done(&m_cmp, (OMX_BUFFERHEADERTYPE *)p1) != OMX_ErrorNone ) { 469211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: fill_buffer_done() failed!"); 469311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_report_error (); 469411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 469511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 469611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 469711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 469811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 469911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 470011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef MAX_RES_720P 470111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_video::get_supported_profile_level(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType) 470211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 470311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 470411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!profileLevelType) 470511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 470611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 470711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (profileLevelType->nPortIndex == 1) { 470811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_sOutPortDef.format.video.eCompressionFormat == OMX_VIDEO_CodingAVC) { 470911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (profileLevelType->nProfileIndex == 0) { 471011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline; 471111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = OMX_VIDEO_AVCLevel31; 471211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (profileLevelType->nProfileIndex == 1) { 471311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain; 471411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = OMX_VIDEO_AVCLevel31; 471511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (profileLevelType->nProfileIndex == 2) { 471611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh; 471711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = OMX_VIDEO_AVCLevel31; 471811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 471911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d", 472011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (int)profileLevelType->nProfileIndex); 472111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 472211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 472311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_sOutPortDef.format.video.eCompressionFormat == OMX_VIDEO_CodingH263) { 472411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (profileLevelType->nProfileIndex == 0) { 472511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline; 472611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = OMX_VIDEO_H263Level70; 472711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 4728e2b75a9c0959cc95f9c17d7ff183dbe1b210ab43Thierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d", (int)profileLevelType->nProfileIndex); 472911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 473011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 473111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_sOutPortDef.format.video.eCompressionFormat == OMX_VIDEO_CodingMPEG4) { 473211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (profileLevelType->nProfileIndex == 0) { 473311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple; 473411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = OMX_VIDEO_MPEG4Level5; 473511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (profileLevelType->nProfileIndex == 1) { 473611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple; 473711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = OMX_VIDEO_MPEG4Level5; 473811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 4739e2b75a9c0959cc95f9c17d7ff183dbe1b210ab43Thierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d", (int)profileLevelType->nProfileIndex); 474011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 474111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 474211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 474311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 474411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queried on Input port only %d", (int)profileLevelType->nPortIndex); 474511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 474611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 474711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported for Input port returned Profile:%d, Level:%d", 474811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (int)profileLevelType->eProfile, (int)profileLevelType->eLevel); 474911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 475011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 475111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 475211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 475311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef MAX_RES_1080P 475411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_video::get_supported_profile_level(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType) 475511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 475611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 475711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!profileLevelType) 475811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 475911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 476011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (profileLevelType->nPortIndex == 1) { 476111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_sOutPortDef.format.video.eCompressionFormat == OMX_VIDEO_CodingAVC) { 476211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#if defined _MSM8974_ && !defined _MSM8226_ 476311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (profileLevelType->nProfileIndex == 0) { 476411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline; 476511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = OMX_VIDEO_AVCLevel52; 476611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (profileLevelType->nProfileIndex == 1) { 476711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain; 476811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = OMX_VIDEO_AVCLevel52; 476911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (profileLevelType->nProfileIndex == 2) { 477011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh; 477111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = OMX_VIDEO_AVCLevel52; 477211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (profileLevelType->nProfileIndex == 3) { 4773544fdbb7dbafbe83a1313564074f0af689aae752Lajos Molnar profileLevelType->eProfile = OMX_VIDEO_AVCProfileConstrainedBaseline; 477411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = OMX_VIDEO_AVCLevel52; 477511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (profileLevelType->nProfileIndex == 4) { 4776544fdbb7dbafbe83a1313564074f0af689aae752Lajos Molnar profileLevelType->eProfile = QOMX_VIDEO_AVCProfileConstrainedBaseline; 4777544fdbb7dbafbe83a1313564074f0af689aae752Lajos Molnar profileLevelType->eLevel = OMX_VIDEO_AVCLevel52; 4778544fdbb7dbafbe83a1313564074f0af689aae752Lajos Molnar } else if (profileLevelType->nProfileIndex == 5) { 4779544fdbb7dbafbe83a1313564074f0af689aae752Lajos Molnar profileLevelType->eProfile = OMX_VIDEO_AVCProfileConstrainedHigh; 4780544fdbb7dbafbe83a1313564074f0af689aae752Lajos Molnar profileLevelType->eLevel = OMX_VIDEO_AVCLevel52; 4781544fdbb7dbafbe83a1313564074f0af689aae752Lajos Molnar } else if (profileLevelType->nProfileIndex == 6) { 478211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = QOMX_VIDEO_AVCProfileConstrainedHigh; 478311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = OMX_VIDEO_AVCLevel52; 478411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 478511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u", 478611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)profileLevelType->nProfileIndex); 478711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 478811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 478911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 479011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (profileLevelType->nProfileIndex == 0) { 479111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_AVCProfileBaseline; 479211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = OMX_VIDEO_AVCLevel4; 479311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 479411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (profileLevelType->nProfileIndex == 1) { 479511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_AVCProfileMain; 479611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = OMX_VIDEO_AVCLevel4; 479711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (profileLevelType->nProfileIndex == 2) { 479811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_AVCProfileHigh; 479911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = OMX_VIDEO_AVCLevel4; 480011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8226_ 480111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (profileLevelType->nProfileIndex == 3) { 4802544fdbb7dbafbe83a1313564074f0af689aae752Lajos Molnar profileLevelType->eProfile = OMX_VIDEO_AVCProfileConstrainedBaseline; 4803544fdbb7dbafbe83a1313564074f0af689aae752Lajos Molnar profileLevelType->eLevel = OMX_VIDEO_AVCLevel4; 4804544fdbb7dbafbe83a1313564074f0af689aae752Lajos Molnar } else if (profileLevelType->nProfileIndex == 4) { 480511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = QOMX_VIDEO_AVCProfileConstrainedBaseline; 480611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = OMX_VIDEO_AVCLevel4; 480711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 480811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 480911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %d", 481011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (int)profileLevelType->nProfileIndex); 481111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 481211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 481311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 481411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_sOutPortDef.format.video.eCompressionFormat == OMX_VIDEO_CodingH263) { 481511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (profileLevelType->nProfileIndex == 0) { 481611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_H263ProfileBaseline; 481711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = OMX_VIDEO_H263Level70; 481811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 4819e2b75a9c0959cc95f9c17d7ff183dbe1b210ab43Thierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u", (unsigned int)profileLevelType->nProfileIndex); 482011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 482111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 482211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_sOutPortDef.format.video.eCompressionFormat == OMX_VIDEO_CodingMPEG4) { 482311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (profileLevelType->nProfileIndex == 0) { 482411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileSimple; 482511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = OMX_VIDEO_MPEG4Level5; 482611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (profileLevelType->nProfileIndex == 1) { 482711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple; 482811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = OMX_VIDEO_MPEG4Level5; 482911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 4830e2b75a9c0959cc95f9c17d7ff183dbe1b210ab43Thierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u", (unsigned int)profileLevelType->nProfileIndex); 483111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 483211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 483311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_sOutPortDef.format.video.eCompressionFormat == OMX_VIDEO_CodingVP8) { 483411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (profileLevelType->nProfileIndex == 0) { 483511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_VP8ProfileMain; 483611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = OMX_VIDEO_VP8Level_Version0; 483711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (profileLevelType->nProfileIndex == 1) { 483811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_VP8ProfileMain; 483911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eLevel = OMX_VIDEO_VP8Level_Version1; 484011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 484111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("VP8: get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u", 484211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)profileLevelType->nProfileIndex); 484311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 484411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 484511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_sOutPortDef.format.video.eCompressionFormat == OMX_VIDEO_CodingHEVC) { 484611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (profileLevelType->nProfileIndex == 0) { 484711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profileLevelType->eProfile = OMX_VIDEO_HEVCProfileMain; 4848a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel profileLevelType->eLevel = OMX_VIDEO_HEVCMainTierLevel51; 484911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 485011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("HEVC: get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported nProfileIndex ret NoMore %u", 485111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)profileLevelType->nProfileIndex); 485211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 485311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 485411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 485511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported ret NoMore"); 485611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNoMore; 485711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 485811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 485911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported should be queried on Input port only %u", (unsigned int)profileLevelType->nPortIndex); 486011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorBadPortIndex; 486111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 486211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported for Input port returned Profile:%u, Level:%u", 486311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)profileLevelType->eProfile, (unsigned int)profileLevelType->eLevel); 486411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 486511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 486611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 486711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 486811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 486911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_video::alloc_map_ion_memory(int size, 487011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct ion_allocation_data *alloc_data, 487111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct ion_fd_data *fd_data,int flag) 487211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 487311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct venc_ion buf_ion_info; 487411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ion_device_fd =-1,rc=0,ion_dev_flags = 0; 487511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (size <=0 || !alloc_data || !fd_data) { 487611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid input to alloc_map_ion_memory"); 487711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return -EINVAL; 487811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 487911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 488011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ion_dev_flags = O_RDONLY; 488111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ion_device_fd = open (MEM_DEVICE,ion_dev_flags); 488211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ion_device_fd < 0) { 488311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: ION Device open() Failed"); 488411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ion_device_fd; 488511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 488611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 488711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(secure_session) { 488811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel alloc_data->len = (size + (SECURE_ALIGN - 1)) & ~(SECURE_ALIGN - 1); 488911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel alloc_data->align = SECURE_ALIGN; 489011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel alloc_data->flags = flag; 489111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel alloc_data->heap_id_mask = ION_HEAP(MEM_HEAP_ID); 489211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (alloc_data->flags & ION_FLAG_CP_BITSTREAM) { 489311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel alloc_data->heap_id_mask |= ION_HEAP(ION_SECURE_DISPLAY_HEAP_ID); 489411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 489511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("ION ALLOC sec buf: size %u align %u flags %x", 489611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)alloc_data->len, (unsigned int)alloc_data->align, 489711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel alloc_data->flags); 489811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 489911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel alloc_data->len = (size + (SZ_4K - 1)) & ~(SZ_4K - 1); 490011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel alloc_data->align = SZ_4K; 490111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel alloc_data->flags = (flag & ION_FLAG_CACHED ? ION_FLAG_CACHED : 0); 490211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef MAX_RES_720P 490311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel alloc_data->heap_id_mask = ION_HEAP(MEM_HEAP_ID); 490411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 490511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel alloc_data->heap_id_mask = (ION_HEAP(MEM_HEAP_ID) | 490611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ION_HEAP(ION_IOMMU_HEAP_ID)); 490711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 490811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("ION ALLOC unsec buf: size %u align %u flags %x", 490911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)alloc_data->len, (unsigned int)alloc_data->align, 491011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel alloc_data->flags); 491111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 491211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 491311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(ion_device_fd,ION_IOC_ALLOC,alloc_data); 491411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc || !alloc_data->handle) { 491511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ION ALLOC memory failed 0x%x", rc); 491611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel alloc_data->handle = 0; 491711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(ion_device_fd); 491811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ion_device_fd = -1; 491911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ion_device_fd; 492011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 492111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd_data->handle = alloc_data->handle; 492211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(ion_device_fd,ION_IOC_MAP,fd_data); 492311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 492411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ION MAP failed "); 492511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_ion_info.ion_alloc_data = *alloc_data; 492611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_ion_info.ion_device_fd = ion_device_fd; 492711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_ion_info.fd_ion_data = *fd_data; 492811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free_ion_memory(&buf_ion_info); 492911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd_data->fd =-1; 493011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ion_device_fd =-1; 493111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 493211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ion_device_fd; 493311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 493411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 493511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_video::free_ion_memory(struct venc_ion *buf_ion_info) 493611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 493711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!buf_ion_info) { 493811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid input to free_ion_memory"); 493911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 494011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 494111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(buf_ion_info->ion_device_fd,ION_IOC_FREE, 494211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &buf_ion_info->ion_alloc_data.handle)) { 494311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ION free failed "); 494411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 494511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 494611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(buf_ion_info->ion_device_fd); 494711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_ion_info->ion_alloc_data.handle = 0; 494811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_ion_info->ion_device_fd = -1; 494911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_ion_info->fd_ion_data.fd = -1; 495011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 495111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 495211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 495311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ICS_ 495411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_video::omx_release_meta_buffer(OMX_BUFFERHEADERTYPE *buffer) 495511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 495611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer && meta_mode_enable) { 495711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel LEGACY_CAM_METADATA_TYPE *media_ptr; 495811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct pmem Input_pmem; 495911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int index_pmem = 0; 496011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool meta_error = false; 496111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 496211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel index_pmem = (buffer - m_inp_mem_ptr); 496311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (mUsesColorConversion && 496411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (index_pmem < m_sInPortDef.nBufferCountActual)) { 496511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!dev_free_buf((&m_pInput_pmem[index_pmem]),PORT_INDEX_IN)) { 496611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("omx_release_meta_buffer dev free failed"); 496711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 496811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 496911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel media_ptr = (LEGACY_CAM_METADATA_TYPE *) buffer->pBuffer; 497011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (media_ptr && media_ptr->meta_handle) { 4971b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel if (media_ptr->buffer_type == LEGACY_CAM_SOURCE) { 497211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Input_pmem.buffer = media_ptr; 4973b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel Input_pmem.fd = MetaBufferUtil::getFdAt(media_ptr->meta_handle, 0); 4974b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel int size = MetaBufferUtil::getIntAt(media_ptr->meta_handle, 0, MetaBufferUtil::INT_SIZE); 4975b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel int offset = MetaBufferUtil::getIntAt(media_ptr->meta_handle, 0, MetaBufferUtil::INT_OFFSET); 4976b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel if (Input_pmem.fd < 0 || size < 0 || offset < 0) { 4977b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel DEBUG_PRINT_ERROR("Invalid meta buffer"); 4978b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel meta_error = true; 4979b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } 4980b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel Input_pmem.size = size; 4981b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel Input_pmem.offset = offset; 498211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("EBD fd = %d, offset = %d, size = %d",Input_pmem.fd, 498311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Input_pmem.offset, 498411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Input_pmem.size); 498511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (media_ptr->buffer_type == kMetadataBufferTypeGrallocSource) { 498611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VideoGrallocMetadata *media_ptr = (VideoGrallocMetadata *)buffer->pBuffer; 498711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel private_handle_t *handle = (private_handle_t *)media_ptr->pHandle; 498811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Input_pmem.buffer = media_ptr; 498911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Input_pmem.fd = handle->fd; 499011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Input_pmem.offset = 0; 499111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Input_pmem.size = handle->size; 499211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 499311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel meta_error = true; 499411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 499511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!meta_error) 499611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel meta_error = !dev_free_buf(&Input_pmem,PORT_INDEX_IN); 499711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (meta_error) { 4998fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("In batchmode or dev_free_buf failed, flush %d", 499911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_flush_progress); 500011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 500111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 500211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 500311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 500411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 500511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 500611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_video::omx_c2d_conv::omx_c2d_conv() 500711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 500811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel c2dcc = NULL; 500911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mLibHandle = NULL; 501011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mConvertOpen = NULL; 501111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mConvertClose = NULL; 501211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel src_format = NV12_128m; 501311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_init(&c_lock, NULL); 501411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 501511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 501611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_video::omx_c2d_conv::init() 501711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 501811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool status = true; 501911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (mLibHandle || mConvertOpen || mConvertClose) { 502011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("omx_c2d_conv::init called twice"); 502111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 502211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 502311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (status) { 502411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mLibHandle = dlopen("libc2dcolorconvert.so", RTLD_LAZY); 502511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (mLibHandle) { 502611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mConvertOpen = (createC2DColorConverter_t *) 502711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dlsym(mLibHandle,"createC2DColorConverter"); 502811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mConvertClose = (destroyC2DColorConverter_t *) 502911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dlsym(mLibHandle,"destroyC2DColorConverter"); 503011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!mConvertOpen || !mConvertClose) 503111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 503211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else 503311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 503411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 503511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!status && mLibHandle) { 503611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dlclose(mLibHandle); 503711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mLibHandle = NULL; 503811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mConvertOpen = NULL; 503911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mConvertClose = NULL; 504011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 504111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return status; 504211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 504311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 504411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_video::omx_c2d_conv::convert(int src_fd, void *src_base, void *src_viraddr, 504511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int dest_fd, void *dest_base, void *dest_viraddr) 504611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 504711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int result; 504811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!src_viraddr || !dest_viraddr || !c2dcc || !src_base || !dest_base) { 504911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid arguments omx_c2d_conv::convert"); 505011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 505111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 505211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&c_lock); 505311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel result = c2dcc->convertC2D(src_fd, src_base, src_viraddr, 505411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dest_fd, dest_base, dest_viraddr); 505511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&c_lock); 505611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Color convert status %d",result); 505711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ((result < 0)?false:true); 505811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 505911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 506011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_video::omx_c2d_conv::open(unsigned int height,unsigned int width, 506111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ColorConvertFormat src, ColorConvertFormat dest, unsigned int src_stride, 506211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int flags) 506311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 506411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool status = false; 506511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&c_lock); 506611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!c2dcc) { 506711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel c2dcc = mConvertOpen(width, height, width, height, 506811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel src, dest, flags, src_stride); 506911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (c2dcc) { 507011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel src_format = src; 507111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = true; 507211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else 507311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("mConvertOpen failed"); 507411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 507511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&c_lock); 507611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return status; 507711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 507811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 507911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_video::omx_c2d_conv::close() 508011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 508111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (mLibHandle) { 508211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&c_lock); 508311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (mConvertClose && c2dcc) 508411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mConvertClose(c2dcc); 508511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&c_lock); 508611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel c2dcc = NULL; 508711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 508811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 508911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_video::omx_c2d_conv::~omx_c2d_conv() 509011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 509111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Destroy C2D instance"); 509211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (mLibHandle) { 509311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (mConvertClose && c2dcc) { 509411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&c_lock); 509511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mConvertClose(c2dcc); 509611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&c_lock); 509711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 509811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dlclose(mLibHandle); 509911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 510011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel c2dcc = NULL; 510111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mLibHandle = NULL; 510211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mConvertOpen = NULL; 510311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mConvertClose = NULL; 510411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_destroy(&c_lock); 510511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 510611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 510711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_video::omx_c2d_conv::get_src_format() 510811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 510911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int format = -1; 511011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (src_format == NV12_128m) { 511111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel format = HAL_PIXEL_FORMAT_NV12_ENCODEABLE; 511211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (src_format == RGBA8888) { 511311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel format = HAL_PIXEL_FORMAT_RGBA_8888; 511411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 511511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return format; 511611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 511711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 511811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_video::omx_c2d_conv::get_buffer_size(int port,unsigned int &buf_size) 511911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 512011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int cret = 0; 512111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool ret = false; 512211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel C2DBuffReq bufferreq; 512311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (c2dcc) { 512411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufferreq.size = 0; 512511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&c_lock); 512611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel cret = c2dcc->getBuffReq(port,&bufferreq); 512711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&c_lock); 512811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Status of getbuffer is %d", cret); 512911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = (cret)?false:true; 513011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_size = bufferreq.size; 513111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 513211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 513311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 513411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 513511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_video::is_conv_needed(int hal_fmt, int hal_flags) 513611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 513711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool bRet = false; 513811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 513911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp(m_platform, "msm8996", 7)) { 514011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = hal_fmt == HAL_PIXEL_FORMAT_RGBA_8888 && 514111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !(hal_flags & private_handle_t::PRIV_FLAGS_UBWC_ALIGNED); 514211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 514311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = hal_fmt == HAL_PIXEL_FORMAT_RGBA_8888; 514411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 514511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 514611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _HW_RGBA 514711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bRet = false; 514811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 514911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("RGBA conversion %s", bRet ? "Needed":"Not-Needed"); 515011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bRet; 515111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 515211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 5153fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelvoid omx_video::print_debug_color_aspects(ColorAspects *aspects, const char *prefix) { 5154fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("%s : Color aspects : Primaries = %d Range = %d Transfer = %d MatrixCoeffs = %d", 5155fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel prefix, aspects->mPrimaries, aspects->mRange, aspects->mTransfer, aspects->mMatrixCoeffs); 5156fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel} 5157fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 515811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_video::empty_this_buffer_opaque(OMX_IN OMX_HANDLETYPE hComp, 515911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IN OMX_BUFFERHEADERTYPE* buffer) 516011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 5161b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_NAME_LOW("ETB-Opaque"); 516211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned nBufIndex = 0; 516311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE ret = OMX_ErrorNone; 516411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VideoGrallocMetadata *media_buffer; // This method primarily assumes gralloc-metadata 516511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel private_handle_t *handle = NULL; 516611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("ETBProxyOpaque: buffer[%p]", buffer); 516711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 516811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer == NULL) { 516911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: ETBProxyA: Invalid buffer[%p]",buffer); 517011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 517111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 517211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 517311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!dev_buffer_ready_to_queue(buffer)) { 517411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Info: ETBProxyA: buffer[%p] is deffered", buffer); 517511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 517611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 517711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 517811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nBufIndex = buffer - meta_buffer_hdr; 517911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (nBufIndex >= m_sInPortDef.nBufferCountActual) { 518011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: ETBProxyA: Invalid bufindex = %u", 518111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nBufIndex); 518211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 518311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 518411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 518511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel media_buffer = (VideoGrallocMetadata *)buffer->pBuffer; 518611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!media_buffer) { 518711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("%s: invalid media_buffer",__FUNCTION__); 518811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 518911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 519011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((media_buffer->eType == LEGACY_CAM_SOURCE) 519111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel && buffer->nAllocLen != sizeof(LEGACY_CAM_METADATA_TYPE)) { 519211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid metadata size expected(%u) v/s recieved(%zu)", 519311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer->nAllocLen, sizeof(LEGACY_CAM_METADATA_TYPE)); 519411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 519511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 519611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 519711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (media_buffer && media_buffer->eType == LEGACY_CAM_SOURCE) { 519811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return empty_this_buffer_proxy(hComp, buffer); 519911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 520011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 520111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((!media_buffer || !media_buffer->pHandle || media_buffer->eType != kMetadataBufferTypeGrallocSource) && 520211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !(buffer->nFlags & OMX_BUFFERFLAG_EOS)) { 520311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Incorrect Buffer queued media buffer = %p", 520411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel media_buffer); 520511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pCallbacks.EmptyBufferDone(hComp, m_app_data, buffer); 520611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 520711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (media_buffer) { 520811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel handle = (private_handle_t *)media_buffer->pHandle; 520911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 521011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 521111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Enable following code once private handle color format is 521211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel updated correctly*/ 521311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 521411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nFilledLen > 0 && handle) { 521511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (c2d_opened && handle->format != c2d_conv.get_src_format()) { 521611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel c2d_conv.close(); 521711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel c2d_opened = false; 521811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 521911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 522011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!c2d_opened) { 522111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mUsesColorConversion = is_conv_needed(handle->format, handle->flags); 522211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (mUsesColorConversion) { 522311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_INFO("open Color conv forW: %u, H: %u", 522411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)m_sInPortDef.format.video.nFrameWidth, 522511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)m_sInPortDef.format.video.nFrameHeight); 522611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!c2d_conv.open(m_sInPortDef.format.video.nFrameHeight, 522711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sInPortDef.format.video.nFrameWidth, 522811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel RGBA8888, NV12_128m, handle->width, handle->flags)) { 522911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pCallbacks.EmptyBufferDone(hComp,m_app_data,buffer); 523011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Color conv open failed"); 523111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 523211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 523311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel c2d_opened = true; 523411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _MSM8974_ 523511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!dev_set_format(NV12_128m)) 523611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("cannot set color format"); 523769b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel 523869b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel dev_get_buf_req (&m_sInPortDef.nBufferCountMin, 523969b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel &m_sInPortDef.nBufferCountActual, 524069b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel &m_sInPortDef.nBufferSize, 524169b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel m_sInPortDef.nPortIndex); 524269b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel 524311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 524411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 524511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 524611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 524711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (input_flush_progress == true) { 524811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pCallbacks.EmptyBufferDone(hComp,m_app_data,buffer); 524911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: ETBProxyA: Input flush in progress"); 525011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 525111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 525211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 525311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!psource_frame) { 525411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame = buffer; 525511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = push_input_buffer(hComp); 525611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 525711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_opq_meta_q.insert_entry((unsigned long)buffer,0,0)) { 525811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: ETBProxy: Queue is full"); 525911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pCallbacks.EmptyBufferDone(hComp,m_app_data,buffer); 526011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = OMX_ErrorBadParameter; 526111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 526211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 526311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 526411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 526511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 526611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_video::queue_meta_buffer(OMX_HANDLETYPE hComp, 526711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct pmem &Input_pmem_info) 526811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 526911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 527011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE ret = OMX_ErrorNone; 527111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long address = 0,p2,id; 527211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 527311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("In queue Meta Buffer"); 527411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!psource_frame || !pdest_frame) { 527511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("convert_queue_buffer invalid params"); 527611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 527711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 527811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 527911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (psource_frame->nFilledLen > 0) { 528011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dev_use_buf(&Input_pmem_info,PORT_INDEX_IN,0) != true) { 528111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: in dev_use_buf"); 528211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event ((unsigned long)psource_frame,0,OMX_COMPONENT_GENERATE_EBD); 528311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = OMX_ErrorBadParameter; 528411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 528511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 528611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 528711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret == OMX_ErrorNone) 528811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = empty_this_buffer_proxy(hComp,psource_frame); 528911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 529011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret == OMX_ErrorNone) { 529111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame = NULL; 529211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!psource_frame && m_opq_meta_q.m_size) { 529311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_opq_meta_q.pop_entry(&address,&p2,&id); 529411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame = (OMX_BUFFERHEADERTYPE* ) address; 529511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 529611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 529711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // there has been an error and source frame has been scheduled for an EBD 529811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame = NULL; 529911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 530011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 530111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 530211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 530311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_video::convert_queue_buffer(OMX_HANDLETYPE hComp, 530411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct pmem &Input_pmem_info,unsigned long &index) 530511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 530611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 530711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned char *uva; 530811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE ret = OMX_ErrorNone; 530911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long address = 0,p2,id; 531011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 531111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("In Convert and queue Meta Buffer"); 531211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!psource_frame || !pdest_frame) { 531311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("convert_queue_buffer invalid params"); 531411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 531511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 531611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (secure_session) { 531711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("cannot convert buffer during secure session"); 531811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInvalidState; 531911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 532011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 532111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!psource_frame->nFilledLen) { 532211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(psource_frame->nFlags & OMX_BUFFERFLAG_EOS) { 532311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFilledLen = psource_frame->nFilledLen; 532411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nTimeStamp = psource_frame->nTimeStamp; 532511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFlags = psource_frame->nFlags; 532611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Skipping color conversion for empty EOS Buffer " 532711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "header=%p filled-len=%u", pdest_frame, (unsigned int)pdest_frame->nFilledLen); 532811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 532911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nOffset = 0; 533011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFilledLen = 0; 533111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nTimeStamp = psource_frame->nTimeStamp; 533211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFlags = psource_frame->nFlags; 533311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Buffer header %p Filled len size %u", 533411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame, (unsigned int)pdest_frame->nFilledLen); 533511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 533611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 5337d303c643ac659041f009a28c5ffa31d93714fce3Thierry Strudel unsigned int input_buf_size = 0; 5338d303c643ac659041f009a28c5ffa31d93714fce3Thierry Strudel if (!c2d_conv.get_buffer_size(C2D_INPUT, input_buf_size)) { 5339d303c643ac659041f009a28c5ffa31d93714fce3Thierry Strudel DEBUG_PRINT_ERROR("convert_queue_buffer: failed to get C2D i/p buf-size!"); 5340d303c643ac659041f009a28c5ffa31d93714fce3Thierry Strudel return OMX_ErrorBadParameter; 5341d303c643ac659041f009a28c5ffa31d93714fce3Thierry Strudel } else if (Input_pmem_info.size < input_buf_size) { 5342d303c643ac659041f009a28c5ffa31d93714fce3Thierry Strudel DEBUG_PRINT_ERROR("convert_queue_buffer: insufficient handle size(%u) v/s min(%u)", 5343d303c643ac659041f009a28c5ffa31d93714fce3Thierry Strudel Input_pmem_info.size, input_buf_size); 5344d303c643ac659041f009a28c5ffa31d93714fce3Thierry Strudel return OMX_ErrorBadParameter; 5345d303c643ac659041f009a28c5ffa31d93714fce3Thierry Strudel } 534611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel uva = (unsigned char *)mmap(NULL, Input_pmem_info.size, 534711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PROT_READ|PROT_WRITE, 534811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel MAP_SHARED,Input_pmem_info.fd,0); 534911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (uva == MAP_FAILED) { 5350d303c643ac659041f009a28c5ffa31d93714fce3Thierry Strudel DEBUG_PRINT_ERROR("convert_queue_buffer: failed to map handle fd(%d) size(%u)", 5351d303c643ac659041f009a28c5ffa31d93714fce3Thierry Strudel Input_pmem_info.fd, Input_pmem_info.size); 535211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = OMX_ErrorBadParameter; 535311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 535411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!c2d_conv.convert(Input_pmem_info.fd, uva, uva, 535511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pInput_pmem[index].fd, pdest_frame->pBuffer, pdest_frame->pBuffer)) { 535611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Color Conversion failed"); 535711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = OMX_ErrorBadParameter; 535811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 535911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int buf_size = 0; 536011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!c2d_conv.get_buffer_size(C2D_OUTPUT,buf_size)) 536111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = OMX_ErrorBadParameter; 536211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else { 536311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nOffset = 0; 536411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFilledLen = buf_size; 536511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nTimeStamp = psource_frame->nTimeStamp; 536611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame->nFlags = psource_frame->nFlags; 536711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Buffer header %p Filled len size %u", 536811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame, (unsigned int)pdest_frame->nFilledLen); 536911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 537011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 537111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel munmap(uva,Input_pmem_info.size); 537211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 537311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 537411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dev_use_buf(&m_pInput_pmem[index],PORT_INDEX_IN,0) != true) { 537511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: in dev_use_buf"); 537611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel post_event ((unsigned long)pdest_frame,0,OMX_COMPONENT_GENERATE_EBD); 537711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = OMX_ErrorBadParameter; 537811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 537911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret == OMX_ErrorNone) 538011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = empty_this_buffer_proxy(hComp,pdest_frame); 538111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret == OMX_ErrorNone) { 538211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_pCallbacks.EmptyBufferDone(hComp ,m_app_data, psource_frame); 538311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame = NULL; 538411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = NULL; 538511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!psource_frame && m_opq_meta_q.m_size) { 538611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_opq_meta_q.pop_entry(&address,&p2,&id); 538711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame = (OMX_BUFFERHEADERTYPE* ) address; 538811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 538911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!pdest_frame && m_opq_pmem_q.m_size) { 539011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_opq_pmem_q.pop_entry(&address,&p2,&id); 539111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = (OMX_BUFFERHEADERTYPE* ) address; 539211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("pdest_frame pop address is %p",pdest_frame); 539311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 539411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 539511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // there has been an error and source frame has been scheduled for an EBD 539611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame = NULL; 539711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 539811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 539911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 540011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 540111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_video::push_input_buffer(OMX_HANDLETYPE hComp) 540211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 540311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long address = 0,p2,id, index = 0; 540411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE ret = OMX_ErrorNone; 540511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 540611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("In push input buffer"); 540711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!psource_frame && m_opq_meta_q.m_size) { 540811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_opq_meta_q.pop_entry(&address,&p2,&id); 540911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel psource_frame = (OMX_BUFFERHEADERTYPE* ) address; 541011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 541111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!pdest_frame && m_opq_pmem_q.m_size) { 541211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_opq_pmem_q.pop_entry(&address,&p2,&id); 541311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = (OMX_BUFFERHEADERTYPE* ) address; 541411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 541511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (psource_frame != NULL && pdest_frame != NULL && 541611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret == OMX_ErrorNone) { 541711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct pmem Input_pmem_info; 541811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel LEGACY_CAM_METADATA_TYPE *media_buffer; 541911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel index = pdest_frame - m_inp_mem_ptr; 542011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (index >= m_sInPortDef.nBufferCountActual) { 542111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Output buffer index is wrong %u act count %u", 542211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)index, (unsigned int)m_sInPortDef.nBufferCountActual); 542311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 542411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 542511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 542611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //Meta-Buffer with empty filled-length can contain garbage handle 542711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //Some clients queue such buffers to signal EOS. Handle this case 542811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // separately by queueing an intermediate color-conversion buffer 542911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // and propagate the EOS. 543011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (psource_frame->nFilledLen == 0 && (psource_frame->nFlags & OMX_BUFFERFLAG_EOS)) { 5431bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel return push_empty_eos_buffer(hComp); 543211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 543311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel media_buffer = (LEGACY_CAM_METADATA_TYPE *)psource_frame->pBuffer; 543411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*Will enable to verify camcorder in current TIPS can be removed*/ 543511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (media_buffer->buffer_type == LEGACY_CAM_SOURCE) { 543611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Input_pmem_info.buffer = media_buffer; 5437b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel Input_pmem_info.fd = MetaBufferUtil::getFdAt(media_buffer->meta_handle, 0); 5438b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel Input_pmem_info.offset = MetaBufferUtil::getIntAt(media_buffer->meta_handle, 0, MetaBufferUtil::INT_OFFSET); 5439b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel Input_pmem_info.size = MetaBufferUtil::getIntAt(media_buffer->meta_handle, 0, MetaBufferUtil::INT_SIZE); 544011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_graphicbuffer_size = Input_pmem_info.size; 544111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("ETB fd = %d, offset = %d, size = %d",Input_pmem_info.fd, 544211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Input_pmem_info.offset, 544311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Input_pmem_info.size); 544411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = queue_meta_buffer(hComp,Input_pmem_info); 544511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 544611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VideoGrallocMetadata *media_buffer = (VideoGrallocMetadata *)psource_frame->pBuffer; 544711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel private_handle_t *handle = (private_handle_t *)media_buffer->pHandle; 544811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Input_pmem_info.buffer = media_buffer; 544911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Input_pmem_info.fd = handle->fd; 545011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Input_pmem_info.offset = 0; 545111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Input_pmem_info.size = handle->size; 545211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_graphicbuffer_size = Input_pmem_info.size; 545311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (is_conv_needed(handle->format, handle->flags)) 545411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = convert_queue_buffer(hComp,Input_pmem_info,index); 545511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (handle->format == HAL_PIXEL_FORMAT_NV12_ENCODEABLE || 545611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel handle->format == QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m || 545711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel handle->format == QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed || 545811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel handle->format == HAL_PIXEL_FORMAT_RGBA_8888 || 545911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel handle->format == QOMX_COLOR_Format32bitRGBA8888Compressed) 546011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = queue_meta_buffer(hComp,Input_pmem_info); 546111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 546211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = OMX_ErrorBadParameter; 546311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 546411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 546511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return ret; 546611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 546711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 5468bb740e8596fa53304e86875fed4c19762d53b321Thierry StrudelOMX_ERRORTYPE omx_video::push_empty_eos_buffer(OMX_HANDLETYPE hComp) { 546911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE* opqBuf = NULL; 547011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retVal = OMX_ErrorNone; 547111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned index = 0; 547211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 547311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("In push empty eos buffer"); 547411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel do { 547511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (mUsesColorConversion) { 547611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pdest_frame) { 547711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //[1] use a checked out conversion buffer, if one is available 547811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel opqBuf = pdest_frame; 547911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pdest_frame = NULL; 548011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_opq_pmem_q.m_size) { 548111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //[2] else pop out one from the queue, if available 548211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long address = 0, p2, id; 548311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_opq_pmem_q.pop_entry(&address,&p2,&id); 548411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel opqBuf = (OMX_BUFFERHEADERTYPE* ) address; 548511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 548611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel index = opqBuf - m_inp_mem_ptr; 548711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 5488bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel opqBuf = (OMX_BUFFERHEADERTYPE* ) psource_frame; 548911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel index = opqBuf - meta_buffer_hdr; 549011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 549111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 549211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!opqBuf || index >= m_sInPortDef.nBufferCountActual) { 549311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("push_empty_eos_buffer: Could not find a " 549411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "color-conversion buffer to queue ! defer until available"); 549511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //[3] else, returning back will defer calling this function again 549611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //until a conversion buffer is returned by the encoder and also 549711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //hold on to the client's buffer 549811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 549911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 550011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct pmem Input_pmem_info; 550111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Input_pmem_info.buffer = opqBuf; 550211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Input_pmem_info.fd = m_pInput_pmem[index].fd; 550311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Input_pmem_info.offset = 0; 550411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Input_pmem_info.size = m_pInput_pmem[index].size; 550511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 550611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dev_use_buf(&Input_pmem_info, PORT_INDEX_IN, 0) != true) { 550711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: in dev_use_buf for empty eos buffer"); 550811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retVal = OMX_ErrorBadParameter; 550911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 551011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 551111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 551211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //Queue with null pBuffer, as pBuffer in client's hdr can be junk 551311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //Clone the color-conversion buffer to avoid overwriting original buffer 551411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE emptyEosBufHdr; 551511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(&emptyEosBufHdr, opqBuf, sizeof(OMX_BUFFERHEADERTYPE)); 551611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel emptyEosBufHdr.nFilledLen = 0; 5517bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel emptyEosBufHdr.nTimeStamp = psource_frame->nTimeStamp; 5518bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel emptyEosBufHdr.nFlags = psource_frame->nFlags; 551911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel emptyEosBufHdr.pBuffer = NULL; 552011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!mUsesColorConversion) 552111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel emptyEosBufHdr.nAllocLen = 552211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_graphicbuffer_size ? m_graphicbuffer_size : m_sInPortDef.nBufferSize; 552311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 552411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dev_empty_buf(&emptyEosBufHdr, 0, index, m_pInput_pmem[index].fd) != true) { 552511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: in dev_empty_buf for empty eos buffer"); 552611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dev_free_buf(&Input_pmem_info, PORT_INDEX_IN); 552711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retVal = OMX_ErrorBadParameter; 552811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 552911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 553011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mEmptyEosBuffer = opqBuf; 553111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } while(false); 553211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 553311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //return client's buffer regardless since intermediate color-conversion 553411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //buffer is sent to the the encoder 5535bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel m_pCallbacks.EmptyBufferDone(hComp, m_app_data, psource_frame); 5536bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel psource_frame = NULL; 553711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel --pending_input_buffers; 5538b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("ETB-pending", pending_input_buffers); 553911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retVal; 554011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 5541aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 5542aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel// no code beyond this ! 5543aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel 5544aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel// inline import of vendor extensions implementation 5545aec695787aa19f0f77459fe206562c7f98d9c7ceThierry Strudel#include "omx_video_extensions.hpp" 5546