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(&timestamp.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(&timestamp.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