1e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 2e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @copyright 3e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 4e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * Copyright (c) 2015, The Linux Foundation. All rights reserved. 5e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 6e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * Redistribution and use in source and binary forms, with or without 7e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * modification, are permitted provided that the following conditions are met: 8e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 9e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * * Redistributions of source code must retain the above copyright notice, 10e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * this list of conditions and the following disclaimer. 11e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * * Redistributions in binary form must reproduce the above copyright notice, 12e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * this list of conditions and the following disclaimer in the documentation 13e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * and/or other materials provided with the distribution. 14e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * * Neither the name of The Linux Foundation nor the names of its 15e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * contributors may be used to endorse or promote products derived from 16e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * this software without specific prior written permission. 17e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 18e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 19e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, 20e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE DISCLAIMED. 21e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY 22e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 23e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 24e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 25e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH 28e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * DAMAGE. 29e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 30e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @file 31e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 32e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * omx_swvdec.cpp 33e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 34e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief 35e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 36e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * OMX software video decoder component source. 37e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 38e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 39e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include <assert.h> 40e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include <fcntl.h> 41e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include <sys/mman.h> 42e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 43e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include <media/hardware/HardwareAPI.h> 44e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include <gralloc_priv.h> 45e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 46e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include "OMX_QCOMExtns.h" 47e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 48e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include "omx_swvdec.h" 49e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 50e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include "swvdec_api.h" 51e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 52e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 53e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * ---------------- 54e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * PUBLIC FUNCTIONS 55e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * ---------------- 56e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 57e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 58e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 59e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Create & return component class instance. 60e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 61e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval Pointer to new component class instance. 62e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 63e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid *get_omx_component_factory_fn(void) 64e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 65e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return new omx_swvdec; 66e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 67e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 68e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 69e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Component constructor. 70e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 71e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinomx_swvdec::omx_swvdec(): 72e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_state(OMX_StateInvalid), 73e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_status_flags(0), 74e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_swvdec_codec(SWVDEC_CODEC_INVALID), 75e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_swvdec_handle(NULL), 76e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_swvdec_created(false), 77e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_omx_video_codingtype(OMX_VIDEO_CodingUnused), 78e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_omx_color_formattype(OMX_COLOR_FormatUnused), 79e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_sync_frame_decoding_mode(false), 80e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_android_native_buffers(false), 81e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_meta_buffer_mode(false), 82e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_reconfig_inprogress(false), 83e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_ip(NULL), 84e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op(NULL), 85e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_meta_buffer_array(NULL) 86e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 87e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // memset all member variables that are composite structures 88e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&m_cmp, 0, sizeof(m_cmp)); // part of base class 89e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&m_cmp_name[0], 0, sizeof(m_cmp_name)); 90e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&m_role_name[0], 0, sizeof(m_role_name)); 91e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&m_frame_rate, 0, sizeof(m_frame_rate)); 92e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&m_frame_dimensions, 0, sizeof(m_frame_dimensions)); 93e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&m_frame_attributes, 0, sizeof(m_frame_attributes)); 94e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&m_async_thread, 0, sizeof(m_async_thread)); 95e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&m_port_ip, 0, sizeof(m_port_ip)); 96e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&m_port_op, 0, sizeof(m_port_op)); 97e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&m_callback, 0, sizeof(m_callback)); 98e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&m_app_data, 0, sizeof(m_app_data)); 99e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&m_prio_mgmt, 0, sizeof(m_prio_mgmt)); 100e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&m_sem_cmd, 0, sizeof(m_sem_cmd)); 101e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memset(&m_meta_buffer_array_mutex, 0, sizeof(m_meta_buffer_array_mutex)); 102e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 103e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // null-terminate component name & role name strings 104e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_cmp_name[0] = '\0'; 105e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_role_name[0] = '\0'; 106e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 107e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // ports are enabled & unpopulated by default 108e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.enabled = OMX_TRUE; 109e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.enabled = OMX_TRUE; 110e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.unpopulated = OMX_TRUE; 111e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.unpopulated = OMX_TRUE; 112e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 113e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 114e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 115e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Component destructor. 116e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 117e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinomx_swvdec::~omx_swvdec() 118e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 119e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 120e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 121e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 122e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Initialize component. 123e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 124e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] cmp_name: Component name string. 125e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 126e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 127e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 128e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::component_init(OMX_STRING cmp_name) 129e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 130e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 131e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 132e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("'%s', version date: %s", 133e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin cmp_name, 134e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_VERSION_DATE); 135e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 136e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_swvdec_log_init(); 137e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 138e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_state != OMX_StateInvalid) 139e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 140e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("disallowed in state %s", 141e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_STATETYPE_STRING(m_state)); 142e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorIncorrectStateOperation; 143e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto component_init_exit; 144e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 145e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 146e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // set up codec type variables based on component name string 147e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 148e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!strncmp(cmp_name, 149e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "OMX.qti.video.decoder.mpeg4sw", 150e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_MAX_STRINGNAME_SIZE)) 151e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 152e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_LOW("'video_decoder.mpeg4'"); 153e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 154e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin strlcpy(m_cmp_name, cmp_name, OMX_MAX_STRINGNAME_SIZE); 155e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin strlcpy(m_role_name, "video_decoder.mpeg4", OMX_MAX_STRINGNAME_SIZE); 156e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 157e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_swvdec_codec = SWVDEC_CODEC_MPEG4; 158e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_omx_video_codingtype = OMX_VIDEO_CodingMPEG4; 159e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 160e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (!strncmp(cmp_name, 161e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "OMX.qti.video.decoder.h263sw", 162e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_MAX_STRINGNAME_SIZE)) 163e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 164e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_LOW("video_decoder.h263"); 165e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 166e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin strlcpy(m_cmp_name, cmp_name, OMX_MAX_STRINGNAME_SIZE); 167e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin strlcpy(m_role_name, "video_decoder.h263", OMX_MAX_STRINGNAME_SIZE); 168e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 169e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_swvdec_codec = SWVDEC_CODEC_H263; 170e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_omx_video_codingtype = OMX_VIDEO_CodingH263; 171e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 172e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (((!strncmp(cmp_name, 173e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "OMX.qti.video.decoder.divxsw", 174e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_MAX_STRINGNAME_SIZE))) || 175e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ((!strncmp(cmp_name, 176e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "OMX.qti.video.decoder.divx4sw", 177e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_MAX_STRINGNAME_SIZE)))) 178e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 179e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_LOW("video_decoder.divx"); 180e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 181e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin strlcpy(m_cmp_name, cmp_name, OMX_MAX_STRINGNAME_SIZE); 182e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin strlcpy(m_role_name, "video_decoder.divx", OMX_MAX_STRINGNAME_SIZE); 183e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 184e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_swvdec_codec = SWVDEC_CODEC_MPEG4; 185e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_omx_video_codingtype = ((OMX_VIDEO_CODINGTYPE) QOMX_VIDEO_CodingDivx); 186e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 187e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 188e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 189e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("'%s': invalid component name", cmp_name); 190e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInvalidComponentName; 191e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto component_init_exit; 192e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 193e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 194e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_omx_color_formattype = 195e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_COLOR_FORMATTYPE) OMX_QCOM_COLOR_FormatYUV420PackedSemiPlanar32m; 196e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 197e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_frame_rate.fps_numerator = DEFAULT_FPS_NUMERATOR; 198e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_frame_rate.fps_denominator = DEFAULT_FPS_DENOMINATOR; 199e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 200e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 201e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_CALLBACK callback; 202e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 203e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS retval_swvdec; 204e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 205e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // initialize SwVdec core library 206e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 207e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin callback.pfn_empty_buffer_done = swvdec_empty_buffer_done_callback; 208e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin callback.pfn_fill_buffer_done = swvdec_fill_buffer_done_callback; 209e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin callback.pfn_event_notification = swvdec_event_handler_callback; 210e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin callback.p_client = this; 211e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 212e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval_swvdec = swvdec_init(&m_swvdec_handle, 213e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_swvdec_codec, 214e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin &callback)) != 215e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS_SUCCESS) 216e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 217e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = retval_swvdec2omx(retval_swvdec); 218e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto component_init_exit; 219e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 220e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 221e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_swvdec_created = true; 222e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 223e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // set frame dimensions for OMX component & SwVdec core 224e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval = set_frame_dimensions(DEFAULT_FRAME_WIDTH, 225e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEFAULT_FRAME_HEIGHT)) != 226e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ErrorNone) 227e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 228e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto component_init_exit; 229e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 230e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 231e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // set frame attributes for OMX component & SwVdec core 232e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval = set_frame_attributes(DEFAULT_ALIGNMENT_STRIDE, 233e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEFAULT_ALIGNMENT_SCANLINES_Y, 234e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEFAULT_ALIGNMENT_SCANLINES_UV, 235e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEFAULT_ALIGNMENT_SIZE)) != 236e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ErrorNone) 237e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 238e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto component_init_exit; 239e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 240e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 241e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 242e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // get SwVdec buffer requirements for input port; set m_port_ip 243e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval = get_buffer_requirements_swvdec(OMX_CORE_PORT_INDEX_IP)) != 244e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ErrorNone) 245e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 246e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto component_init_exit; 247e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 248e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 249e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // get SwVdec buffer requirements for output port; set m_port_op 250e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval = get_buffer_requirements_swvdec(OMX_CORE_PORT_INDEX_OP)) != 251e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ErrorNone) 252e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 253e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto component_init_exit; 254e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 255e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 256e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // create callback thread's mutex & condition variable 257e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval = async_thread_create()) != OMX_ErrorNone) 258e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 259e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto component_init_exit; 260e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 261e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 262e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // create semaphore for command processing 263e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (sem_init(&m_sem_cmd, 0, 0)) 264e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 265e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("failed to create command processing semaphore"); 266e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInsufficientResources; 267e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto component_init_exit; 268e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 269e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 270e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // create mutex for meta buffer info array 271e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (pthread_mutex_init(&m_meta_buffer_array_mutex, NULL)) 272e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 273e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("failed to create meta buffer info array mutex"); 274e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInsufficientResources; 275e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto component_init_exit; 276e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 277e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 278e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // move to 'loaded' state 279e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("OMX_StateInvalid -> OMX_StateLoaded"); 280e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_state = OMX_StateLoaded; 281e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 282e4010605f233a213cf0d972397bb33c34c364227Patrick Tjincomponent_init_exit: 283e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 284e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 285e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 286e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 287e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief De-initialize component. 288e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 289e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] cmp_handle: Component handle. 290e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 291e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 292e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 293e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::component_deinit(OMX_HANDLETYPE cmp_handle) 294e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 295e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API(""); 296e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 297e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (cmp_handle == NULL) 298e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 299e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL"); 300e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 301e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 302e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pthread_mutex_destroy(&m_meta_buffer_array_mutex); 303e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 304e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sem_destroy(&m_sem_cmd); 305e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 306e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_thread_destroy(); 307e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 308e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_swvdec_created) 309e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 310e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin swvdec_deinit(m_swvdec_handle); 311e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_swvdec_handle = NULL; 312e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 313e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 314e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("all done, goodbye!"); 315e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 316e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorNone; 317e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 318e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 319e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 320e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Get component version. 321e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 322e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] cmp_handle: Component handle. 323e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] cmp_name: Component name string. 324e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] p_cmp_version: Pointer to component version variable. 325e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] p_spec_version: Pointer to OMX spec version variable. 326e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] p_cmp_UUID: Pointer to component UUID variable. 327e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 328e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 329e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 330e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::get_component_version(OMX_HANDLETYPE cmp_handle, 331e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_STRING cmp_name, 332e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_VERSIONTYPE *p_cmp_version, 333e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_VERSIONTYPE *p_spec_version, 334e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_UUIDTYPE *p_cmp_UUID) 335e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 336e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 337e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 338e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (void) p_cmp_UUID; 339e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 340e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API(""); 341e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 342e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_state == OMX_StateInvalid) 343e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 344e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("in invalid state"); 345e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInvalidState; 346e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 347e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (cmp_handle == NULL) 348e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 349e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL"); 350e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInvalidComponent; 351e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 352e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (strncmp(cmp_name, m_cmp_name, sizeof(m_cmp_name))) 353e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 354e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("'%s': invalid component name", cmp_name); 355e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInvalidComponentName; 356e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 357e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (p_cmp_version == NULL) 358e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 359e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("p_cmp_version = NULL"); 360e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 361e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 362e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (p_spec_version == NULL) 363e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 364e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("p_spec_version = NULL"); 365e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 366e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 367e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 368e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 369e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_spec_version->nVersion = OMX_SPEC_VERSION; 370e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 371e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 372e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinget_component_version_exit: 373e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 374e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 375e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 376e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 377e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Send command to component. 378e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 379e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] cmp_handle: Component handle. 380e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] cmd: Command. 381e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] param: Command parameter. 382e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_cmd_data: Pointer to command data. 383e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 384e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 385e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 386e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::send_command(OMX_HANDLETYPE cmp_handle, 387e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMMANDTYPE cmd, 388e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U32 param, 389e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PTR p_cmd_data) 390e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 391e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 392e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 393e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (void) p_cmd_data; // prevent warning for unused function argument 394e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 395e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_state == OMX_StateInvalid) 396e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 397e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("in invalid state"); 398e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInvalidState; 399e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto send_command_exit; 400e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 401e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (cmp_handle == NULL) 402e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 403e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL"); 404e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInvalidComponent; 405e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto send_command_exit; 406e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 407e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 408e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch (cmd) 409e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 410e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 411e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_CommandStateSet: 412e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 413e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("%s, %s", 414e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMMANDTYPE_STRING(cmd), 415e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_STATETYPE_STRING((OMX_STATETYPE) param)); 416e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 417e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 418e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 419e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_CommandFlush: 420e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_CommandPortDisable: 421e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_CommandPortEnable: 422e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 423e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("%s, port index %d", 424e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMMANDTYPE_STRING(cmd), 425e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin param); 426e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 427e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((param != OMX_CORE_PORT_INDEX_IP) && 428e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (param != OMX_CORE_PORT_INDEX_OP) && 429e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (param != OMX_ALL)) 430e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 431e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", param); 432e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadPortIndex; 433e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 434e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 435e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 436e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 437e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 438e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 439e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("cmd %d, param %d", cmd, param); 440e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 441e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("cmd '%d' invalid", cmd); 442e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 443e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 444e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 445e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 446e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } // switch (cmd) 447e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 448e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (retval == OMX_ErrorNone) 449e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 450e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (cmp_handle == NULL) 451e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 452e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL"); 453e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInvalidComponent; 454e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 455e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (m_state == OMX_StateInvalid) 456e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 457e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("in invalid state"); 458e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInvalidState; 459e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 460e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 461e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 462e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (retval != OMX_ErrorNone) 463e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 464e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // command not processed; return error code via event handler callback 465e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_post_event(OMX_SWVDEC_EVENT_ERROR, retval, 0); 466e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 467e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 468e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 469e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // post command event 470e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_post_event(OMX_SWVDEC_EVENT_CMD, cmd, param); 471e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 472e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // wait on command semaphore 473e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sem_wait(&m_sem_cmd); 474e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 475e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 476e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinsend_command_exit: 477e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 478e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 479e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 480e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 481e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Get a parameter from component. 482e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 483e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] cmp_handle: Component handle. 484e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] param_index: Parameter index. 485e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] p_param_data: Pointer to parameter data. 486e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 487e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 488e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 489e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::get_parameter(OMX_HANDLETYPE cmp_handle, 490e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_INDEXTYPE param_index, 491e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PTR p_param_data) 492e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 493e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 494e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 495e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_state == OMX_StateInvalid) 496e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 497e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("in invalid state"); 498e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInvalidState; 499e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 500e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (cmp_handle == NULL) 501e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 502e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL"); 503e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInvalidComponent; 504e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 505e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (p_param_data == NULL) 506e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 507e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("p_param_data = NULL"); 508e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 509e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 510e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 511e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (retval != OMX_ErrorNone) 512e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 513e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto get_parameter_exit; 514e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 515e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 516e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch (param_index) 517e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 518e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 519e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamAudioInit: 520e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 521e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PORT_PARAM_TYPE *p_port_param = 522e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_PORT_PARAM_TYPE *) p_param_data; 523e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 524e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_param->nPorts = 0; 525e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_param->nStartPortNumber = 0; 526e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 527e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("OMX_IndexParamAudioInit: " 528e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "%d port(s), start port %d", 529e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_param->nPorts, 530e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_param->nStartPortNumber); 531e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 532e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 533e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 534e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamImageInit: 535e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 536e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PORT_PARAM_TYPE *p_port_param = 537e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_PORT_PARAM_TYPE *) p_param_data; 538e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 539e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_param->nPorts = 0; 540e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_param->nStartPortNumber = 0; 541e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 542e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("OMX_IndexParamImageInit: " 543e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "%d port(s), start port %d", 544e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_param->nPorts, 545e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_param->nStartPortNumber); 546e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 547e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 548e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 549e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamVideoInit: 550e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 551e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PORT_PARAM_TYPE *p_port_param = 552e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_PORT_PARAM_TYPE *) p_param_data; 553e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 554e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_param->nPorts = 2; 555e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_param->nStartPortNumber = 0; 556e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 557e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("OMX_IndexParamVideoInit: " 558e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "%d port(s), start port %d", 559e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_param->nPorts, 560e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_param->nStartPortNumber); 561e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 562e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 563e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 564e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamOtherInit: 565e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 566e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PORT_PARAM_TYPE *p_port_param = 567e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_PORT_PARAM_TYPE *) p_param_data; 568e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 569e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_param->nPorts = 0; 570e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_param->nStartPortNumber = 0; 571e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 572e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("OMX_IndexParamOtherInit: " 573e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "%d port(s), start port %d", 574e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_param->nPorts, 575e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_param->nStartPortNumber); 576e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 577e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 578e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 579e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexConfigPriorityMgmt: 580e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 581e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PRIORITYMGMTTYPE *p_prio_mgmt = 582e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_PRIORITYMGMTTYPE *) p_param_data; 583e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 584e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("OMX_IndexConfigPriorityMgmt"); 585e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 586e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memcpy(p_prio_mgmt, &m_prio_mgmt, sizeof(OMX_PRIORITYMGMTTYPE)); 587e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 588e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 589e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 590e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamStandardComponentRole: 591e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 592e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PARAM_COMPONENTROLETYPE *p_cmp_role = 593e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_PARAM_COMPONENTROLETYPE *) p_param_data; 594e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 595e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin strlcpy((char *) p_cmp_role->cRole, 596e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_role_name, 597e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_MAX_STRINGNAME_SIZE); 598e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 599e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("OMX_IndexParamStandardComponentRole: %s", 600e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_cmp_role->cRole); 601e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 602e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 603e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 604e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamPortDefinition: 605e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 606e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PARAM_PORTDEFINITIONTYPE *p_port_def = 607e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_PARAM_PORTDEFINITIONTYPE *) p_param_data; 608e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 609e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("OMX_IndexParamPortDefinition, port index %d", 610e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->nPortIndex); 611e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 612e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = get_port_definition(p_port_def); 613e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 614e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 615e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 616e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamCompBufferSupplier: 617e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 618e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PARAM_BUFFERSUPPLIERTYPE *p_buffer_supplier = 619e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_PARAM_BUFFERSUPPLIERTYPE *) p_param_data; 620e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 621e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("OMX_IndexParamCompBufferSupplier, port index %d", 622e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_supplier->nPortIndex); 623e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 624e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((p_buffer_supplier->nPortIndex == OMX_CORE_PORT_INDEX_IP) || 625e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (p_buffer_supplier->nPortIndex == OMX_CORE_PORT_INDEX_OP)) 626e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 627e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_supplier->eBufferSupplier = OMX_BufferSupplyUnspecified; 628e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 629e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 630e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 631e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", 632e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_supplier->nPortIndex); 633e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadPortIndex; 634e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 635e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 636e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 637e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 638e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 639e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamVideoPortFormat: 640e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 641e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_VIDEO_PARAM_PORTFORMATTYPE *p_port_format = 642e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_VIDEO_PARAM_PORTFORMATTYPE *) p_param_data; 643e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 644e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("OMX_IndexParamVideoPortFormat, " 645e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "port index %d, index %d", 646e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_format->nPortIndex, 647e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_format->nIndex); 648e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 649e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = get_video_port_format(p_port_format); 650e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 651e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 652e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 653e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamVideoMpeg2: 654e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 655e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("OMX_IndexParamVideoMpeg2: unsupported"); 656e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorUnsupportedIndex; 657e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 658e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 659e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 660e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamVideoMpeg4: 661e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 662e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("OMX_IndexParamVideoMpeg4: unsupported"); 663e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorUnsupportedIndex; 664e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 665e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 666e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 667e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamVideoAvc: 668e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 669e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("OMX_IndexParamVideoAvc: unsupported"); 670e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorUnsupportedIndex; 671e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 672e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 673e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 674e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamVideoH263: 675e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 676e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("OMX_IndexParamVideoH263: unsupported"); 677e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorUnsupportedIndex; 678e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 679e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 680e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 681e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamVideoProfileLevelQuerySupported: 682e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 683e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_VIDEO_PARAM_PROFILELEVELTYPE *p_profilelevel = 684e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_VIDEO_PARAM_PROFILELEVELTYPE *) p_param_data; 685e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 686e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("OMX_IndexParamVideoProfileLevelQuerySupported, " 687e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "port index %d, profile index %d", 688e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_profilelevel->nPortIndex, 689e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_profilelevel->nProfileIndex); 690e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 691e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = get_supported_profilelevel(p_profilelevel); 692e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 693e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 694e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 695e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 696e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 697e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /** 698e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * Vendor-specific extension indices checked here since they are not 699e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * part of the OMX_INDEXTYPE enumerated type. 700e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 701e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 702e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch ((OMX_QCOM_EXTN_INDEXTYPE) param_index) 703e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 704e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 705e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage: 706e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 707e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin GetAndroidNativeBufferUsageParams *p_buffer_usage = 708e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (GetAndroidNativeBufferUsageParams *) p_param_data; 709e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 710e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API( 711e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage, " 712e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "port index %d", p_buffer_usage->nPortIndex); 713e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 714e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p_buffer_usage->nPortIndex == OMX_CORE_PORT_INDEX_OP) 715e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 716e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_usage->nUsage = (GRALLOC_USAGE_PRIVATE_IOMMU_HEAP | 717e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin GRALLOC_USAGE_SW_READ_OFTEN | 718e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin GRALLOC_USAGE_SW_WRITE_OFTEN); 719e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 720e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 721e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 722e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", 723e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_usage->nPortIndex); 724e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadPortIndex; 725e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 726e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 727e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 728e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 729e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_QcomIndexFlexibleYUVDescription: 730e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 731e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("OMX_QcomIndexFlexibleYUVDescription"); 732e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 733e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = describe_color_format((DescribeColorFormatParams *) 734e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_param_data); 735e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 736e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 737e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 738e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 739e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 740e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("param index '0x%08x' invalid"); 741e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 742e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 743e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 744e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 745e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } // switch ((OMX_QCOM_EXTN_INDEXTYPE) param_index) 746e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 747e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } // default case 748e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 749e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } // switch (param_index) 750e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 751e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinget_parameter_exit: 752e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 753e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 754e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 755e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 756e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Set a parameter to component. 757e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 758e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] cmp_handle: Component handle. 759e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] param_index: Parameter index. 760e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_param_data: Pointer to parameter data. 761e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 762e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 763e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 764e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::set_parameter(OMX_HANDLETYPE cmp_handle, 765e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_INDEXTYPE param_index, 766e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PTR p_param_data) 767e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 768e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 769e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 770e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_state == OMX_StateInvalid) 771e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 772e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("in invalid state"); 773e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInvalidState; 774e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 775e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (cmp_handle == NULL) 776e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 777e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL"); 778e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInvalidComponent; 779e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 780e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (p_param_data == NULL) 781e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 782e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("p_param_data = NULL"); 783e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 784e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 785e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if ((m_state != OMX_StateLoaded) && 786e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_port_reconfig_inprogress == false)) 787e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 788e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("disallowed in state %s", 789e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_STATETYPE_STRING(m_state)); 790e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorIncorrectStateOperation; 791e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 792e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 793e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (retval != OMX_ErrorNone) 794e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 795e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto set_parameter_exit; 796e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 797e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 798e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch (param_index) 799e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 800e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 801e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamPriorityMgmt: 802e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 803e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PRIORITYMGMTTYPE *p_prio_mgmt = 804e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_PRIORITYMGMTTYPE *) p_param_data; 805e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 806e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("OMX_IndexConfigPriorityMgmt: " 807e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "group ID %d, group priority %d", 808e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_prio_mgmt->nGroupID, 809e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_prio_mgmt->nGroupPriority); 810e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 811e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_state != OMX_StateLoaded) 812e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 813e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("'%d' state invalid; " 814e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "should be in loaded state", 815e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_state); 816e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorIncorrectStateOperation; 817e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 818e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 819e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 820e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memcpy(&m_prio_mgmt, p_prio_mgmt, sizeof(OMX_PRIORITYMGMTTYPE)); 821e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 822e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 823e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 824e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 825e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 826e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamStandardComponentRole: 827e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 828e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PARAM_COMPONENTROLETYPE *p_cmp_role = 829e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_PARAM_COMPONENTROLETYPE *) p_param_data; 830e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 831e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("OMX_IndexParamStandardComponentRole '%s'", 832e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_cmp_role->cRole); 833e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 834e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_state != OMX_StateLoaded) 835e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 836e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("'%d' state invalid; " 837e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "should be in loaded state", 838e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_state); 839e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorIncorrectStateOperation; 840e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 841e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 842e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 843e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (strncmp((char *) p_cmp_role->cRole, 844e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_role_name, 845e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_MAX_STRINGNAME_SIZE)) 846e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 847e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("'%s': invalid component role name", 848e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_cmp_role->cRole); 849e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 850e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 851e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 852e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 853e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 854e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 855e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 856e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamPortDefinition: 857e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 858e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PARAM_PORTDEFINITIONTYPE *p_port_def = 859e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_PARAM_PORTDEFINITIONTYPE *) p_param_data; 860e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 861e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("OMX_IndexParamPortDefinition, port index %d", 862e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->nPortIndex); 863e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 864e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((m_state != OMX_StateLoaded) && 865e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (((p_port_def->nPortIndex == OMX_CORE_PORT_INDEX_IP) && 866e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_port_ip.enabled == OMX_TRUE) && 867e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_port_ip.populated == OMX_TRUE)) || 868e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ((p_port_def->nPortIndex == OMX_CORE_PORT_INDEX_OP) && 869e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_port_op.enabled == OMX_TRUE) && 870e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_port_op.populated == OMX_TRUE)))) 871e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 872e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("OMX_IndexParamPortDefinition " 873e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "disallowed in state %s " 874e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "while port %d is enabled & populated", 875e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_STATETYPE_STRING(m_state), 876e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->nPortIndex); 877e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 878e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorIncorrectStateOperation; 879e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 880e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 881e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 882e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = set_port_definition(p_port_def); 883e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 884e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 885e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 886e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 887e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 888e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamCompBufferSupplier: 889e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 890e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PARAM_BUFFERSUPPLIERTYPE *p_buffer_supplier = 891e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_PARAM_BUFFERSUPPLIERTYPE *) p_param_data; 892e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 893e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("OMX_IndexParamCompBufferSupplier: " 894e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "port index %d, buffer supplier %d", 895e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_supplier->nPortIndex, 896e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (int) p_buffer_supplier->eBufferSupplier); 897e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 898e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((p_buffer_supplier->nPortIndex != OMX_CORE_PORT_INDEX_IP) && 899e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (p_buffer_supplier->nPortIndex != OMX_CORE_PORT_INDEX_OP)) 900e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 901e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", 902e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_supplier->nPortIndex); 903e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadPortIndex; 904e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 905e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 906e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 907e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 908e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 909e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamVideoPortFormat: 910e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 911e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_VIDEO_PARAM_PORTFORMATTYPE *p_port_format = 912e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_VIDEO_PARAM_PORTFORMATTYPE *) p_param_data; 913e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 914e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("OMX_IndexParamVideoPortFormat, port index %d", 915e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_format->nPortIndex); 916e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 917e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((m_state != OMX_StateLoaded) && 918e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (((p_port_format->nPortIndex == OMX_CORE_PORT_INDEX_IP) && 919e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_port_ip.enabled == OMX_TRUE) && 920e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_port_ip.populated == OMX_TRUE)) || 921e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ((p_port_format->nPortIndex == OMX_CORE_PORT_INDEX_OP) && 922e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_port_op.enabled == OMX_TRUE) && 923e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_port_op.populated == OMX_TRUE)))) 924e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 925e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("OMX_IndexParamVideoPortFormat " 926e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "disallowed in state %s " 927e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "while port %d is enabled & populated", 928e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_STATETYPE_STRING(m_state), 929e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_format->nPortIndex); 930e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 931e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorIncorrectStateOperation; 932e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 933e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 934e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 935e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = set_video_port_format(p_port_format); 936e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 937e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 938e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 939e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 940e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 941e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamVideoMpeg2: 942e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 943e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("OMX_IndexParamVideoMpeg2 unsupported"); 944e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorUnsupportedIndex; 945e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 946e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 947e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 948e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamVideoMpeg4: 949e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 950e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("OMX_IndexParamVideoMpeg4 unsupported"); 951e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorUnsupportedIndex; 952e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 953e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 954e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 955e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamVideoAvc: 956e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 957e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("OMX_IndexParamVideoAvc unsupported"); 958e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorUnsupportedIndex; 959e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 960e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 961e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 962e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexParamVideoH263: 963e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 964e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("OMX_IndexParamVideoH263 unsupported"); 965e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorUnsupportedIndex; 966e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 967e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 968e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 969e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 970e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 971e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /** 972e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * Vendor-specific extension indices checked here since they are not 973e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * part of the OMX_INDEXTYPE enumerated type. 974e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 975e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 976e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch ((OMX_QCOM_EXTN_INDEXTYPE) param_index) 977e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 978e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 979e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_QcomIndexPortDefn: 980e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 981e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_QCOM_PARAM_PORTDEFINITIONTYPE *p_port_def = 982e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) p_param_data; 983e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 984e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("OMX_QcomIndexPortDefn, port index %d", 985e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->nPortIndex); 986e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 987e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((m_state != OMX_StateLoaded) && 988e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (((p_port_def->nPortIndex == OMX_CORE_PORT_INDEX_IP) && 989e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_port_ip.enabled == OMX_TRUE) && 990e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_port_ip.populated == OMX_TRUE)) || 991e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ((p_port_def->nPortIndex == OMX_CORE_PORT_INDEX_OP) && 992e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_port_op.enabled == OMX_TRUE) && 993e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_port_op.populated == OMX_TRUE)))) 994e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 995e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("OMX_QcomIndexPortDefn " 996e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "disallowed in state %s " 997e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "while port %d is enabled & populated", 998e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_STATETYPE_STRING(m_state), 999e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->nPortIndex); 1000e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1001e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorIncorrectStateOperation; 1002e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1003e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1004e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1005e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = set_port_definition_qcom(p_port_def); 1006e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1007e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1008e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1009e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1010e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1011e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_QcomIndexParamVideoDivx: 1012e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1013e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("OMX_QcomIndexParamVideoDivx"); 1014e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("OMX_QcomIndexParamVideoDivx unsupported"); 1015e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorUnsupportedIndex; 1016e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1017e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1018e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1019e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_QcomIndexParamVideoSyncFrameDecodingMode: 1020e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1021e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("OMX_QcomIndexParamVideoSyncFrameDecodingMode"); 1022e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_sync_frame_decoding_mode = true; 1023e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1024e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1025e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1026e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_QcomIndexParamVideoDecoderPictureOrder: 1027e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1028e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin QOMX_VIDEO_DECODER_PICTURE_ORDER *p_picture_order = 1029e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (QOMX_VIDEO_DECODER_PICTURE_ORDER *) p_param_data; 1030e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1031e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch (p_picture_order->eOutputPictureOrder) 1032e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1033e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1034e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case QOMX_VIDEO_DISPLAY_ORDER: 1035e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1036e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API( 1037e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "OMX_QcomIndexParamVideoDecoderPictureOrder, " 1038e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "QOMX_VIDEO_DISPLAY_ORDER"); 1039e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1040e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1041e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1042e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case QOMX_VIDEO_DECODE_ORDER: 1043e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1044e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR( 1045e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "OMX_QcomIndexParamVideoDecoderPictureOrder, " 1046e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "QOMX_VIDEO_DECODE_ORDER; unsupported"); 1047e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1048e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorUnsupportedSetting; 1049e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1050e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1051e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1052e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 1053e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1054e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR( 1055e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "OMX_QcomIndexParamVideoDecoderPictureOrder, %d; invalid"); 1056e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1057e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 1058e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1059e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1060e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1061e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1062e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1063e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1064e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1065e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers: 1066e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1067e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API( 1068e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "OMX_GoogleAndroidIndexEnableAndroidNativeBuffers, %s", 1069e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (((EnableAndroidNativeBuffersParams *) p_param_data)->enable ? 1070e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "enable" : 1071e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "disable")); 1072e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1073e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_android_native_buffers = 1074e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (bool) (((EnableAndroidNativeBuffersParams *) 1075e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_param_data)->enable); 1076e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1077e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1078e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1079e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1080e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_GoogleAndroidIndexUseAndroidNativeBuffer: 1081e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1082e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("OMX_GoogleAndroidIndexUseAndroidNativeBuffer " 1083e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "unsupported"); 1084e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1085e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorUnsupportedIndex; 1086e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1087e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1088e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1089e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_QcomIndexParamEnableTimeStampReorder: 1090e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1091e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API( 1092e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "OMX_QcomIndexParamEnableTimeStampReorder, %s", 1093e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (((QOMX_INDEXTIMESTAMPREORDER *) p_param_data)->bEnable ? 1094e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "enable" : 1095e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "disable")); 1096e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1097e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1098e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1099e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1100e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_QcomIndexParamVideoMetaBufferMode: 1101e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1102e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin StoreMetaDataInBuffersParams *p_meta_data = 1103e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (StoreMetaDataInBuffersParams *) p_param_data; 1104e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1105e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("OMX_QcomIndexParamVideoMetaBufferMode, " 1106e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "port index %d, %s", 1107e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_meta_data->nPortIndex, 1108e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (p_meta_data->bStoreMetaData ? 1109e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "enabled" : 1110e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "disabled")); 1111e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1112e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p_meta_data->nPortIndex == OMX_CORE_PORT_INDEX_OP) 1113e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1114e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_meta_buffer_mode = (bool) p_meta_data->bStoreMetaData; 1115e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1116e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1117e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1118e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", 1119e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_meta_data->nPortIndex); 1120e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadPortIndex; 1121e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1122e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1123e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1124e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1125e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1126e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 1127e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1128e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("param index '0x%08x' invalid"); 1129e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 1130e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1131e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1132e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1133e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } // switch ((OMX_QCOM_EXTN_INDEXTYPE) param_index) 1134e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1135e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1136e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } // default case 1137e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1138e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } // switch (param_index) 1139e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1140e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinset_parameter_exit: 1141e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 1142e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 1143e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1144e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 1145e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Get a configuration from component. 1146e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 1147e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] cmp_handle: Component handle. 1148e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] config_index: Configuration index. 1149e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_config_data: Pointer to configuration data. 1150e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 1151e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 1152e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 1153e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::get_config(OMX_HANDLETYPE cmp_handle, 1154e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_INDEXTYPE config_index, 1155e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PTR p_config_data) 1156e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 1157e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 1158e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1159e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_state == OMX_StateInvalid) 1160e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1161e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("in invalid state"); 1162e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInvalidState; 1163e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto get_config_exit; 1164e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1165e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (cmp_handle == NULL) 1166e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1167e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL"); 1168e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInvalidComponent; 1169e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto get_config_exit; 1170e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1171e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (p_config_data == NULL) 1172e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1173e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("p_config_data = NULL"); 1174e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 1175e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto get_config_exit; 1176e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1177e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1178e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch (config_index) 1179e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1180e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1181e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_IndexConfigCommonOutputCrop: 1182e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1183e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CONFIG_RECTTYPE *p_recttype = (OMX_CONFIG_RECTTYPE *) p_config_data; 1184e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1185e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("OMX_IndexConfigCommonOutputCrop, port index %d", 1186e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_recttype->nPortIndex); 1187e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1188e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p_recttype->nPortIndex == OMX_CORE_PORT_INDEX_OP) 1189e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1190e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_recttype->nLeft = 0; 1191e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_recttype->nTop = 0; 1192e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_recttype->nWidth = m_frame_dimensions.width; 1193e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_recttype->nHeight = m_frame_dimensions.height; 1194e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1195e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1196e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1197e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", 1198e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_recttype->nPortIndex); 1199e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadPortIndex; 1200e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1201e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1202e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1203e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1204e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1205e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 1206e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1207e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch ((OMX_QCOM_EXTN_INDEXTYPE) config_index) 1208e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1209e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1210e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_QcomIndexConfigInterlaced: 1211e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1212e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_QCOM_CONFIG_INTERLACETYPE *p_config_interlacetype = 1213e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_QCOM_CONFIG_INTERLACETYPE *) p_config_data; 1214e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1215e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("OMX_QcomIndexConfigInterlaced, " 1216e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "port index %d, index %d", 1217e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_config_interlacetype->nPortIndex, 1218e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_config_interlacetype->nIndex); 1219e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1220e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p_config_interlacetype->nPortIndex == OMX_CORE_PORT_INDEX_OP) 1221e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1222e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p_config_interlacetype->nIndex == 0) 1223e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1224e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_config_interlacetype->eInterlaceType = 1225e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_QCOM_InterlaceFrameProgressive; 1226e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1227e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (p_config_interlacetype->nIndex == 1) 1228e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1229e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_config_interlacetype->eInterlaceType = 1230e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst; 1231e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1232e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (p_config_interlacetype->nIndex == 2) 1233e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1234e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_config_interlacetype->eInterlaceType = 1235e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst; 1236e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1237e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1238e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1239e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("index '%d' unsupported; " 1240e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "no more interlaced types", 1241e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_config_interlacetype->nIndex); 1242e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorNoMore; 1243e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1244e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1245e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1246e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1247e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", 1248e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_config_interlacetype->nPortIndex); 1249e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadPortIndex; 1250e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1251e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1252e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1253e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1254e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1255e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_QcomIndexQueryNumberOfVideoDecInstance: 1256e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1257e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin QOMX_VIDEO_QUERY_DECODER_INSTANCES *p_decoder_instances = 1258e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (QOMX_VIDEO_QUERY_DECODER_INSTANCES *) p_config_data; 1259e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1260e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("OMX_QcomIndexQueryNumberOfVideoDecInstance"); 1261e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1262e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_decoder_instances->nNumOfInstances = OMX_SWVDEC_NUM_INSTANCES; 1263e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1264e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1265e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1266e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_QcomIndexConfigVideoFramePackingArrangement: 1267e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1268e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API( 1269e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "OMX_QcomIndexConfigVideoFramePackingArrangement"); 1270e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1271e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR( 1272e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "OMX_QcomIndexConfigVideoFramePackingArrangement unsupported"); 1273e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1274e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorUnsupportedIndex; 1275e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1276e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1277e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1278e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 1279e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1280e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("config index '%d' invalid", config_index); 1281e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 1282e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1283e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1284e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1285e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } // switch ((OMX_QCOM_EXTN_INDEXTYPE) config_index) 1286e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1287e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1288e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1289e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1290e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } // switch (config_index) 1291e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1292e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinget_config_exit: 1293e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 1294e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 1295e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1296e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 1297e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Set a configuration to component. 1298e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 1299e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 1300e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 1301e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::set_config(OMX_HANDLETYPE cmp_handle, 1302e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_INDEXTYPE config_index, 1303e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PTR p_config_data) 1304e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 1305e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (void) cmp_handle; 1306e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (void) config_index; 1307e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (void) p_config_data; 1308e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1309e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("not implemented"); 1310e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1311e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorNotImplemented; 1312e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 1313e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1314e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 1315e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Translate a vendor-specific extension string to a standard index type. 1316e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 1317e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] cmp_handle: Component handle. 1318e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] param_name: Parameter name (extension string). 1319e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] p_index_type: Pointer to extension string's index type. 1320e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 1321e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 1322e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 1323e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::get_extension_index(OMX_HANDLETYPE cmp_handle, 1324e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_STRING param_name, 1325e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_INDEXTYPE *p_index_type) 1326e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 1327e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 1328e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1329e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_state == OMX_StateInvalid) 1330e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1331e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("in invalid state"); 1332e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInvalidState; 1333e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1334e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (cmp_handle == NULL) 1335e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1336e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL"); 1337e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInvalidComponent; 1338e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1339e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (p_index_type == NULL) 1340e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1341e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("p_index_type = NULL"); 1342e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 1343e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1344e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1345e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (retval != OMX_ErrorNone) 1346e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto get_extension_index_exit; 1347e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1348e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("'%s'", param_name); 1349e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1350e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (!strncmp(param_name, 1351e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "OMX.QCOM.index.param.video.SyncFrameDecodingMode", 1352e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_MAX_STRINGNAME_SIZE)) 1353e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1354e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *p_index_type = 1355e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_INDEXTYPE) OMX_QcomIndexParamVideoSyncFrameDecodingMode; 1356e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1357e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (!strncmp(param_name, 1358e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "OMX.QCOM.index.param.IndexExtraData", 1359e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_MAX_STRINGNAME_SIZE)) 1360e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1361e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *p_index_type = (OMX_INDEXTYPE) OMX_QcomIndexParamIndexExtraDataType; 1362e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1363e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (!strncmp(param_name, 1364e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "OMX.google.android.index.enableAndroidNativeBuffers", 1365e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_MAX_STRINGNAME_SIZE)) 1366e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1367e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *p_index_type = 1368e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_INDEXTYPE) OMX_GoogleAndroidIndexEnableAndroidNativeBuffers; 1369e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1370e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (!strncmp(param_name, 1371e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "OMX.google.android.index.useAndroidNativeBuffer2", 1372e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_MAX_STRINGNAME_SIZE)) 1373e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1374e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *p_index_type = 1375e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_INDEXTYPE) OMX_GoogleAndroidIndexUseAndroidNativeBuffer2; 1376e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1377e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (!strncmp(param_name, 1378e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "OMX.google.android.index.useAndroidNativeBuffer", 1379e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_MAX_STRINGNAME_SIZE)) 1380e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1381e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *p_index_type = 1382e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_INDEXTYPE) OMX_GoogleAndroidIndexUseAndroidNativeBuffer; 1383e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1384e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (!strncmp(param_name, 1385e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "OMX.google.android.index.getAndroidNativeBufferUsage", 1386e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_MAX_STRINGNAME_SIZE)) 1387e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1388e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *p_index_type = 1389e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_INDEXTYPE) OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage; 1390e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1391e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (!strncmp(param_name, 1392e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "OMX.google.android.index.storeMetaDataInBuffers", 1393e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_MAX_STRINGNAME_SIZE)) 1394e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1395e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *p_index_type = (OMX_INDEXTYPE) OMX_QcomIndexParamVideoMetaBufferMode; 1396e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1397e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (!strncmp(param_name, 1398e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "OMX.google.android.index.describeColorFormat", 1399e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_MAX_STRINGNAME_SIZE)) 1400e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1401e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *p_index_type = (OMX_INDEXTYPE) OMX_QcomIndexFlexibleYUVDescription; 1402e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1403e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1404e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1405e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("'%s': not implemented", param_name); 1406e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorNotImplemented; 1407e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1408e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1409e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinget_extension_index_exit: 1410e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 1411e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 1412e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1413e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 1414e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Get component state. 1415e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 1416e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] cmp_handle: Component handle. 1417e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] p_state: Pointer to state variable. 1418e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 1419e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 1420e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 1421e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::get_state(OMX_HANDLETYPE cmp_handle, 1422e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_STATETYPE *p_state) 1423e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 1424e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 1425e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1426e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (cmp_handle == NULL) 1427e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1428e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL"); 1429e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInvalidComponent; 1430e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1431e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1432e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1433e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("%s", OMX_STATETYPE_STRING(m_state)); 1434e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *p_state = m_state; 1435e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1436e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1437e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 1438e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 1439e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1440e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 1441e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Component tunnel request. 1442e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 1443e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ErrorNotImplemented 1444e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 1445e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::component_tunnel_request( 1446e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_HANDLETYPE cmp_handle, 1447e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U32 port, 1448e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_HANDLETYPE peer_component, 1449e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U32 peer_port, 1450e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_TUNNELSETUPTYPE *p_tunnel_setup) 1451e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 1452e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (void) cmp_handle; 1453e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (void) port; 1454e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (void) peer_component; 1455e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (void) peer_port; 1456e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (void) p_tunnel_setup; 1457e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1458e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API(""); 1459e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1460e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("not implemented"); 1461e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1462e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorNotImplemented; 1463e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 1464e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1465e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 1466e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Use buffer. 1467e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 1468e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] cmp_handle: Component handle. 1469e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] pp_buffer_hdr: Pointer to pointer to buffer header type 1470e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * structure. 1471e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] port: Port index. 1472e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_app_data: Pointer to IL client app data. 1473e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] bytes: Size of buffer to be allocated in bytes. 1474e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_buffer: Pointer to buffer to be used. 1475e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 1476e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 1477e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 1478e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::use_buffer(OMX_HANDLETYPE cmp_handle, 1479e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE **pp_buffer_hdr, 1480e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U32 port, 1481e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PTR p_app_data, 1482e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U32 bytes, 1483e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U8 *p_buffer) 1484e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 1485e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 1486e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1487e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_state == OMX_StateInvalid) 1488e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1489e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("in invalid state"); 1490e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInvalidState; 1491e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1492e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (cmp_handle == NULL) 1493e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1494e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL"); 1495e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInvalidComponent; 1496e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1497e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (pp_buffer_hdr == NULL) 1498e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1499e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("pp_buffer_hdr = NULL"); 1500e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 1501e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1502e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1503e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1504e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("port index %d, %p", port, p_buffer); 1505e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1506e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (port == OMX_CORE_PORT_INDEX_OP) 1507e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1508e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = buffer_use_op(pp_buffer_hdr, p_app_data, bytes, p_buffer); 1509e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1510e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (retval == OMX_ErrorNone) 1511e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1512e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS retval_swvdec; 1513e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1514e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((m_status_flags & (1 << PENDING_STATE_LOADED_TO_IDLE)) && 1515e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_port_ip.populated == OMX_TRUE) && 1516e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_port_op.populated == OMX_TRUE)) 1517e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1518e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // start SwVdec 1519e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval_swvdec = swvdec_start(m_swvdec_handle)) != 1520e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS_SUCCESS) 1521e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1522e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("failed to start SwVdec"); 1523e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = retval_swvdec2omx(retval_swvdec); 1524e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto use_buffer_exit; 1525e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1526e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1527e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_status_flags &= ~(1 << PENDING_STATE_LOADED_TO_IDLE); 1528e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1529e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_post_event(OMX_SWVDEC_EVENT_CMD_ACK, 1530e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CommandStateSet, 1531e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_StateIdle); 1532e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1533e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1534e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((m_status_flags & (1 << PENDING_PORT_ENABLE_OP)) && 1535e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_port_op.populated == OMX_TRUE)) 1536e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1537e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_port_reconfig_inprogress) 1538e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1539e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // start SwVdec 1540e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval_swvdec = swvdec_start(m_swvdec_handle)) != 1541e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS_SUCCESS) 1542e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1543e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("failed to start SwVdec"); 1544e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = retval_swvdec2omx(retval_swvdec); 1545e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1546e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1547e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1548e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_status_flags &= ~(1 << PENDING_PORT_ENABLE_OP); 1549e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1550e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_post_event(OMX_SWVDEC_EVENT_CMD_ACK, 1551e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CommandPortEnable, 1552e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CORE_PORT_INDEX_OP); 1553e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1554e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1555e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1556e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1557e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1558e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", port); 1559e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadPortIndex; 1560e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1561e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1562e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1563e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinuse_buffer_exit: 1564e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 1565e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 1566e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1567e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 1568e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Allocate new buffer & associated header. 1569e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 1570e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] cmp_handle: Component handle. 1571e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] pp_buffer_hdr: Pointer to pointer to buffer header type 1572e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * structure. 1573e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] port: Port index. 1574e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_app_data: Pointer to IL client app data. 1575e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] bytes: Size of buffer to be allocated in bytes. 1576e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 1577e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 1578e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 1579e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::allocate_buffer(OMX_HANDLETYPE cmp_handle, 1580e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE **pp_buffer_hdr, 1581e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U32 port, 1582e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PTR p_app_data, 1583e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U32 bytes) 1584e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 1585e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 1586e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1587e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_state == OMX_StateInvalid) 1588e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1589e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("in invalid state"); 1590e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInvalidState; 1591e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1592e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (cmp_handle == NULL) 1593e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1594e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL"); 1595e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInvalidComponent; 1596e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1597e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (pp_buffer_hdr == NULL) 1598e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1599e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("pp_buffer_hdr = NULL"); 1600e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 1601e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1602e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1603e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1604e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("port index %d, %d bytes", port, bytes); 1605e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1606e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (port == OMX_CORE_PORT_INDEX_IP) 1607e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1608e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = buffer_allocate_ip(pp_buffer_hdr, 1609e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_app_data, 1610e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bytes); 1611e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1612e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (port == OMX_CORE_PORT_INDEX_OP) 1613e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1614e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_meta_buffer_mode == true) 1615e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1616e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("'meta buffer mode' enabled"); 1617e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 1618e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1619e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (m_android_native_buffers == true) 1620e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1621e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("'android native buffers' enabled"); 1622e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 1623e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1624e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1625e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1626e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = buffer_allocate_op(pp_buffer_hdr, 1627e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_app_data, 1628e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bytes); 1629e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1630e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1631e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1632e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1633e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("port index %d invalid", port); 1634e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadPortIndex; 1635e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1636e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1637e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (retval == OMX_ErrorNone) 1638e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1639e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS retval_swvdec; 1640e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1641e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((m_status_flags & (1 << PENDING_STATE_LOADED_TO_IDLE)) && 1642e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_port_ip.populated == OMX_TRUE) && 1643e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_port_op.populated == OMX_TRUE)) 1644e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1645e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // start SwVdec 1646e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval_swvdec = swvdec_start(m_swvdec_handle)) != 1647e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS_SUCCESS) 1648e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1649e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("failed to start SwVdec"); 1650e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = retval_swvdec2omx(retval_swvdec); 1651e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto allocate_buffer_exit; 1652e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1653e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1654e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_status_flags &= ~(1 << PENDING_STATE_LOADED_TO_IDLE); 1655e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1656e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_post_event(OMX_SWVDEC_EVENT_CMD_ACK, 1657e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CommandStateSet, 1658e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_StateIdle); 1659e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1660e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1661e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((m_status_flags & (1 << PENDING_PORT_ENABLE_IP)) && 1662e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_port_ip.populated == OMX_TRUE)) 1663e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1664e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_status_flags &= ~(1 << PENDING_PORT_ENABLE_IP); 1665e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1666e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_post_event(OMX_SWVDEC_EVENT_CMD_ACK, 1667e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CommandPortEnable, 1668e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CORE_PORT_INDEX_IP); 1669e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1670e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1671e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((m_status_flags & (1 << PENDING_PORT_ENABLE_OP)) && 1672e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_port_op.populated == OMX_TRUE)) 1673e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1674e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_port_reconfig_inprogress) 1675e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1676e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // start SwVdec 1677e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval_swvdec = swvdec_start(m_swvdec_handle)) != 1678e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS_SUCCESS) 1679e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1680e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("failed to start SwVdec"); 1681e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = retval_swvdec2omx(retval_swvdec); 1682e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1683e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1684e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1685e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_status_flags &= ~(1 << PENDING_PORT_ENABLE_OP); 1686e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1687e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_post_event(OMX_SWVDEC_EVENT_CMD_ACK, 1688e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CommandPortEnable, 1689e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CORE_PORT_INDEX_OP); 1690e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1691e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1692e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1693e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1694e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinallocate_buffer_exit: 1695e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 1696e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 1697e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1698e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 1699e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Release buffer & associated header. 1700e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 1701e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] cmp_handle: Component handle. 1702e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] port: Port index. 1703e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_buffer_hdr: Pointer to buffer's buffer header. 1704e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 1705e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 1706e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 1707e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::free_buffer(OMX_HANDLETYPE cmp_handle, 1708e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U32 port, 1709e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE *p_buffer_hdr) 1710e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 1711e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 1712e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1713e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (cmp_handle == NULL) 1714e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1715e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL"); 1716e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInvalidComponent; 1717e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1718e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (p_buffer_hdr == NULL) 1719e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1720e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("p_buffer_hdr = NULL"); 1721e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 1722e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1723e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if ((port != OMX_CORE_PORT_INDEX_IP) && 1724e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (port != OMX_CORE_PORT_INDEX_OP)) 1725e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1726e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", port); 1727e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadPortIndex; 1728e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1729e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (m_state != OMX_StateIdle) 1730e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1731e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_state != OMX_StateExecuting) 1732e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1733e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("disallowed in state %s", 1734e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_STATETYPE_STRING(m_state)); 1735e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorIncorrectStateOperation; 1736e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1737e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1738e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1739e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (((port == OMX_CORE_PORT_INDEX_IP) && m_port_ip.enabled) || 1740e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ((port == OMX_CORE_PORT_INDEX_OP) && m_port_op.enabled)) 1741e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1742e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("port index %d not disabled", port); 1743e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadPortIndex; 1744e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1745e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1746e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1747e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1748e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (retval == OMX_ErrorNone) 1749e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1750e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("port index %d, %p", port, p_buffer_hdr); 1751e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1752e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (port == OMX_CORE_PORT_INDEX_IP) 1753e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1754e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = buffer_deallocate_ip(p_buffer_hdr); 1755e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1756e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1757e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1758e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = buffer_deallocate_op(p_buffer_hdr); 1759e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1760e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1761e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1762e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval == OMX_ErrorNone) && 1763e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_status_flags & (1 << PENDING_STATE_IDLE_TO_LOADED))) 1764e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1765e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((m_port_ip.unpopulated == OMX_TRUE) && 1766e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_port_op.unpopulated == OMX_TRUE)) 1767e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1768e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS retval_swvdec; 1769e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1770e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // stop SwVdec 1771e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval_swvdec = swvdec_stop(m_swvdec_handle)) == 1772e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS_SUCCESS) 1773e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1774e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_status_flags &= ~(1 << PENDING_STATE_IDLE_TO_LOADED); 1775e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1776e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_post_event(OMX_SWVDEC_EVENT_CMD_ACK, 1777e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CommandStateSet, 1778e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_StateLoaded); 1779e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1780e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 1781e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1782e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("failed to stop SwVdec"); 1783e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = retval_swvdec2omx(retval_swvdec); 1784e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1785e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1786e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1787e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1788e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval == OMX_ErrorNone) && 1789e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_status_flags & (1 << PENDING_PORT_DISABLE_IP)) && 1790e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.unpopulated) 1791e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1792e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_status_flags &= ~(1 << PENDING_PORT_DISABLE_IP); 1793e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1794e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_post_event(OMX_SWVDEC_EVENT_CMD_ACK, 1795e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CommandPortDisable, 1796e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CORE_PORT_INDEX_IP); 1797e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1798e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1799e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval == OMX_ErrorNone) && 1800e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_status_flags & (1 << PENDING_PORT_DISABLE_OP)) && 1801e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.unpopulated) 1802e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1803e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_port_reconfig_inprogress) 1804e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1805e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS retval_swvdec; 1806e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1807e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval_swvdec = swvdec_stop(m_swvdec_handle)) != 1808e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS_SUCCESS) 1809e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1810e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("failed to stop SwVdec"); 1811e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = retval_swvdec2omx(retval_swvdec); 1812e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1813e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1814e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1815e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_status_flags &= ~(1 << PENDING_PORT_DISABLE_OP); 1816e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1817e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_post_event(OMX_SWVDEC_EVENT_CMD_ACK, 1818e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CommandPortDisable, 1819e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CORE_PORT_INDEX_OP); 1820e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1821e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1822e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 1823e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 1824e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1825e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 1826e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Send a buffer to component's input port to be emptied. 1827e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 1828e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] cmp_handle: Component handle. 1829e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_buffer_hdr: Pointer to buffer's buffer header. 1830e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 1831e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 1832e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 1833e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::empty_this_buffer(OMX_HANDLETYPE cmp_handle, 1834e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE *p_buffer_hdr) 1835e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 1836e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 1837e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1838e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int ii; 1839e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1840e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_state == OMX_StateInvalid) 1841e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1842e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("in invalid state"); 1843e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInvalidState; 1844e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1845e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (cmp_handle == NULL) 1846e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1847e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL"); 1848e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInvalidComponent; 1849e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1850e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (p_buffer_hdr == NULL) 1851e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1852e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("p_buffer_hdr = NULL"); 1853e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 1854e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1855e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (p_buffer_hdr->pBuffer == NULL) 1856e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1857e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("p_buffer_hdr->pBuffer = NULL"); 1858e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 1859e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1860e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (p_buffer_hdr->pInputPortPrivate == NULL) 1861e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1862e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("p_buffer_hdr->pInputPortPrivate = NULL"); 1863e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 1864e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1865e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (m_port_ip.enabled == OMX_FALSE) 1866e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1867e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("ip port disabled"); 1868e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorIncorrectStateOperation; 1869e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1870e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (p_buffer_hdr->nInputPortIndex != OMX_CORE_PORT_INDEX_IP) 1871e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1872e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", 1873e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->nInputPortIndex); 1874e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadPortIndex; 1875e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1876e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1877e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (retval != OMX_ErrorNone) 1878e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1879e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto empty_this_buffer_exit; 1880e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1881e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1882e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for (ii = 0; ii < m_port_ip.def.nBufferCountActual; ii++) 1883e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1884e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p_buffer_hdr == &(m_buffer_array_ip[ii].buffer_header)) 1885e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1886e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_LOW("ip buffer %p has index %d", 1887e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->pBuffer, 1888e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ii); 1889e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1890e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1891e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1892e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1893e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ii == m_port_ip.def.nBufferCountActual) 1894e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1895e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("ip buffer %p not found", 1896e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->pBuffer); 1897e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 1898e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto empty_this_buffer_exit; 1899e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1900e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1901e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_sync_frame_decoding_mode && 1902e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ((p_buffer_hdr->nFlags & OMX_BUFFERFLAG_CODECCONFIG) == 0)) 1903e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1904e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->nFlags |= OMX_BUFFERFLAG_EOS; 1905e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1906e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1907e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("%p: buffer %p, flags 0x%08x, filled length %d, " 1908e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "timestamp %lld", 1909e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr, 1910e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->pBuffer, 1911e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->nFlags, 1912e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->nFilledLen, 1913e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->nTimeStamp); 1914e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1915e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_post_event(OMX_SWVDEC_EVENT_ETB, 1916e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (unsigned long) p_buffer_hdr, 1917e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (unsigned long) ii); 1918e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1919e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinempty_this_buffer_exit: 1920e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 1921e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 1922e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1923e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 1924e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Send a buffer to component's output port to be filled. 1925e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 1926e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] cmp_handle: Component handle. 1927e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_buffer_hdr: Pointer to buffer's buffer header. 1928e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 1929e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 1930e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 1931e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::fill_this_buffer(OMX_HANDLETYPE cmp_handle, 1932e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE *p_buffer_hdr) 1933e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 1934e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 1935e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1936e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int ii; 1937e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1938e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_BUFFER *p_buffer_swvdec; 1939e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1940e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_state == OMX_StateInvalid) 1941e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1942e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("in invalid state"); 1943e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInvalidState; 1944e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1945e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (cmp_handle == NULL) 1946e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1947e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL"); 1948e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInvalidComponent; 1949e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1950e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (p_buffer_hdr == NULL) 1951e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1952e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("p_buffer_hdr = NULL"); 1953e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 1954e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1955e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (p_buffer_hdr->pBuffer == NULL) 1956e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1957e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("p_buffer_hdr->pBuffer = NULL"); 1958e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 1959e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1960e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (p_buffer_hdr->pOutputPortPrivate == NULL) 1961e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1962e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("p_buffer_hdr->pOutputPortPrivate = NULL"); 1963e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 1964e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1965e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (m_port_op.enabled == OMX_FALSE) 1966e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1967e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("op port disabled"); 1968e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorIncorrectStateOperation; 1969e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1970e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (p_buffer_hdr->nOutputPortIndex != OMX_CORE_PORT_INDEX_OP) 1971e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1972e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", 1973e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->nOutputPortIndex); 1974e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadPortIndex; 1975e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1976e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1977e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (retval != OMX_ErrorNone) 1978e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1979e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto fill_this_buffer_exit; 1980e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1981e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1982e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("%p", p_buffer_hdr); 1983e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1984e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for (ii = 0; ii < m_port_op.def.nBufferCountActual; ii++) 1985e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1986e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p_buffer_hdr == &(m_buffer_array_op[ii].buffer_header)) 1987e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1988e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_LOW("op buffer %p has index %d", 1989e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->pBuffer, 1990e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ii); 1991e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 1992e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1993e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 1994e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1995e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ii == m_port_op.def.nBufferCountActual) 1996e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 1997e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("op buffer %p not found", 1998e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->pBuffer); 1999e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 2000e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto fill_this_buffer_exit; 2001e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2002e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2003e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_swvdec = &m_buffer_array_op[ii].buffer_swvdec; 2004e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2005e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_meta_buffer_mode) 2006e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2007e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct VideoDecoderOutputMetaData *p_meta_data; 2008e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2009e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin private_handle_t *p_private_handle; 2010e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2011e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct vdec_bufferpayload *p_buffer_payload; 2012e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2013e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_meta_data = 2014e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (struct VideoDecoderOutputMetaData *) p_buffer_hdr->pBuffer; 2015e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2016e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_private_handle = (private_handle_t *) (p_meta_data->pHandle); 2017e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2018e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_payload = &m_buffer_array_op[ii].buffer_payload; 2019e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2020e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p_private_handle == NULL) 2021e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2022e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR( 2023e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "p_buffer_hdr->pBuffer->pHandle = NULL"); 2024e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2025e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 2026e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto fill_this_buffer_exit; 2027e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2028e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2029e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pthread_mutex_lock(&m_meta_buffer_array_mutex); 2030e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2031e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_meta_buffer_array[ii].ref_count == 0) 2032e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2033e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned char *bufferaddr; 2034e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2035e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufferaddr = (unsigned char *) mmap(NULL, 2036e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.def.nBufferSize, 2037e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin PROT_READ | PROT_WRITE, 2038e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin MAP_SHARED, 2039e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_private_handle->fd, 2040e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 0); 2041e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2042e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (bufferaddr == MAP_FAILED) 2043e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2044e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("mmap() failed for " 2045e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "fd %d of size %d", 2046e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_private_handle->fd, 2047e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.def.nBufferSize); 2048e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2049e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInsufficientResources; 2050e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto fill_this_buffer_exit; 2051e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2052e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2053e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_payload->bufferaddr = bufferaddr; 2054e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_payload->pmem_fd = p_private_handle->fd; 2055e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_payload->buffer_len = m_port_op.def.nBufferSize; 2056e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_payload->mmaped_size = m_port_op.def.nBufferSize; 2057e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2058e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_swvdec->p_buffer = bufferaddr; 2059e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_swvdec->size = m_port_op.def.nBufferSize; 2060e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_swvdec->p_client_data = (void *) ((unsigned long) ii); 2061e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2062e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2063e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pthread_mutex_unlock(&m_meta_buffer_array_mutex); 2064e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2065e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin meta_buffer_ref_add(ii, 2066e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_payload->pmem_fd, 2067e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_payload->offset); 2068e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2069e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2070e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_LOW("%p: buffer %p", 2071e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr, 2072e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_swvdec->p_buffer); 2073e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2074e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_post_event(OMX_SWVDEC_EVENT_FTB, 2075e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (unsigned long) p_buffer_hdr, 2076e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (unsigned long) ii); 2077e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2078e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinfill_this_buffer_exit: 2079e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 2080e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 2081e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2082e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 2083e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Set component's callback structure. 2084e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 2085e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] cmp_handle: Component handle. 2086e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_callbacks: Pointer to callback structure. 2087e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_app_data: Pointer to IL client app data. 2088e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 2089e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 2090e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 2091e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::set_callbacks(OMX_HANDLETYPE cmp_handle, 2092e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CALLBACKTYPE *p_callbacks, 2093e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PTR p_app_data) 2094e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 2095e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 2096e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2097e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API(""); 2098e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2099e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_state == OMX_StateInvalid) 2100e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2101e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("in invalid state"); 2102e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInvalidState; 2103e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2104e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (cmp_handle == NULL) 2105e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2106e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL"); 2107e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInvalidComponent; 2108e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2109e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (p_callbacks->EventHandler == NULL) 2110e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2111e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("p_callbacks->EventHandler = NULL"); 2112e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 2113e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2114e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (p_callbacks->EmptyBufferDone == NULL) 2115e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2116e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("p_callbacks->EmptyBufferDone = NULL"); 2117e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 2118e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2119e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (p_callbacks->FillBufferDone == NULL) 2120e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2121e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("p_callbacks->FillBufferDone = NULL"); 2122e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 2123e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2124e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2125e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2126e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_callback = *p_callbacks; 2127e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_app_data = p_app_data; 2128e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2129e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2130e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 2131e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 2132e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2133e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 2134e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Use EGL image. 2135e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 2136e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ErrorNotImplemented 2137e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 2138e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::use_EGL_image(OMX_HANDLETYPE cmp_handle, 2139e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE **pp_buffer_hdr, 2140e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U32 port, 2141e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PTR p_app_data, 2142e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin void *egl_image) 2143e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 2144e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (void) cmp_handle; 2145e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (void) pp_buffer_hdr; 2146e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (void) port; 2147e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (void) p_app_data; 2148e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (void) egl_image; 2149e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2150e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API(""); 2151e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2152e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("not implemented"); 2153e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2154e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorNotImplemented; 2155e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 2156e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2157e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 2158e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Enumerate component role. 2159e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 2160e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] cmp_handle: Component handle. 2161e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] p_role: Pointer to component role string. 2162e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] index: Role index being queried. 2163e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 2164e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 2165e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 2166e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::component_role_enum(OMX_HANDLETYPE cmp_handle, 2167e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U8 *p_role, 2168e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U32 index) 2169e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 2170e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 2171e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2172e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_state == OMX_StateInvalid) 2173e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2174e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("in invalid state"); 2175e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInvalidState; 2176e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2177e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (cmp_handle == NULL) 2178e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2179e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL"); 2180e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInvalidComponent; 2181e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2182e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (index > 0) 2183e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2184e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("index '%d' unsupported; no more roles", index); 2185e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorNoMore; 2186e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2187e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2188e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2189e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin memcpy(p_role, m_role_name, OMX_MAX_STRINGNAME_SIZE); 2190e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_API("index '%d': '%s'", index, p_role); 2191e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2192e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2193e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 2194e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 2195e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2196e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 2197e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * ------------------------- 2198e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * SwVdec callback functions 2199e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * ------------------------- 2200e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 2201e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2202e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 2203e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief SwVdec empty buffer done callback. 2204e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 2205e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] swvdec_handle: SwVdec handle. 2206e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_buffer_ip: Pointer to input buffer structure. 2207e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_client_handle: Pointer to SwVdec's client handle. 2208e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 2209e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval SWVDEC_STATUS_SUCCESS 2210e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval SWVDEC_STATUS_NULL_POINTER 2211e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval SWVDEC_STATUS_INVALID_PARAMETERS 2212e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 2213e4010605f233a213cf0d972397bb33c34c364227Patrick TjinSWVDEC_STATUS omx_swvdec::swvdec_empty_buffer_done_callback( 2214e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_HANDLE swvdec_handle, 2215e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_BUFFER *p_buffer_ip, 2216e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin void *p_client_handle) 2217e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 2218e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS retval = SWVDEC_STATUS_SUCCESS; 2219e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2220e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p_buffer_ip == NULL) 2221e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2222e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("p_buffer_ip = NULL"); 2223e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = SWVDEC_STATUS_NULL_POINTER; 2224e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2225e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (p_client_handle == NULL) 2226e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2227e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("p_client_handle = NULL"); 2228e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = SWVDEC_STATUS_NULL_POINTER; 2229e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2230e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2231e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2232e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_swvdec *p_omx_swvdec = (omx_swvdec *) p_client_handle; 2233e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2234e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (swvdec_handle != p_omx_swvdec->m_swvdec_handle) 2235e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2236e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("invalid SwVdec handle"); 2237e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = SWVDEC_STATUS_INVALID_PARAMETERS; 2238e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2239e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2240e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2241e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_omx_swvdec->swvdec_empty_buffer_done(p_buffer_ip); 2242e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2243e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2244e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2245e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 2246e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 2247e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2248e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 2249e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief SwVdec fill buffer done callback. 2250e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 2251e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] swvdec_handle: SwVdec handle. 2252e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_buffer_op: Pointer to output buffer structure. 2253e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_client_handle: Pointer to SwVdec's client handle. 2254e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 2255e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval SWVDEC_STATUS_SUCCESS 2256e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval SWVDEC_STATUS_NULL_POINTER 2257e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval SWVDEC_STATUS_INVALID_PARAMETERS 2258e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 2259e4010605f233a213cf0d972397bb33c34c364227Patrick TjinSWVDEC_STATUS omx_swvdec::swvdec_fill_buffer_done_callback( 2260e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_HANDLE swvdec_handle, 2261e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_BUFFER *p_buffer_op, 2262e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin void *p_client_handle) 2263e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 2264e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS retval = SWVDEC_STATUS_SUCCESS; 2265e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2266e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p_buffer_op == NULL) 2267e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2268e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("p_buffer_op = NULL"); 2269e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = SWVDEC_STATUS_NULL_POINTER; 2270e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2271e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (p_client_handle == NULL) 2272e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2273e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("p_client_handle = NULL"); 2274e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = SWVDEC_STATUS_NULL_POINTER; 2275e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2276e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2277e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2278e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_swvdec *p_omx_swvdec = (omx_swvdec *) p_client_handle; 2279e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2280e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (swvdec_handle != p_omx_swvdec->m_swvdec_handle) 2281e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2282e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("invalid SwVdec handle"); 2283e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = SWVDEC_STATUS_INVALID_PARAMETERS; 2284e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2285e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2286e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2287e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_omx_swvdec->swvdec_fill_buffer_done(p_buffer_op); 2288e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2289e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2290e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2291e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 2292e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 2293e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2294e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 2295e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief SwVdec event handler callback. 2296e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 2297e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] swvdec_handle: SwVdec handle. 2298e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] event: Event. 2299e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_data: Pointer to event-specific data. 2300e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_client_handle: Pointer to SwVdec's client handle. 2301e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 2302e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval SWVDEC_STATUS_SUCCESS 2303e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval SWVDEC_STATUS_NULL_POINTER 2304e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval SWVDEC_STATUS_INVALID_PARAMETERS 2305e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 2306e4010605f233a213cf0d972397bb33c34c364227Patrick TjinSWVDEC_STATUS omx_swvdec::swvdec_event_handler_callback( 2307e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_HANDLE swvdec_handle, 2308e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_EVENT event, 2309e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin void *p_data, 2310e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin void *p_client_handle) 2311e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 2312e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS retval = SWVDEC_STATUS_SUCCESS; 2313e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2314e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((event == SWVDEC_EVENT_RELEASE_REFERENCE) && (p_data == NULL)) 2315e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2316e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("p_data = NULL"); 2317e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = SWVDEC_STATUS_NULL_POINTER; 2318e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2319e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (p_client_handle == NULL) 2320e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2321e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("p_client_handle = NULL"); 2322e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = SWVDEC_STATUS_NULL_POINTER; 2323e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2324e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2325e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2326e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_swvdec *p_omx_swvdec = (omx_swvdec *) p_client_handle; 2327e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2328e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (swvdec_handle != p_omx_swvdec->m_swvdec_handle) 2329e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2330e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("invalid SwVdec handle"); 2331e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = SWVDEC_STATUS_INVALID_PARAMETERS; 2332e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2333e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2334e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2335e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_omx_swvdec->swvdec_event_handler(event, p_data); 2336e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2337e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2338e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2339e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 2340e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 2341e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2342e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 2343e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * ----------------- 2344e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * PRIVATE FUNCTIONS 2345e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * ----------------- 2346e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 2347e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2348e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 2349e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Set frame dimensions for OMX component & SwVdec core. 2350e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 2351e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] width: Frame width. 2352e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] height: Frame height. 2353e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 2354e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 2355e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 2356e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::set_frame_dimensions(unsigned int width, 2357e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int height) 2358e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 2359e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval; 2360e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2361e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_frame_dimensions.width = width; 2362e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_frame_dimensions.height = height; 2363e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2364e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("%d x %d", 2365e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_frame_dimensions.width, 2366e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_frame_dimensions.height); 2367e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2368e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = set_frame_dimensions_swvdec(); 2369e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2370e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 2371e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 2372e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2373e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 2374e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Set frame attributes for OMX component & SwVdec core, based on 2375e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * frame dimensions & alignment factors. 2376e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 2377e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] alignment_stride: Frame stride alignment factor. 2378e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] alignment_scanlines_y: Frame luma scanlines alignment factor. 2379e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] alignment_scanlines_uv: Frame chroma scanlines alignment factor. 2380e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] alignment_size: Frame size alignment factor. 2381e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 2382e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 2383e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 2384e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::set_frame_attributes( 2385e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int alignment_stride, 2386e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int alignment_scanlines_y, 2387e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int alignment_scanlines_uv, 2388e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int alignment_size) 2389e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 2390e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval; 2391e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2392e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int width = m_frame_dimensions.width; 2393e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int height = m_frame_dimensions.height; 2394e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2395e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int scanlines_uv; 2396e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2397e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int plane_size_y; 2398e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int plane_size_uv; 2399e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2400e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_frame_attributes.stride = ALIGN(width, alignment_stride); 2401e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_frame_attributes.scanlines = ALIGN(height, alignment_scanlines_y); 2402e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2403e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin scanlines_uv = ALIGN(height / 2, alignment_scanlines_uv); 2404e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2405e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin plane_size_y = m_frame_attributes.stride * m_frame_attributes.scanlines; 2406e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin plane_size_uv = m_frame_attributes.stride * scanlines_uv; 2407e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2408e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_frame_attributes.size = 2409e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ALIGN(plane_size_y + plane_size_uv, alignment_size); 2410e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2411e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("stride %d, scanlines %d, size %d", 2412e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_frame_attributes.stride, 2413e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_frame_attributes.scanlines, 2414e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_frame_attributes.size); 2415e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2416e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = set_frame_attributes_swvdec(); 2417e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2418e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 2419e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 2420e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2421e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 2422e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Get video port format for input or output port. 2423e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 2424e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] p_port_format: Pointer to video port format type. 2425e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 2426e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 2427e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 2428e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::get_video_port_format( 2429e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_VIDEO_PARAM_PORTFORMATTYPE *p_port_format) 2430e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 2431e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 2432e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2433e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p_port_format->nPortIndex == OMX_CORE_PORT_INDEX_IP) 2434e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2435e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p_port_format->nIndex == 0) 2436e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2437e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_format->eColorFormat = OMX_COLOR_FormatUnused; 2438e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_format->eCompressionFormat = m_omx_video_codingtype; 2439e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2440e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("color format 0x%08x, " 2441e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "compression format 0x%08x", 2442e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_format->eColorFormat, 2443e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_format->eCompressionFormat); 2444e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2445e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2446e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2447e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("index '%d' unsupported; " 2448e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "no more compression formats", 2449e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_format->nIndex); 2450e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorNoMore; 2451e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2452e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2453e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (p_port_format->nPortIndex == OMX_CORE_PORT_INDEX_OP) 2454e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2455e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p_port_format->nIndex == 0) 2456e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2457e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_format->eColorFormat = 2458e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_QCOM_COLOR_FormatYUV420PackedSemiPlanar32m; 2459e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_format->eCompressionFormat = OMX_VIDEO_CodingUnused; 2460e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2461e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("color format 0x%08x, " 2462e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "compression format 0x%08x", 2463e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_format->eColorFormat, 2464e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_format->eCompressionFormat); 2465e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2466e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (p_port_format->nIndex == 1) 2467e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2468e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_format->eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar; 2469e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_format->eCompressionFormat = OMX_VIDEO_CodingUnused; 2470e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2471e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("color format 0x%08x, " 2472e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "compression format 0x%08x", 2473e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_format->eColorFormat, 2474e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_format->eCompressionFormat); 2475e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2476e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // Here, add additional supported color formats as necessary. 2477e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2478e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2479e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("index '%d' unsupported; no more color formats", 2480e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_format->nIndex); 2481e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorNoMore; 2482e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2483e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2484e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2485e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2486e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", 2487e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_format->nPortIndex); 2488e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadPortIndex; 2489e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2490e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2491e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 2492e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 2493e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2494e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 2495e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Set video port format for input or output port. 2496e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 2497e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_port_format: Pointer to video port format type. 2498e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 2499e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 2500e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 2501e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::set_video_port_format( 2502e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_VIDEO_PARAM_PORTFORMATTYPE *p_port_format) 2503e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 2504e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 2505e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2506e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p_port_format->nPortIndex == OMX_CORE_PORT_INDEX_IP) 2507e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2508e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // do nothing 2509e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("OMX_IndexParamVideoPortFormat, port index 0; " 2510e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "doing nothing"); 2511e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2512e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (p_port_format->nPortIndex == OMX_CORE_PORT_INDEX_OP) 2513e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2514e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /** 2515e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * If color format specified by IL client is different from default, 2516e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * set alignment factors for new color format and call 2517e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * set_frame_attributes(). 2518e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 2519e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch (p_port_format->eColorFormat) 2520e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2521e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2522e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_QCOM_COLOR_FormatYUV420PackedSemiPlanar32m: 2523e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2524e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // do nothing; this is the default color format 2525e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH( 2526e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "'0x%08x': OMX_QCOM_COLOR_FormatYUV420PackedSemiPlanar32m", 2527e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_format->eColorFormat); 2528e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 2529e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2530e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2531e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_COLOR_FormatYUV420SemiPlanar: 2532e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2533e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("'0x%08x': OMX_COLOR_FormatYUV420SemiPlanar", 2534e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_format->eColorFormat); 2535e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2536e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = set_frame_attributes(16, // stride alignment 2537e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1, // Y scanlines alignment 2538e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 1, // UV scanlines alignment 2539e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4096); // size alignment 2540e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 2541e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2542e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2543e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 2544e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2545e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("color format '0x%08x' invalid or unsupported", 2546e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_format->eColorFormat); 2547e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 2548e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 2549e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2550e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2551e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2552e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2553e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2554e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2555e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", 2556e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_format->nPortIndex); 2557e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadPortIndex; 2558e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2559e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2560e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinset_video_port_format_exit: 2561e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 2562e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 2563e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2564e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 2565e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Get port definition for input or output port. 2566e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 2567e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] p_port_def: Pointer to port definition type. 2568e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 2569e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 2570e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 2571e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::get_port_definition( 2572e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PARAM_PORTDEFINITIONTYPE *p_port_def) 2573e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 2574e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 2575e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2576e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->eDomain = OMX_PortDomainVideo; 2577e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2578e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p_port_def->nPortIndex == OMX_CORE_PORT_INDEX_IP) 2579e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2580e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval = get_buffer_requirements_swvdec(OMX_CORE_PORT_INDEX_IP)) != 2581e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ErrorNone) 2582e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2583e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto get_port_definition_exit; 2584e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2585e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2586e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->eDir = OMX_DirInput; 2587e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->nBufferCountActual = m_port_ip.def.nBufferCountActual; 2588e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->nBufferCountMin = m_port_ip.def.nBufferCountMin; 2589e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->nBufferSize = m_port_ip.def.nBufferSize; 2590e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->bEnabled = m_port_ip.enabled; 2591e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->bPopulated = m_port_ip.populated; 2592e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2593e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("port index %d: " 2594e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "count actual %d, count min %d, size %d", 2595e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->nPortIndex, 2596e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->nBufferCountActual, 2597e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->nBufferCountMin, 2598e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->nBufferSize); 2599e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2600e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // frame dimensions & attributes don't apply to input port 2601e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2602e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->format.video.eColorFormat = OMX_COLOR_FormatUnused; 2603e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->format.video.eCompressionFormat = m_omx_video_codingtype; 2604e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2605e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (p_port_def->nPortIndex == OMX_CORE_PORT_INDEX_OP) 2606e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2607e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int frame_width = m_frame_dimensions.width; 2608e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int frame_height = m_frame_dimensions.height; 2609e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2610e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval = get_frame_dimensions_swvdec()) != OMX_ErrorNone) 2611e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2612e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto get_port_definition_exit; 2613e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2614e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2615e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->format.video.nFrameWidth = m_frame_dimensions.width; 2616e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->format.video.nFrameHeight = m_frame_dimensions.height; 2617e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2618e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // if frame dimensions have changed, update frame attributes 2619e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((frame_width != m_frame_dimensions.width) || 2620e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (frame_height != m_frame_dimensions.height)) 2621e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2622e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval = set_frame_attributes(DEFAULT_ALIGNMENT_STRIDE, 2623e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEFAULT_ALIGNMENT_SCANLINES_Y, 2624e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEFAULT_ALIGNMENT_SCANLINES_UV, 2625e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEFAULT_ALIGNMENT_SIZE)) != 2626e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ErrorNone) 2627e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2628e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto get_port_definition_exit; 2629e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2630e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2631e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2632e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval = get_frame_attributes_swvdec()) != OMX_ErrorNone) 2633e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2634e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto get_port_definition_exit; 2635e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2636e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2637e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->format.video.nStride = m_frame_attributes.stride; 2638e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->format.video.nSliceHeight = m_frame_attributes.scanlines; 2639e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2640e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("port index %d: " 2641e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "%d x %d, stride %d, sliceheight %d", 2642e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->nPortIndex, 2643e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->format.video.nFrameWidth, 2644e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->format.video.nFrameHeight, 2645e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->format.video.nStride, 2646e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->format.video.nSliceHeight); 2647e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2648e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /** 2649e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * Query to SwVdec core for buffer requirements is not allowed in 2650e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * executing state since it will overwrite the component's buffer 2651e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * requirements updated via the most recent set_parameter(). 2652e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 2653e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * Buffer requirements communicated to component via set_parameter() are 2654e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * not propagated to SwVdec core. 2655e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 2656e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * The only execption is if port reconfiguration is in progress, in 2657e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * which case the query to SwVdec core is required since buffer 2658e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * requirements can change based on new dimensions. 2659e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 2660e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((m_state != OMX_StateExecuting) || m_port_reconfig_inprogress) 2661e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2662e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval = 2663e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin get_buffer_requirements_swvdec(OMX_CORE_PORT_INDEX_OP)) != 2664e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ErrorNone) 2665e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2666e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto get_port_definition_exit; 2667e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2668e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2669e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2670e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->eDir = OMX_DirOutput; 2671e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->nBufferCountActual = m_port_op.def.nBufferCountActual; 2672e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->nBufferCountMin = m_port_op.def.nBufferCountMin; 2673e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->nBufferSize = m_port_op.def.nBufferSize; 2674e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->bEnabled = m_port_op.enabled; 2675e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->bPopulated = m_port_op.populated; 2676e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2677e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("port index %d: " 2678e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "count actual %d, count min %d, size %d", 2679e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->nPortIndex, 2680e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->nBufferCountActual, 2681e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->nBufferCountMin, 2682e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->nBufferSize); 2683e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2684e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->format.video.eColorFormat = m_omx_color_formattype; 2685e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused; 2686e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2687e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2688e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2689e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", p_port_def->nPortIndex); 2690e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadPortIndex; 2691e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2692e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2693e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinget_port_definition_exit: 2694e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 2695e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 2696e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2697e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 2698e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Set port definition for input or output port. 2699e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 2700e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_port_def: Pointer to port definition type. 2701e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 2702e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 2703e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 2704e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::set_port_definition( 2705e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PARAM_PORTDEFINITIONTYPE *p_port_def) 2706e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 2707e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 2708e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2709e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("port index %d: " 2710e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "count actual %d, count min %d, size %d", 2711e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->nPortIndex, 2712e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->nBufferCountActual, 2713e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->nBufferCountMin, 2714e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->nBufferSize); 2715e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2716e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p_port_def->nPortIndex == OMX_CORE_PORT_INDEX_IP) 2717e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2718e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.def.nBufferCountActual = p_port_def->nBufferCountActual; 2719e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.def.nBufferCountMin = p_port_def->nBufferCountMin; 2720e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.def.nBufferSize = p_port_def->nBufferSize; 2721e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2722e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (p_port_def->nPortIndex == OMX_CORE_PORT_INDEX_OP) 2723e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2724e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("port index %d: %d x %d", 2725e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->nPortIndex, 2726e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->format.video.nFrameWidth, 2727e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->format.video.nFrameHeight); 2728e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2729e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.def.nBufferCountActual = p_port_def->nBufferCountActual; 2730e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.def.nBufferCountMin = p_port_def->nBufferCountMin; 2731e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.def.nBufferSize = p_port_def->nBufferSize; 2732e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2733e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = set_frame_dimensions(p_port_def->format.video.nFrameWidth, 2734e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->format.video.nFrameHeight); 2735e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (retval != OMX_ErrorNone) 2736e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto set_port_definition_exit; 2737e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2738e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_frame_attributes.stride = p_port_def->format.video.nStride; 2739e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_frame_attributes.scanlines = p_port_def->format.video.nSliceHeight; 2740e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_frame_attributes.size = p_port_def->nBufferSize; 2741e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2742e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = set_frame_attributes(DEFAULT_ALIGNMENT_STRIDE, 2743e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEFAULT_ALIGNMENT_SCANLINES_Y, 2744e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEFAULT_ALIGNMENT_SCANLINES_UV, 2745e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DEFAULT_ALIGNMENT_SIZE); 2746e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2747e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2748e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2749e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", p_port_def->nPortIndex); 2750e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadPortIndex; 2751e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2752e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2753e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinset_port_definition_exit: 2754e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 2755e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 2756e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2757e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 2758e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Get supported profile & level. 2759e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 2760e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * The supported profiles & levels are not queried from SwVdec core, but 2761e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * hard-coded. This should ideally be replaced with a query to SwVdec core. 2762e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 2763e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] p_profilelevel: Pointer to video profile & level type. 2764e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 2765e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 2766e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 2767e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::get_supported_profilelevel( 2768e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_VIDEO_PARAM_PROFILELEVELTYPE *p_profilelevel) 2769e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 2770e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 2771e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2772e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p_profilelevel == NULL) 2773e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2774e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("p_profilelevel = NULL"); 2775e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 2776e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto get_supported_profilelevel_exit; 2777e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2778e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2779e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p_profilelevel->nPortIndex != OMX_CORE_PORT_INDEX_IP) 2780e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2781e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", 2782e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_profilelevel->nPortIndex); 2783e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadPortIndex; 2784e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto get_supported_profilelevel_exit; 2785e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2786e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2787e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_omx_video_codingtype == OMX_VIDEO_CodingH263) 2788e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2789e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p_profilelevel->nProfileIndex == 0) 2790e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2791e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_profilelevel->eProfile = OMX_VIDEO_H263ProfileBaseline; 2792e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_profilelevel->eLevel = OMX_VIDEO_H263Level70; 2793e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("H.263 baseline profile, level 70"); 2794e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2795e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2796e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2797e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("profile index '%d' unsupported; " 2798e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "no more profiles", 2799e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_profilelevel->nProfileIndex); 2800e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorNoMore; 2801e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2802e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2803e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if ((m_omx_video_codingtype == OMX_VIDEO_CodingMPEG4) || 2804e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_omx_video_codingtype == 2805e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ((OMX_VIDEO_CODINGTYPE) QOMX_VIDEO_CodingDivx))) 2806e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2807e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p_profilelevel->nProfileIndex == 0) 2808e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2809e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_profilelevel->eProfile = OMX_VIDEO_MPEG4ProfileSimple; 2810e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_profilelevel->eLevel = OMX_VIDEO_MPEG4Level5; 2811e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("MPEG-4 simple profile, level 5"); 2812e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2813e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (p_profilelevel->nProfileIndex == 1) 2814e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2815e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_profilelevel->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple; 2816e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_profilelevel->eLevel = OMX_VIDEO_MPEG4Level5; 2817e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("MPEG-4 advanced simple profile, level 5"); 2818e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2819e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2820e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2821e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("profile index '%d' unsupported; " 2822e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "no more profiles", 2823e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_profilelevel->nProfileIndex); 2824e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorNoMore; 2825e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2826e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2827e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2828e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2829e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin assert(0); 2830e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorUndefined; 2831e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2832e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2833e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinget_supported_profilelevel_exit: 2834e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 2835e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 2836e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2837e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 2838e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Describe color format. 2839e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 2840e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] p_params: Pointer to 'DescribeColorFormatParams' structure. 2841e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 2842e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 2843e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 2844e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::describe_color_format( 2845e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin DescribeColorFormatParams *p_params) 2846e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 2847e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 2848e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2849e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p_params == NULL) 2850e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2851e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("p_params = NULL"); 2852e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 2853e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2854e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 2855e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2856e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin MediaImage *p_img = &p_params->sMediaImage; 2857e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2858e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch (p_params->eColorFormat) 2859e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2860e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2861e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m: 2862e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2863e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin size_t stride, scanlines; 2864e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2865e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mType = MediaImage::MEDIA_IMAGE_TYPE_YUV; 2866e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mNumPlanes = 3; 2867e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2868e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mWidth = p_params->nFrameWidth; 2869e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mHeight = p_params->nFrameHeight; 2870e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2871e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin stride = ALIGN(p_img->mWidth, DEFAULT_ALIGNMENT_STRIDE); 2872e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin scanlines = ALIGN(p_img->mHeight, DEFAULT_ALIGNMENT_SCANLINES_Y); 2873e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2874e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mBitDepth = 8; 2875e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2876e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // plane 0 (Y) 2877e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mPlane[MediaImage::Y].mOffset = 0; 2878e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mPlane[MediaImage::Y].mColInc = 1; 2879e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mPlane[MediaImage::Y].mRowInc = stride; 2880e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mPlane[MediaImage::Y].mHorizSubsampling = 1; 2881e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mPlane[MediaImage::Y].mVertSubsampling = 1; 2882e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2883e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // plane 1 (U) 2884e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mPlane[MediaImage::Y].mOffset = stride * scanlines; 2885e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mPlane[MediaImage::Y].mColInc = 2; 2886e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mPlane[MediaImage::Y].mRowInc = stride; 2887e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mPlane[MediaImage::Y].mHorizSubsampling = 2; 2888e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mPlane[MediaImage::Y].mVertSubsampling = 2; 2889e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2890e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // plane 2 (V) 2891e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mPlane[MediaImage::Y].mOffset = stride * scanlines + 1; 2892e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mPlane[MediaImage::Y].mColInc = 2; 2893e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mPlane[MediaImage::Y].mRowInc = stride; 2894e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mPlane[MediaImage::Y].mHorizSubsampling = 2; 2895e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mPlane[MediaImage::Y].mVertSubsampling = 2; 2896e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2897e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 2898e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2899e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2900e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_COLOR_FormatYUV420SemiPlanar: 2901e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2902e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin size_t stride, scanlines; 2903e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2904e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mType = MediaImage::MEDIA_IMAGE_TYPE_YUV; 2905e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mNumPlanes = 3; 2906e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2907e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mWidth = p_params->nFrameWidth; 2908e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mHeight = p_params->nFrameHeight; 2909e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2910e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin stride = ALIGN(p_img->mWidth, 16); 2911e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin scanlines = ALIGN(p_img->mHeight, 1); 2912e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2913e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mBitDepth = 8; 2914e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2915e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // plane 0 (Y) 2916e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mPlane[MediaImage::Y].mOffset = 0; 2917e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mPlane[MediaImage::Y].mColInc = 1; 2918e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mPlane[MediaImage::Y].mRowInc = stride; 2919e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mPlane[MediaImage::Y].mHorizSubsampling = 1; 2920e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mPlane[MediaImage::Y].mVertSubsampling = 1; 2921e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2922e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // plane 1 (U) 2923e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mPlane[MediaImage::Y].mOffset = stride * scanlines; 2924e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mPlane[MediaImage::Y].mColInc = 2; 2925e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mPlane[MediaImage::Y].mRowInc = stride; 2926e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mPlane[MediaImage::Y].mHorizSubsampling = 2; 2927e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mPlane[MediaImage::Y].mVertSubsampling = 2; 2928e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2929e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // plane 2 (V) 2930e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mPlane[MediaImage::Y].mOffset = stride * scanlines + 1; 2931e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mPlane[MediaImage::Y].mColInc = 2; 2932e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mPlane[MediaImage::Y].mRowInc = stride; 2933e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mPlane[MediaImage::Y].mHorizSubsampling = 2; 2934e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mPlane[MediaImage::Y].mVertSubsampling = 2; 2935e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2936e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 2937e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2938e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2939e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 2940e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2941e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("color format '0x%08x' invalid/unsupported", 2942e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_params->eColorFormat); 2943e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2944e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_img->mType = MediaImage::MEDIA_IMAGE_TYPE_UNKNOWN; 2945e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2946e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 2947e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 2948e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2949e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2950e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } // switch (p_params->eColorFormat) 2951e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2952e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2953e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 2954e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 2955e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2956e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 2957e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Set QTI vendor-specific port definition for input or output port. 2958e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 2959e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_port_def: Pointer to QTI vendor-specific port definition type. 2960e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 2961e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 2962e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 2963e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::set_port_definition_qcom( 2964e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_QCOM_PARAM_PORTDEFINITIONTYPE *p_port_def) 2965e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 2966e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 2967e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2968e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p_port_def->nPortIndex == OMX_CORE_PORT_INDEX_IP) 2969e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2970e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch (p_port_def->nFramePackingFormat) 2971e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2972e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2973e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_QCOM_FramePacking_Arbitrary: 2974e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2975e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("OMX_QCOM_FramePacking_Arbitrary unsupported"); 2976e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorUnsupportedSetting; 2977e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 2978e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2979e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2980e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_QCOM_FramePacking_OnlyOneCompleteFrame: 2981e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2982e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH( 2983e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "OMX_QCOM_FramePacking_OnlyOneCompleteFrame"); 2984e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 2985e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2986e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2987e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 2988e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2989e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR( 2990e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "frame packing format '%d' unsupported"); 2991e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorUnsupportedSetting; 2992e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 2993e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2994e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 2995e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2996e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 2997e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (p_port_def->nPortIndex == OMX_CORE_PORT_INDEX_OP) 2998e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 2999e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("nMemRegion %d, nCacheAttr %d", 3000e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->nMemRegion, 3001e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->nCacheAttr); 3002e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3003e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 3004e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3005e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", 3006e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_port_def->nPortIndex); 3007e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadPortIndex; 3008e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3009e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3010e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 3011e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 3012e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3013e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 3014e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Set SwVdec frame dimensions based on OMX component frame dimensions. 3015e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 3016e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 3017e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 3018e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::set_frame_dimensions_swvdec() 3019e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 3020e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 3021e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3022e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_PROPERTY property; 3023e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3024e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS retval_swvdec; 3025e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3026e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin property.id = SWVDEC_PROPERTY_ID_FRAME_DIMENSIONS; 3027e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3028e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin property.info.frame_dimensions.width = m_frame_dimensions.width; 3029e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin property.info.frame_dimensions.height = m_frame_dimensions.height; 3030e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3031e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval_swvdec = swvdec_setproperty(m_swvdec_handle, &property)) != 3032e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS_SUCCESS) 3033e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3034e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = retval_swvdec2omx(retval_swvdec); 3035e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3036e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3037e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 3038e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 3039e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3040e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 3041e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Set SwVdec frame attributes based on OMX component frame attributes. 3042e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 3043e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 3044e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 3045e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::set_frame_attributes_swvdec() 3046e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 3047e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 3048e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3049e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_FRAME_ATTRIBUTES *p_frame_attributes; 3050e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3051e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_PROPERTY property; 3052e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3053e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS retval_swvdec; 3054e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3055e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_frame_attributes = &property.info.frame_attributes; 3056e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3057e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin property.id = SWVDEC_PROPERTY_ID_FRAME_ATTRIBUTES; 3058e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3059e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_frame_attributes->color_format = SWVDEC_COLOR_FORMAT_SEMIPLANAR_NV12; 3060e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3061e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_frame_attributes->semiplanar.stride = m_frame_attributes.stride; 3062e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_frame_attributes->semiplanar.offset_uv = (m_frame_attributes.stride * 3063e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_frame_attributes.scanlines); 3064e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3065e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_frame_attributes->size = m_frame_attributes.size; 3066e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3067e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval_swvdec = swvdec_setproperty(m_swvdec_handle, &property)) != 3068e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS_SUCCESS) 3069e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3070e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = retval_swvdec2omx(retval_swvdec); 3071e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3072e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3073e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 3074e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 3075e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3076e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 3077e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Get SwVdec frame dimensions and set OMX component frame dimensions. 3078e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 3079e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 3080e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 3081e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::get_frame_dimensions_swvdec() 3082e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 3083e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 3084e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3085e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_PROPERTY property; 3086e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3087e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS retval_swvdec; 3088e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3089e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin property.id = SWVDEC_PROPERTY_ID_FRAME_DIMENSIONS; 3090e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3091e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval_swvdec = swvdec_getproperty(m_swvdec_handle, &property)) != 3092e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS_SUCCESS) 3093e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3094e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = retval_swvdec2omx(retval_swvdec); 3095e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3096e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 3097e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3098e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_frame_dimensions.width = property.info.frame_dimensions.width; 3099e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_frame_dimensions.height = property.info.frame_dimensions.height; 3100e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3101e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3102e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 3103e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 3104e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3105e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 3106e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Get SwVdec frame attributes and set OMX component frame attributes. 3107e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 3108e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 3109e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 3110e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::get_frame_attributes_swvdec() 3111e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 3112e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 3113e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3114e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_PROPERTY property; 3115e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3116e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS retval_swvdec; 3117e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3118e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin property.id = SWVDEC_PROPERTY_ID_FRAME_ATTRIBUTES; 3119e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3120e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval_swvdec = swvdec_getproperty(m_swvdec_handle, &property)) != 3121e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS_SUCCESS) 3122e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3123e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = retval_swvdec2omx(retval_swvdec); 3124e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3125e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 3126e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3127e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_frame_attributes.stride = 3128e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin property.info.frame_attributes.semiplanar.stride; 3129e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3130e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_frame_attributes.scanlines = 3131e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (property.info.frame_attributes.semiplanar.offset_uv / 3132e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin property.info.frame_attributes.semiplanar.stride); 3133e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3134e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_frame_attributes.size = property.info.frame_attributes.size; 3135e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3136e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3137e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 3138e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 3139e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3140e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 3141e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Get SwVdec buffer requirements; set input or output port definitions. 3142e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 3143e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] port_index: Port index. 3144e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 3145e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 3146e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 3147e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::get_buffer_requirements_swvdec( 3148e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int port_index) 3149e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 3150e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 3151e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3152e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_PROPERTY property; 3153e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3154e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS retval_swvdec; 3155e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3156e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_BUFFER_REQ *p_buffer_req; 3157e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3158e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (port_index == OMX_CORE_PORT_INDEX_IP) 3159e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3160e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin property.id = SWVDEC_PROPERTY_ID_BUFFER_REQ_IP; 3161e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3162e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_req = &property.info.buffer_req_ip; 3163e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3164e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval_swvdec = swvdec_getproperty(m_swvdec_handle, &property)) != 3165e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS_SUCCESS) 3166e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3167e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = retval_swvdec2omx(retval_swvdec); 3168e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto get_buffer_requirements_swvdec_exit; 3169e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3170e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3171e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.def.nBufferSize = p_buffer_req->size; 3172e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.def.nBufferCountMin = p_buffer_req->mincount; 3173e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.def.nBufferCountActual = MAX(p_buffer_req->mincount, 3174e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_IP_BUFFER_COUNT); 3175e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.def.nBufferAlignment = p_buffer_req->alignment; 3176e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3177e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("ip port: %d bytes x %d, %d-byte aligned", 3178e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.def.nBufferSize, 3179e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.def.nBufferCountActual, 3180e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.def.nBufferAlignment); 3181e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3182e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (port_index == OMX_CORE_PORT_INDEX_OP) 3183e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3184e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin property.id = SWVDEC_PROPERTY_ID_BUFFER_REQ_OP; 3185e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3186e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_req = &property.info.buffer_req_op; 3187e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3188e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval_swvdec = swvdec_getproperty(m_swvdec_handle, &property)) != 3189e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS_SUCCESS) 3190e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3191e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = retval_swvdec2omx(retval_swvdec); 3192e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto get_buffer_requirements_swvdec_exit; 3193e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3194e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3195e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_sync_frame_decoding_mode) 3196e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3197e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // only 1 output buffer for sync frame decoding mode 3198e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_req->mincount = 1; 3199e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3200e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3201e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.def.nBufferSize = p_buffer_req->size; 3202e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.def.nBufferCountMin = p_buffer_req->mincount; 3203e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.def.nBufferCountActual = p_buffer_req->mincount; 3204e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.def.nBufferAlignment = p_buffer_req->alignment; 3205e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3206e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("op port: %d bytes x %d, %d-byte aligned", 3207e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.def.nBufferSize, 3208e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.def.nBufferCountActual, 3209e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.def.nBufferAlignment); 3210e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3211e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 3212e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3213e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", port_index); 3214e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadPortIndex; 3215e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3216e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3217e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinget_buffer_requirements_swvdec_exit: 3218e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 3219e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 3220e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3221e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 3222e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Allocate input buffer, and input buffer info array if ncessary. 3223e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 3224e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] pp_buffer_hdr: Pointer to pointer to buffer header type 3225e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * structure. 3226e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_app_data: Pointer to IL client app data. 3227e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] size: Size of buffer to be allocated in bytes. 3228e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 3229e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 3230e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 3231e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::buffer_allocate_ip( 3232e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE **pp_buffer_hdr, 3233e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PTR p_app_data, 3234e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U32 size) 3235e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 3236e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 3237e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3238e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int ii; 3239e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3240e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (size != m_port_ip.def.nBufferSize) 3241e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3242e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("requested size (%d bytes) not equal to " 3243e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "configured size (%d bytes)", 3244e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin size, 3245e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.def.nBufferSize); 3246e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 3247e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto buffer_allocate_ip_exit; 3248e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3249e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3250e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_buffer_array_ip == NULL) 3251e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3252e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // input buffer info array not allocated; allocate here 3253e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3254e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("allocating buffer info array, %d element%s", 3255e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.def.nBufferCountActual, 3256e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_port_ip.def.nBufferCountActual > 1) ? "s" : ""); 3257e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3258e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval = buffer_allocate_ip_info_array()) != OMX_ErrorNone) 3259e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3260e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto buffer_allocate_ip_exit; 3261e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3262e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3263e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3264e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for (ii = 0; ii < m_port_ip.def.nBufferCountActual; ii++) 3265e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3266e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_buffer_array_ip[ii].buffer_populated == false) 3267e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3268e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_LOW("buffer %d not populated", ii); 3269e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3270e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3271e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3272e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3273e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ii < m_port_ip.def.nBufferCountActual) 3274e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3275e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int pmem_fd = -1; 3276e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3277e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned char *bufferaddr; 3278e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3279e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("ip buffer %d: %d bytes being allocated", 3280e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ii, 3281e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin size); 3282e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3283e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_ip[ii].ion_info.ion_fd_device = 3284e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ion_memory_alloc_map(&m_buffer_array_ip[ii].ion_info.ion_alloc_data, 3285e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin &m_buffer_array_ip[ii].ion_info.ion_fd_data, 3286e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin size, 3287e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.def.nBufferAlignment); 3288e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3289e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_buffer_array_ip[ii].ion_info.ion_fd_device < 0) 3290e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3291e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInsufficientResources; 3292e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto buffer_allocate_ip_exit; 3293e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3294e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3295e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pmem_fd = m_buffer_array_ip[ii].ion_info.ion_fd_data.fd; 3296e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3297e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufferaddr = (unsigned char *) mmap(NULL, 3298e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin size, 3299e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin PROT_READ | PROT_WRITE, 3300e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin MAP_SHARED, 3301e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pmem_fd, 3302e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 0); 3303e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3304e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (bufferaddr == MAP_FAILED) 3305e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3306e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("mmap() failed for fd %d of size %d", 3307e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pmem_fd, 3308e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin size); 3309e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin close(pmem_fd); 3310e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ion_memory_free(&m_buffer_array_ip[ii].ion_info); 3311e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInsufficientResources; 3312e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto buffer_allocate_ip_exit; 3313e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3314e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3315e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *pp_buffer_hdr = &m_buffer_array_ip[ii].buffer_header; 3316e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3317e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_ip[ii].buffer_payload.bufferaddr = bufferaddr; 3318e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_ip[ii].buffer_payload.pmem_fd = pmem_fd; 3319e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_ip[ii].buffer_payload.buffer_len = size; 3320e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_ip[ii].buffer_payload.mmaped_size = size; 3321e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_ip[ii].buffer_payload.offset = 0; 3322e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3323e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_ip[ii].buffer_swvdec.p_buffer = bufferaddr; 3324e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_ip[ii].buffer_swvdec.size = size; 3325e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_ip[ii].buffer_swvdec.p_client_data = 3326e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (void *) ((unsigned long) ii); 3327e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3328e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_ip[ii].buffer_populated = true; 3329e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3330e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("ip buffer %d: %p, %d bytes", 3331e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ii, 3332e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufferaddr, 3333e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin size); 3334e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3335e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (*pp_buffer_hdr)->pBuffer = (OMX_U8 *) bufferaddr; 3336e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (*pp_buffer_hdr)->nSize = sizeof(OMX_BUFFERHEADERTYPE); 3337e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (*pp_buffer_hdr)->nVersion.nVersion = OMX_SPEC_VERSION; 3338e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (*pp_buffer_hdr)->nAllocLen = size; 3339e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (*pp_buffer_hdr)->pAppPrivate = p_app_data; 3340e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (*pp_buffer_hdr)->nInputPortIndex = OMX_CORE_PORT_INDEX_IP; 3341e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (*pp_buffer_hdr)->pInputPortPrivate = 3342e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (void *) &(m_buffer_array_ip[ii].buffer_payload); 3343e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3344e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.populated = port_ip_populated(); 3345e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.unpopulated = OMX_FALSE; 3346e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3347e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 3348e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3349e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("all %d ip buffers allocated", 3350e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.def.nBufferCountActual); 3351e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInsufficientResources; 3352e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3353e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3354e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbuffer_allocate_ip_exit: 3355e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 3356e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 3357e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3358e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 3359e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Allocate output buffer, and output buffer info array if necessary. 3360e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 3361e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] pp_buffer_hdr: Pointer to pointer to buffer header type 3362e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * structure. 3363e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_app_data: Pointer to IL client app data. 3364e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] size: Size of buffer to be allocated in bytes. 3365e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 3366e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 3367e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 3368e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::buffer_allocate_op( 3369e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE **pp_buffer_hdr, 3370e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PTR p_app_data, 3371e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U32 size) 3372e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 3373e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 3374e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3375e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int ii; 3376e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3377e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (size != m_port_op.def.nBufferSize) 3378e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3379e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("requested size (%d bytes) not equal to " 3380e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "configured size (%d bytes)", 3381e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin size, 3382e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.def.nBufferSize); 3383e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 3384e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto buffer_allocate_op_exit; 3385e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3386e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3387e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_buffer_array_op == NULL) 3388e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3389e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // output buffer info array not allocated; allocate here 3390e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3391e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("allocating buffer info array, %d element%s", 3392e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.def.nBufferCountActual, 3393e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_port_op.def.nBufferCountActual > 1) ? "s" : ""); 3394e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3395e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval = buffer_allocate_op_info_array()) != OMX_ErrorNone) 3396e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3397e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto buffer_allocate_op_exit; 3398e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3399e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3400e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3401e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for (ii = 0; ii < m_port_op.def.nBufferCountActual; ii++) 3402e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3403e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_buffer_array_op[ii].buffer_populated == false) 3404e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3405e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_LOW("buffer %d not populated", ii); 3406e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3407e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3408e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3409e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3410e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ii < m_port_op.def.nBufferCountActual) 3411e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3412e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int pmem_fd = -1; 3413e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3414e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned char *bufferaddr; 3415e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3416e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("op buffer %d: %d bytes being allocated", 3417e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ii, 3418e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin size); 3419e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3420e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op[ii].ion_info.ion_fd_device = 3421e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ion_memory_alloc_map(&m_buffer_array_op[ii].ion_info.ion_alloc_data, 3422e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin &m_buffer_array_op[ii].ion_info.ion_fd_data, 3423e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin size, 3424e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.def.nBufferAlignment); 3425e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3426e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_buffer_array_op[ii].ion_info.ion_fd_device < 0) 3427e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3428e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInsufficientResources; 3429e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto buffer_allocate_op_exit; 3430e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3431e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3432e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pmem_fd = m_buffer_array_op[ii].ion_info.ion_fd_data.fd; 3433e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3434e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufferaddr = (unsigned char *) mmap(NULL, 3435e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin size, 3436e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin PROT_READ | PROT_WRITE, 3437e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin MAP_SHARED, 3438e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pmem_fd, 3439e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 0); 3440e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3441e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (bufferaddr == MAP_FAILED) 3442e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3443e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("mmap() failed for fd %d of size %d", 3444e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pmem_fd, 3445e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin size); 3446e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin close(pmem_fd); 3447e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ion_memory_free(&m_buffer_array_op[ii].ion_info); 3448e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInsufficientResources; 3449e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto buffer_allocate_op_exit; 3450e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3451e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3452e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *pp_buffer_hdr = &m_buffer_array_op[ii].buffer_header; 3453e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3454e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op[ii].buffer_payload.bufferaddr = bufferaddr; 3455e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op[ii].buffer_payload.pmem_fd = pmem_fd; 3456e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op[ii].buffer_payload.buffer_len = size; 3457e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op[ii].buffer_payload.mmaped_size = size; 3458e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op[ii].buffer_payload.offset = 0; 3459e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3460e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op[ii].buffer_swvdec.p_buffer = bufferaddr; 3461e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op[ii].buffer_swvdec.size = size; 3462e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op[ii].buffer_swvdec.p_client_data = 3463e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (void *) ((unsigned long) ii); 3464e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3465e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op[ii].buffer_populated = true; 3466e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3467e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("op buffer %d: %p, %d bytes", 3468e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ii, 3469e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bufferaddr, 3470e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin size); 3471e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3472e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (*pp_buffer_hdr)->pBuffer = (OMX_U8 *) bufferaddr; 3473e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (*pp_buffer_hdr)->nSize = sizeof(OMX_BUFFERHEADERTYPE); 3474e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (*pp_buffer_hdr)->nVersion.nVersion = OMX_SPEC_VERSION; 3475e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (*pp_buffer_hdr)->nAllocLen = size; 3476e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (*pp_buffer_hdr)->pAppPrivate = p_app_data; 3477e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (*pp_buffer_hdr)->nOutputPortIndex = OMX_CORE_PORT_INDEX_OP; 3478e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (*pp_buffer_hdr)->pOutputPortPrivate = 3479e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (void *) &(m_buffer_array_op[ii].buffer_payload); 3480e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3481e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.populated = port_op_populated(); 3482e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.unpopulated = OMX_FALSE; 3483e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3484e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 3485e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3486e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("all %d op buffers allocated", 3487e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.def.nBufferCountActual); 3488e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInsufficientResources; 3489e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3490e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3491e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbuffer_allocate_op_exit: 3492e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 3493e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 3494e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3495e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 3496e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Allocate input buffer info array. 3497e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 3498e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::buffer_allocate_ip_info_array() 3499e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 3500e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 3501e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3502e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int ii; 3503e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3504e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE *p_buffer_hdr; 3505e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3506e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_buffer_array_ip != NULL) 3507e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3508e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("buffer info array already allocated"); 3509e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInsufficientResources; 3510e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto buffer_allocate_ip_hdr_exit; 3511e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3512e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3513e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // input buffer info array not allocated; allocate here 3514e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3515e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("allocating buffer info array, %d element%s", 3516e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.def.nBufferCountActual, 3517e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_port_ip.def.nBufferCountActual > 1) ? "s" : ""); 3518e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3519e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_ip = 3520e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_SWVDEC_BUFFER_INFO *) calloc(sizeof(OMX_SWVDEC_BUFFER_INFO), 3521e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.def.nBufferCountActual); 3522e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3523e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_buffer_array_ip == NULL) 3524e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3525e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("failed to allocate buffer info array; " 3526e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "%d element%s, %d bytes requested", 3527e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.def.nBufferCountActual, 3528e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_port_ip.def.nBufferCountActual > 1) ? "s" : "", 3529e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sizeof(OMX_SWVDEC_BUFFER_INFO) * 3530e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.def.nBufferCountActual); 3531e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInsufficientResources; 3532e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto buffer_allocate_ip_hdr_exit; 3533e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3534e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3535e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for (ii = 0; ii < m_port_ip.def.nBufferCountActual; ii++) 3536e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3537e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr = &m_buffer_array_ip[ii].buffer_header; 3538e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3539e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // reset file descriptors 3540e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3541e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_ip[ii].buffer_payload.pmem_fd = -1; 3542e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_ip[ii].ion_info.ion_fd_device = -1; 3543e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3544e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_ip[ii].buffer_swvdec.p_client_data = 3545e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (void *) ((unsigned long) ii); 3546e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3547e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->nSize = sizeof(OMX_BUFFERHEADERTYPE); 3548e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->nVersion.nVersion = OMX_SPEC_VERSION; 3549e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->nOutputPortIndex = OMX_CORE_PORT_INDEX_IP; 3550e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->pOutputPortPrivate = 3551e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (void *) &(m_buffer_array_ip[ii].buffer_payload); 3552e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3553e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3554e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbuffer_allocate_ip_hdr_exit: 3555e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 3556e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 3557e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3558e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 3559e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Allocate output buffer info array. 3560e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 3561e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::buffer_allocate_op_info_array() 3562e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 3563e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 3564e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3565e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int ii; 3566e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3567e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE *p_buffer_hdr; 3568e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3569e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_buffer_array_op != NULL) 3570e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3571e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("buffer info array already allocated"); 3572e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInsufficientResources; 3573e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto buffer_allocate_op_hdr_exit; 3574e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3575e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3576e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // output buffer info array not allocated; allocate here 3577e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3578e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("allocating buffer info array, %d element%s", 3579e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.def.nBufferCountActual, 3580e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_port_op.def.nBufferCountActual > 1) ? "s" : ""); 3581e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3582e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op = 3583e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_SWVDEC_BUFFER_INFO *) calloc(sizeof(OMX_SWVDEC_BUFFER_INFO), 3584e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.def.nBufferCountActual); 3585e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3586e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_buffer_array_op == NULL) 3587e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3588e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("failed to allocate buffer info array; " 3589e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "%d element%s, %d bytes requested", 3590e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.def.nBufferCountActual, 3591e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_port_op.def.nBufferCountActual > 1) ? "s" : "", 3592e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sizeof(OMX_SWVDEC_BUFFER_INFO) * 3593e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.def.nBufferCountActual); 3594e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInsufficientResources; 3595e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto buffer_allocate_op_hdr_exit; 3596e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3597e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3598e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for (ii = 0; ii < m_port_op.def.nBufferCountActual; ii++) 3599e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3600e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr = &m_buffer_array_op[ii].buffer_header; 3601e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3602e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // reset file descriptors 3603e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3604e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op[ii].buffer_payload.pmem_fd = -1; 3605e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op[ii].ion_info.ion_fd_device = -1; 3606e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3607e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op[ii].buffer_swvdec.p_client_data = 3608e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (void *) ((unsigned long) ii); 3609e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3610e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->nSize = sizeof(OMX_BUFFERHEADERTYPE); 3611e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->nVersion.nVersion = OMX_SPEC_VERSION; 3612e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->nOutputPortIndex = OMX_CORE_PORT_INDEX_OP; 3613e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->pOutputPortPrivate = 3614e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (void *) &(m_buffer_array_op[ii].buffer_payload); 3615e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3616e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3617e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbuffer_allocate_op_hdr_exit: 3618e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 3619e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 3620e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3621e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 3622e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Use buffer allocated by IL client; allocate output buffer info array 3623e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * if necessary. 3624e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 3625e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] pp_buffer_hdr: Pointer to pointer to buffer header type 3626e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * structure. 3627e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_app_data: Pointer to IL client app data. 3628e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] size: Size of buffer to be allocated in bytes. 3629e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_buffer: Pointer to buffer to be used. 3630e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 3631e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 3632e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 3633e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::buffer_use_op( 3634e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE **pp_buffer_hdr, 3635e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_PTR p_app_data, 3636e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U32 size, 3637e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U8 *p_buffer) 3638e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 3639e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 3640e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3641e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int ii; 3642e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3643e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (void) size; 3644e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3645e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_buffer_array_op == NULL) 3646e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3647e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // output buffer info array not allocated; allocate here 3648e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3649e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("allocating buffer info array, %d element%s", 3650e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.def.nBufferCountActual, 3651e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_port_op.def.nBufferCountActual > 1) ? "s" : ""); 3652e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3653e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval = buffer_allocate_op_info_array()) != OMX_ErrorNone) 3654e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3655e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto buffer_use_op_exit; 3656e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3657e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3658e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3659e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_meta_buffer_mode && (m_meta_buffer_array == NULL)) 3660e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3661e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // meta buffer info array not allocated; allocate here 3662e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3663e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("allocating meta buffer info array, %d element%s", 3664e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.def.nBufferCountActual, 3665e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_port_op.def.nBufferCountActual > 1) ? "s" : ""); 3666e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3667e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval = meta_buffer_array_allocate()) != OMX_ErrorNone) 3668e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3669e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto buffer_use_op_exit; 3670e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3671e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3672e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3673e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for (ii = 0; ii < m_port_op.def.nBufferCountActual; ii++) 3674e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3675e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_buffer_array_op[ii].buffer_populated == false) 3676e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3677e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_LOW("buffer %d not populated", ii); 3678e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3679e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3680e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3681e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3682e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ii < m_port_op.def.nBufferCountActual) 3683e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3684e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct vdec_bufferpayload *p_buffer_payload; 3685e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3686e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_BUFFER *p_buffer_swvdec; 3687e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3688e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *pp_buffer_hdr = &m_buffer_array_op[ii].buffer_header; 3689e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_payload = &m_buffer_array_op[ii].buffer_payload; 3690e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_swvdec = &m_buffer_array_op[ii].buffer_swvdec; 3691e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3692e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_meta_buffer_mode) 3693e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3694e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_swvdec->size = m_port_op.def.nBufferSize; 3695e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_swvdec->p_client_data = (void *) ((unsigned long) ii); 3696e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3697e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op[ii].buffer_populated = true; 3698e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3699e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (*pp_buffer_hdr)->pBuffer = p_buffer; 3700e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (*pp_buffer_hdr)->pAppPrivate = p_app_data; 3701e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (*pp_buffer_hdr)->nAllocLen = 3702e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sizeof(struct VideoDecoderOutputMetaData); 3703e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3704e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("op buffer %d: %p (meta buffer)", 3705e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ii, 3706e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *pp_buffer_hdr); 3707e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3708e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.populated = port_op_populated(); 3709e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.unpopulated = OMX_FALSE; 3710e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3711e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (m_android_native_buffers) 3712e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3713e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin private_handle_t *p_handle; 3714e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3715e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U8 *p_buffer_mapped; 3716e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3717e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_handle = (private_handle_t *) p_buffer; 3718e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3719e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (((OMX_U32) p_handle->size) < m_port_op.def.nBufferSize) 3720e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3721e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("requested size (%d bytes) not equal to " 3722e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "configured size (%d bytes)", 3723e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_handle->size, 3724e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.def.nBufferSize); 3725e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3726e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 3727e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto buffer_use_op_exit; 3728e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3729e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3730e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.def.nBufferSize = p_handle->size; 3731e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3732e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_mapped = (OMX_U8 *) mmap(NULL, 3733e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_handle->size, 3734e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin PROT_READ | PROT_WRITE, 3735e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin MAP_SHARED, 3736e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_handle->fd, 3737e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 0); 3738e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3739e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p_buffer_mapped == MAP_FAILED) 3740e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3741e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("mmap() failed for fd %d of size %d", 3742e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_handle->fd, 3743e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_handle->size); 3744e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3745e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInsufficientResources; 3746e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto buffer_use_op_exit; 3747e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3748e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3749e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_payload->bufferaddr = p_buffer_mapped; 3750e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_payload->pmem_fd = p_handle->fd; 3751e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_payload->buffer_len = p_handle->size; 3752e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_payload->mmaped_size = p_handle->size; 3753e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_payload->offset = 0; 3754e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3755e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_swvdec->p_buffer = p_buffer_mapped; 3756e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_swvdec->size = m_port_op.def.nBufferSize; 3757e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_swvdec->p_client_data = (void *) ((unsigned long) ii); 3758e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3759e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op[ii].buffer_populated = true; 3760e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3761e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (*pp_buffer_hdr)->pBuffer = (m_android_native_buffers ? 3762e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ((OMX_U8 *) p_handle) : 3763e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_mapped); 3764e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (*pp_buffer_hdr)->pAppPrivate = p_app_data; 3765e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (*pp_buffer_hdr)->nAllocLen = m_port_op.def.nBufferSize; 3766e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3767e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op[ii].ion_info.ion_fd_data.fd = p_handle->fd; 3768e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3769e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("op buffer %d: %p", 3770e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ii, 3771e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *pp_buffer_hdr); 3772e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3773e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.populated = port_op_populated(); 3774e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.unpopulated = OMX_FALSE; 3775e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3776e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 3777e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3778e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("neither 'meta buffer mode' nor " 3779e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "'android native buffers' enabled"); 3780e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 3781e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3782e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3783e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 3784e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3785e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("all %d op buffers populated", 3786e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.def.nBufferCountActual); 3787e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInsufficientResources; 3788e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3789e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3790e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbuffer_use_op_exit: 3791e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 3792e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 3793e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3794e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 3795e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief De-allocate input buffer. 3796e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 3797e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_buffer_hdr: Pointer to buffer header structure. 3798e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 3799e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 3800e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 3801e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::buffer_deallocate_ip( 3802e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE *p_buffer_hdr) 3803e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 3804e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 3805e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3806e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int ii; 3807e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3808e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p_buffer_hdr == NULL) 3809e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3810e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("p_buffer_hdr = NULL"); 3811e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 3812e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto buffer_deallocate_ip_exit; 3813e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3814e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (m_buffer_array_ip == NULL) 3815e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3816e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("ip buffer array not allocated"); 3817e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 3818e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto buffer_deallocate_ip_exit; 3819e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3820e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3821e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for (ii = 0; ii < m_port_ip.def.nBufferCountActual; ii++) 3822e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3823e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p_buffer_hdr == &(m_buffer_array_ip[ii].buffer_header)) 3824e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3825e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_LOW("%p has index %d", 3826e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->pBuffer, 3827e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ii); 3828e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3829e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3830e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3831e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3832e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ii < m_port_ip.def.nBufferCountActual) 3833e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3834e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_buffer_array_ip[ii].buffer_payload.pmem_fd > 0) 3835e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3836e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_ip[ii].buffer_populated = false; 3837e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3838e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.populated = OMX_FALSE; 3839e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3840e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin munmap(m_buffer_array_ip[ii].buffer_payload.bufferaddr, 3841e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_ip[ii].buffer_payload.mmaped_size); 3842e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3843e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin close(m_buffer_array_ip[ii].buffer_payload.pmem_fd); 3844e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_ip[ii].buffer_payload.pmem_fd = -1; 3845e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3846e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ion_memory_free(&m_buffer_array_ip[ii].ion_info); 3847e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3848e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // check if all buffers are unpopulated 3849e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for (ii = 0; ii < m_port_ip.def.nBufferCountActual; ii++) 3850e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3851e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_buffer_array_ip[ii].buffer_populated) 3852e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3853e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3854e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3855e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // if no buffers are populated, de-allocate input buffer info array 3856e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ii == m_port_ip.def.nBufferCountActual) 3857e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3858e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer_deallocate_ip_info_array(); 3859e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.unpopulated = OMX_TRUE; 3860e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3861e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3862e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 3863e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3864e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("%p: pmem_fd %d", 3865e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->pBuffer, 3866e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_ip[ii].buffer_payload.pmem_fd); 3867e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3868e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3869e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 3870e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3871e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("%p not found", p_buffer_hdr->pBuffer); 3872e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 3873e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3874e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3875e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbuffer_deallocate_ip_exit: 3876e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 3877e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 3878e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3879e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 3880e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief De-allocate output buffer. 3881e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 3882e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_buffer_hdr: Pointer to buffer header structure. 3883e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 3884e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 3885e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 3886e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::buffer_deallocate_op( 3887e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE *p_buffer_hdr) 3888e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 3889e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 3890e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3891e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int ii; 3892e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3893e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p_buffer_hdr == NULL) 3894e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3895e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("p_buffer_hdr = NULL"); 3896e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 3897e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto buffer_deallocate_op_exit; 3898e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3899e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (m_buffer_array_op == NULL) 3900e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3901e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("op buffer array not allocated"); 3902e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 3903e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto buffer_deallocate_op_exit; 3904e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3905e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3906e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for (ii = 0; ii < m_port_op.def.nBufferCountActual; ii++) 3907e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3908e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p_buffer_hdr == &(m_buffer_array_op[ii].buffer_header)) 3909e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3910e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_LOW("%p has index %d", 3911e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->pBuffer, 3912e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ii); 3913e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3914e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3915e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3916e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3917e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ii < m_port_op.def.nBufferCountActual) 3918e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3919e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin assert(m_buffer_array_op[ii].buffer_payload.pmem_fd > 0); 3920e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3921e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_meta_buffer_mode) 3922e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3923e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // do nothing; munmap() & close() done in FBD or RR 3924e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3925e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (m_android_native_buffers) 3926e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3927e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin munmap(m_buffer_array_op[ii].buffer_payload.bufferaddr, 3928e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op[ii].buffer_payload.mmaped_size); 3929e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op[ii].buffer_payload.pmem_fd = -1; 3930e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3931e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (m_sync_frame_decoding_mode) 3932e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3933e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin munmap(m_buffer_array_op[ii].buffer_payload.bufferaddr, 3934e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op[ii].buffer_payload.mmaped_size); 3935e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin close(m_buffer_array_op[ii].buffer_payload.pmem_fd); 3936e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op[ii].buffer_payload.pmem_fd = -1; 3937e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ion_memory_free(&m_buffer_array_op[ii].ion_info); 3938e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3939e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 3940e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3941e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin assert(0); 3942e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3943e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3944e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op[ii].buffer_populated = false; 3945e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3946e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.populated = OMX_FALSE; 3947e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3948e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // check if all buffers are unpopulated 3949e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for (ii = 0; ii < m_port_op.def.nBufferCountActual; ii++) 3950e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3951e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_buffer_array_op[ii].buffer_populated) 3952e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 3953e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3954e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3955e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // if no buffers are populated, de-allocate output buffer info array 3956e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ii == m_port_op.def.nBufferCountActual) 3957e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3958e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin buffer_deallocate_op_info_array(); 3959e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.unpopulated = OMX_TRUE; 3960e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3961e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_meta_buffer_mode) 3962e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3963e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin meta_buffer_array_deallocate(); 3964e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3965e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3966e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3967e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 3968e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 3969e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("%p not found", p_buffer_hdr->pBuffer); 3970e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 3971e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 3972e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3973e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbuffer_deallocate_op_exit: 3974e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 3975e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 3976e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3977e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 3978e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief De-allocate input buffer info array. 3979e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 3980e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_swvdec::buffer_deallocate_ip_info_array() 3981e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 3982e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin assert(m_buffer_array_ip != NULL); 3983e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3984e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free(m_buffer_array_ip); 3985e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_ip = NULL; 3986e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 3987e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3988e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 3989e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief De-allocate output buffer info array. 3990e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 3991e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_swvdec::buffer_deallocate_op_info_array() 3992e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 3993e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin assert(m_buffer_array_op != NULL); 3994e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3995e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free(m_buffer_array_op); 3996e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op = NULL; 3997e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 3998e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 3999e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 4000e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Allocate meta buffer info array. 4001e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 4002e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 4003e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 4004e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::meta_buffer_array_allocate() 4005e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 4006e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 4007e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4008e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_meta_buffer_array = ((OMX_SWVDEC_META_BUFFER_INFO *) 4009e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin calloc(sizeof(OMX_SWVDEC_META_BUFFER_INFO), 4010e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.def.nBufferCountActual)); 4011e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4012e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_meta_buffer_array == NULL) 4013e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4014e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("failed to allocate meta_buffer info array; " 4015e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "%d element%s, %d bytes requested", 4016e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.def.nBufferCountActual, 4017e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_port_op.def.nBufferCountActual > 1) ? "s" : "", 4018e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sizeof(OMX_SWVDEC_META_BUFFER_INFO) * 4019e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.def.nBufferCountActual); 4020e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4021e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInsufficientResources; 4022e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4023e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4024e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 4025e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 4026e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4027e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 4028e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief De-allocate meta buffer info array. 4029e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 4030e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_swvdec::meta_buffer_array_deallocate() 4031e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 4032e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin assert(m_meta_buffer_array != NULL); 4033e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4034e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin free(m_meta_buffer_array); 4035e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_meta_buffer_array = NULL; 4036e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 4037e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4038e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 4039e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Add meta buffer reference. 4040e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 4041e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] index: 4042e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] fd: 4043e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] offset: 4044e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 4045e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_swvdec::meta_buffer_ref_add(unsigned int index, 4046e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int fd, 4047e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int offset) 4048e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 4049e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pthread_mutex_lock(&m_meta_buffer_array_mutex); 4050e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4051e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((m_meta_buffer_array[index].dup_fd != 0) && 4052e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_meta_buffer_array[index].fd != fd) && 4053e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_meta_buffer_array[index].offset != offset)) 4054e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4055e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_LOW("index %d taken by fd %d, offset %d", 4056e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin index, 4057e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_meta_buffer_array[index].fd, 4058e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_meta_buffer_array[index].offset); 4059e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4060e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 4061e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4062e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_meta_buffer_array[index].dup_fd == 0) 4063e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4064e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_meta_buffer_array[index].fd = fd; 4065e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_meta_buffer_array[index].dup_fd = dup(fd); 4066e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_meta_buffer_array[index].offset = offset; 4067e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4068e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4069e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_meta_buffer_array[index].ref_count++; 4070e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4071e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4072e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pthread_mutex_unlock(&m_meta_buffer_array_mutex); 4073e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 4074e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4075e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 4076e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Remove meta buffer reference. 4077e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 4078e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] fd: 4079e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] offset: 4080e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 4081e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_swvdec::meta_buffer_ref_remove(unsigned int fd, 4082e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int offset) 4083e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 4084e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int ii; 4085e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4086e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pthread_mutex_lock(&m_meta_buffer_array_mutex); 4087e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4088e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for (ii = 0; ii < m_port_op.def.nBufferCountActual; ii++) 4089e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4090e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((m_meta_buffer_array[ii].fd == fd) && 4091e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_meta_buffer_array[ii].offset == offset)) 4092e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4093e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_meta_buffer_array[ii].ref_count--; 4094e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4095e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_meta_buffer_array[ii].ref_count == 0) 4096e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4097e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin close(m_meta_buffer_array[ii].dup_fd); 4098e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4099e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_meta_buffer_array[ii].fd = 0; 4100e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_meta_buffer_array[ii].dup_fd = 0; 4101e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_meta_buffer_array[ii].offset = 0; 4102e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4103e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin munmap(m_buffer_array_op[ii].buffer_payload.bufferaddr, 4104e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op[ii].buffer_payload.mmaped_size); 4105e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4106e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op[ii].buffer_payload.bufferaddr = NULL; 4107e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op[ii].buffer_payload.offset = 0; 4108e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op[ii].buffer_payload.mmaped_size = 0; 4109e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4110e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op[ii].buffer_swvdec.p_buffer = NULL; 4111e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op[ii].buffer_swvdec.size = 0; 4112e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4113e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4114e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4115e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4116e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4117e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4118e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin assert(ii < m_port_op.def.nBufferCountActual); 4119e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4120e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pthread_mutex_unlock(&m_meta_buffer_array_mutex); 4121e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 4122e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4123e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 4124e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Check if ip port is populated, i.e., if all ip buffers are populated. 4125e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 4126e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval true 4127e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval false 4128e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 4129e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_BOOL omx_swvdec::port_ip_populated() 4130e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 4131e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BOOL retval = OMX_FALSE; 4132e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4133e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_buffer_array_ip != NULL) 4134e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4135e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int ii; 4136e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4137e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for (ii = 0; ii < m_port_ip.def.nBufferCountActual; ii++) 4138e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4139e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_buffer_array_ip[ii].buffer_populated == false) 4140e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4141e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4142e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4143e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4144e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4145e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ii == m_port_ip.def.nBufferCountActual) 4146e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4147e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_TRUE; 4148e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4149e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4150e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4151e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 4152e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 4153e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4154e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 4155e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Check if op port is populated, i.e., if all op buffers are populated. 4156e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 4157e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval true 4158e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval false 4159e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 4160e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_BOOL omx_swvdec::port_op_populated() 4161e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 4162e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BOOL retval = OMX_FALSE; 4163e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4164e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_buffer_array_op != NULL) 4165e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4166e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int ii; 4167e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4168e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin for (ii = 0; ii < m_port_op.def.nBufferCountActual; ii++) 4169e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4170e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_buffer_array_op[ii].buffer_populated == false) 4171e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4172e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4173e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4174e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4175e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4176e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ii == m_port_op.def.nBufferCountActual) 4177e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4178e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_TRUE; 4179e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4180e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4181e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4182e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 4183e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 4184e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4185e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 4186e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Flush input, output, or both input & output ports. 4187e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 4188e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] port_index: Index of port to flush. 4189e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 4190e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 4191e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 4192e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::flush(unsigned int port_index) 4193e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 4194e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 4195e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4196e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (((port_index == OMX_CORE_PORT_INDEX_IP) && 4197e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.flush_inprogress) || 4198e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ((port_index == OMX_CORE_PORT_INDEX_OP) && 4199e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.flush_inprogress) || 4200e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ((port_index == OMX_ALL) && 4201e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.flush_inprogress && 4202e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.flush_inprogress)) 4203e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4204e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("flush port %d already in progress", port_index); 4205e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4206e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 4207e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4208e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_FLUSH_TYPE swvdec_flush_type; 4209e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4210e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS retval_swvdec; 4211e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4212e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (port_index == OMX_CORE_PORT_INDEX_IP) 4213e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4214e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.flush_inprogress = OMX_TRUE; 4215e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4216e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // no separate SwVdec flush type for input 4217e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4218e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (port_index == OMX_CORE_PORT_INDEX_OP) 4219e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4220e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.flush_inprogress = OMX_TRUE; 4221e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4222e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin swvdec_flush_type = (m_port_ip.flush_inprogress ? 4223e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_FLUSH_TYPE_ALL : 4224e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_FLUSH_TYPE_OP); 4225e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4226e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval_swvdec = swvdec_flush(m_swvdec_handle, 4227e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin swvdec_flush_type)) != 4228e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS_SUCCESS) 4229e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4230e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = retval_swvdec2omx(retval_swvdec); 4231e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4232e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4233e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (port_index == OMX_ALL) 4234e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4235e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.flush_inprogress = OMX_TRUE; 4236e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.flush_inprogress = OMX_TRUE; 4237e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4238e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin swvdec_flush_type = SWVDEC_FLUSH_TYPE_ALL; 4239e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4240e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval_swvdec = swvdec_flush(m_swvdec_handle, 4241e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin swvdec_flush_type)) != 4242e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS_SUCCESS) 4243e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4244e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = retval_swvdec2omx(retval_swvdec); 4245e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4246e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4247e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 4248e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4249e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin assert(0); 4250e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4251e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4252e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4253e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 4254e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 4255e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4256e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 4257e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Allocate & map ION memory. 4258e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 4259e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinint omx_swvdec::ion_memory_alloc_map(struct ion_allocation_data *p_alloc_data, 4260e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct ion_fd_data *p_fd_data, 4261e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U32 size, 4262e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U32 alignment) 4263e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 4264e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int fd = -EINVAL; 4265e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin int rc = -EINVAL; 4266e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4267e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((p_alloc_data == NULL) || (p_fd_data == NULL) || (size == 0)) 4268e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4269e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("invalid arguments"); 4270e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto ion_memory_alloc_map_exit; 4271e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4272e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4273e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((fd = open("/dev/ion", O_RDONLY)) < 0) 4274e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4275e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("failed to open ion device; fd = %d", fd); 4276e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto ion_memory_alloc_map_exit; 4277e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4278e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4279e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_alloc_data->len = size; 4280e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_alloc_data->align = (alignment < 4096) ? 4096 : alignment; 4281e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_alloc_data->heap_id_mask = ION_HEAP(ION_IOMMU_HEAP_ID); 4282e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_alloc_data->flags = 0; 4283e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4284e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_LOW("heap_id_mask 0x%08x, len %d, align %d", 4285e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_alloc_data->heap_id_mask, 4286e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_alloc_data->len, 4287e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_alloc_data->align); 4288e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4289e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin rc = ioctl(fd, ION_IOC_ALLOC, p_alloc_data); 4290e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4291e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (rc || (p_alloc_data->handle == 0)) 4292e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4293e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("ioctl() for allocation failed"); 4294e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin close(fd); 4295e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fd = -ENOMEM; 4296e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto ion_memory_alloc_map_exit; 4297e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4298e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4299e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_fd_data->handle = p_alloc_data->handle; 4300e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4301e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ioctl(fd, ION_IOC_MAP, p_fd_data)) 4302e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4303e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin struct vdec_ion ion_buf_info; 4304e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4305e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("ioctl() for mapping failed"); 4306e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4307e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ion_buf_info.ion_alloc_data = *p_alloc_data; 4308e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ion_buf_info.ion_fd_device = fd; 4309e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ion_buf_info.ion_fd_data = *p_fd_data; 4310e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4311e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ion_memory_free(&ion_buf_info); 4312e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4313e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_fd_data->fd = -1; 4314e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin close(fd); 4315e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin fd = -ENOMEM; 4316e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto ion_memory_alloc_map_exit; 4317e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4318e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4319e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinion_memory_alloc_map_exit: 4320e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return fd; 4321e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 4322e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4323e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 4324e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Free ION memory. 4325e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 4326e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_swvdec::ion_memory_free(struct vdec_ion *p_ion_buf_info) 4327e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 4328e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p_ion_buf_info == NULL) 4329e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4330e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("p_ion_buf_info = NULL"); 4331e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto ion_memory_free_exit; 4332e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4333e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4334e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (ioctl(p_ion_buf_info->ion_fd_device, 4335e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ION_IOC_FREE, 4336e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin &p_ion_buf_info->ion_alloc_data.handle)) 4337e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4338e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("ioctl() for freeing failed"); 4339e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4340e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4341e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin close(p_ion_buf_info->ion_fd_device); 4342e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4343e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_ion_buf_info->ion_fd_device = -1; 4344e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_ion_buf_info->ion_alloc_data.handle = 0; 4345e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_ion_buf_info->ion_fd_data.fd = -1; 4346e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4347e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinion_memory_free_exit: 4348e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return; 4349e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 4350e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4351e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 4352e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * ---------------------------- 4353e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * component callback functions 4354e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * ---------------------------- 4355e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 4356e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4357e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 4358e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Empty buffer done callback. 4359e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 4360e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_buffer_ip: Pointer to input buffer structure. 4361e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 4362e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_swvdec::swvdec_empty_buffer_done(SWVDEC_BUFFER *p_buffer_ip) 4363e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 4364e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned long index = (unsigned long) p_buffer_ip->p_client_data; 4365e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4366e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_post_event(OMX_SWVDEC_EVENT_EBD, 4367e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (unsigned long) &m_buffer_array_ip[index].buffer_header, 4368e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin index); 4369e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 4370e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4371e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 4372e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Fill buffer done callback. 4373e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 4374e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_buffer_op: Pointer to output buffer structure. 4375e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 4376e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_swvdec::swvdec_fill_buffer_done(SWVDEC_BUFFER *p_buffer_op) 4377e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 4378e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned long index = (unsigned long) p_buffer_op->p_client_data; 4379e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4380e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE *p_buffer_hdr; 4381e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4382e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (index < ((unsigned long) m_port_op.def.nBufferCountActual)) 4383e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4384e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr = &m_buffer_array_op[index].buffer_header; 4385e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4386e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->nFlags = p_buffer_op->flags; 4387e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->nTimeStamp = p_buffer_op->timestamp; 4388e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->nFilledLen = ((m_meta_buffer_mode && 4389e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_op->filled_length) ? 4390e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->nAllocLen : 4391e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_op->filled_length); 4392e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4393e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4394e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_post_event(OMX_SWVDEC_EVENT_FBD, 4395e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (unsigned long) &m_buffer_array_op[index].buffer_header, 4396e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin index); 4397e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 4398e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4399e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 4400e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Event handler callback. 4401e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 4402e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] event: Event. 4403e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_data: Pointer to event-specific data. 4404e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 4405e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_swvdec::swvdec_event_handler(SWVDEC_EVENT event, void *p_data) 4406e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 4407e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch (event) 4408e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4409e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4410e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case SWVDEC_EVENT_FLUSH_ALL_DONE: 4411e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4412e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_post_event(OMX_SWVDEC_EVENT_FLUSH_PORT_IP, 0, 0); 4413e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_post_event(OMX_SWVDEC_EVENT_FLUSH_PORT_OP, 0, 0); 4414e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4415e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4416e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4417e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case SWVDEC_EVENT_FLUSH_OP_DONE: 4418e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4419e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_post_event(OMX_SWVDEC_EVENT_FLUSH_PORT_OP, 0, 0); 4420e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4421e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4422e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4423e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case SWVDEC_EVENT_RELEASE_REFERENCE: 4424e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4425e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_BUFFER *p_buffer_op = (SWVDEC_BUFFER *) p_data; 4426e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4427e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned long index = (unsigned long) p_buffer_op->p_client_data; 4428e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4429e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_LOW("release reference: %p", p_buffer_op->p_buffer); 4430e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4431e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin assert(index < ((unsigned long) m_port_op.def.nBufferCountActual)); 4432e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4433e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_meta_buffer_mode) 4434e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4435e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin meta_buffer_ref_remove( 4436e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op[index].buffer_payload.pmem_fd, 4437e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op[index].buffer_payload.offset); 4438e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4439e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4440e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4441e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4442e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4443e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case SWVDEC_EVENT_RECONFIG_REQUIRED: 4444e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4445e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_post_event(OMX_SWVDEC_EVENT_PORT_RECONFIG, 0, 0); 4446e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4447e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4448e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4449e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case SWVDEC_EVENT_FATAL_ERROR: 4450e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 4451e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4452e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_post_event(OMX_SWVDEC_EVENT_ERROR, OMX_ErrorHardware, 0); 4453e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4454e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4455e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4456e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4457e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 4458e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4459e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 4460e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Translate SwVdec status return value to OMX error type return value. 4461e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 4462e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] retval_swvdec: SwVdec status return value. 4463e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 4464e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 4465e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 4466e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::retval_swvdec2omx(SWVDEC_STATUS retval_swvdec) 4467e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 4468e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval_omx; 4469e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4470e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch (retval_swvdec) 4471e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4472e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4473e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS_SUCCESS: 4474e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval_omx = OMX_ErrorNone; 4475e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4476e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4477e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS_FAILURE: 4478e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval_omx = OMX_ErrorUndefined; 4479e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4480e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4481e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS_NULL_POINTER: 4482e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS_INVALID_PARAMETERS: 4483e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval_omx = OMX_ErrorBadParameter; 4484e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4485e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4486e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS_INVALID_STATE: 4487e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval_omx = OMX_ErrorInvalidState; 4488e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4489e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4490e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS_INSUFFICIENT_RESOURCES: 4491e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval_omx = OMX_ErrorInsufficientResources; 4492e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4493e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4494e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS_UNSUPPORTED: 4495e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval_omx = OMX_ErrorUnsupportedSetting; 4496e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4497e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4498e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS_NOT_IMPLEMENTED: 4499e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval_omx = OMX_ErrorNotImplemented; 4500e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4501e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4502e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 4503e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval_omx = OMX_ErrorUndefined; 4504e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4505e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4506e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4507e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4508e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval_omx; 4509e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 4510e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4511e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 4512e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Create asynchronous thread. 4513e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 4514e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 4515e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 4516e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::async_thread_create() 4517e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 4518e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 4519e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4520e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pthread_attr_t thread_attributes; 4521e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4522e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (sem_init(&m_async_thread.sem_thread_created, 0, 0)) 4523e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4524e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("failed to create async thread created semaphore"); 4525e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInsufficientResources; 4526e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4527e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (sem_init(&m_async_thread.sem_event, 0, 0)) 4528e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4529e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("failed to create async thread event semaphore"); 4530e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInsufficientResources; 4531e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4532e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (pthread_attr_init(&thread_attributes)) 4533e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4534e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("failed to create thread attributes object"); 4535e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInsufficientResources; 4536e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4537e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (pthread_attr_setdetachstate(&thread_attributes, 4538e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin PTHREAD_CREATE_JOINABLE)) 4539e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4540e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("failed to set detach state attribute"); 4541e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInsufficientResources; 4542e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4543e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pthread_attr_destroy(&thread_attributes); 4544e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4545e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 4546e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4547e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_async_thread.created = false; 4548e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_async_thread.exit = false; 4549e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4550e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (pthread_create(&m_async_thread.handle, 4551e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin &thread_attributes, 4552e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (void *(*)(void *)) async_thread, 4553e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin this)) 4554e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4555e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("failed to create async thread"); 4556e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInsufficientResources; 4557e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4558e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pthread_attr_destroy(&thread_attributes); 4559e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4560e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 4561e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4562e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (pthread_setname_np(m_async_thread.handle, "swvdec_async")) 4563e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4564e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // don't return error 4565e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("failed to set async thread name"); 4566e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4567e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4568e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sem_wait(&m_async_thread.sem_thread_created); 4569e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_async_thread.created = true; 4570e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4571e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4572e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4573e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 4574e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 4575e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4576e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 4577e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Destroy asynchronous thread. 4578e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 4579e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_swvdec::async_thread_destroy() 4580e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 4581e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_async_thread.created) 4582e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4583e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_async_thread.exit = true; 4584e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sem_post(&m_async_thread.sem_event); 4585e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4586e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin pthread_join(m_async_thread.handle, NULL); 4587e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_async_thread.created = false; 4588e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4589e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4590e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_async_thread.exit = false; 4591e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4592e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sem_destroy(&m_async_thread.sem_event); 4593e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sem_destroy(&m_async_thread.sem_thread_created); 4594e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 4595e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4596e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 4597e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Post event to appropriate queue. 4598e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 4599e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] event_id: Event ID. 4600e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] event_param1: Event parameter 1. 4601e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] event_param2: Event parameter 2. 4602e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 4603e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval true if post event successful 4604e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval false if post event unsuccessful 4605e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 4606e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbool omx_swvdec::async_post_event(unsigned long event_id, 4607e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned long event_param1, 4608e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned long event_param2) 4609e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 4610e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_EVENT_INFO event_info; 4611e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4612e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bool retval = true; 4613e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4614e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin event_info.event_id = event_id; 4615e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin event_info.event_param1 = event_param1; 4616e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin event_info.event_param2 = event_param2; 4617e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4618e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch (event_id) 4619e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4620e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4621e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_SWVDEC_EVENT_ETB: 4622e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_SWVDEC_EVENT_EBD: 4623e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4624e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = m_queue_port_ip.push(&event_info); 4625e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4626e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4627e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4628e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_SWVDEC_EVENT_FTB: 4629e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_SWVDEC_EVENT_FBD: 4630e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4631e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = m_queue_port_op.push(&event_info); 4632e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4633e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4634e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4635e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 4636e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4637e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = m_queue_command.push(&event_info); 4638e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4639e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4640e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4641e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4642e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4643e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (retval == true) 4644e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4645e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sem_post(&m_async_thread.sem_event); 4646e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4647e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4648e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 4649e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 4650e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4651e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 4652e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Asynchronous thread. 4653e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 4654e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_cmp: Pointer to OMX SwVdec component class. 4655e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 4656e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_swvdec::async_thread(void *p_cmp) 4657e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 4658e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p_cmp == NULL) 4659e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4660e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("p_cmp = NULL"); 4661e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4662e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 4663e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4664e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_swvdec *p_omx_swvdec = (omx_swvdec *) p_cmp; 4665e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4666e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ASYNC_THREAD *p_async_thread = &p_omx_swvdec->m_async_thread; 4667e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4668e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("created"); 4669e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4670e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sem_post(&p_async_thread->sem_thread_created); 4671e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4672e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin while (p_async_thread->exit == false) 4673e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4674e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sem_wait(&p_async_thread->sem_event); 4675e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4676e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p_async_thread->exit == true) 4677e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4678e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4679e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4680e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4681e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_omx_swvdec->async_process_event(p_cmp); 4682e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4683e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4684e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4685e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("exiting"); 4686e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 4687e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4688e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 4689e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Process event. 4690e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 4691e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_cmp: Pointer to OMX SwVdec component class. 4692e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 4693e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_swvdec::async_process_event(void *p_cmp) 4694e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 4695e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin omx_swvdec *p_omx_swvdec; 4696e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4697e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_EVENT_INFO event_info; 4698e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4699e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 4700e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4701e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p_cmp == NULL) 4702e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4703e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("p_cmp = NULL"); 4704e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto async_process_event_exit; 4705e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4706e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4707e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_omx_swvdec = (omx_swvdec *) p_cmp; 4708e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4709e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // NOTE: queues popped in order of priority; do not change! 4710e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4711e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((p_omx_swvdec->m_queue_command.pop(&event_info) == false) && 4712e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (p_omx_swvdec->m_queue_port_op.pop(&event_info) == false) && 4713e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (p_omx_swvdec->m_queue_port_ip.pop(&event_info) == false)) 4714e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4715e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_LOW("no event popped"); 4716e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin goto async_process_event_exit; 4717e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4718e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4719e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch (event_info.event_id) 4720e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4721e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4722e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_SWVDEC_EVENT_CMD: 4723e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4724e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMMANDTYPE cmd = (OMX_COMMANDTYPE) event_info.event_param1; 4725e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U32 param = (OMX_U32) event_info.event_param2; 4726e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4727e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = p_omx_swvdec->async_process_event_cmd(cmd, param); 4728e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4729e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4730e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4731e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_SWVDEC_EVENT_CMD_ACK: 4732e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4733e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMMANDTYPE cmd = (OMX_COMMANDTYPE) event_info.event_param1; 4734e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U32 param = (OMX_U32) event_info.event_param2; 4735e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4736e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = p_omx_swvdec->async_process_event_cmd_ack(cmd, param); 4737e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4738e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4739e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4740e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_SWVDEC_EVENT_ERROR: 4741e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4742e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE error_code = (OMX_ERRORTYPE) event_info.event_param1; 4743e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4744e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = p_omx_swvdec->async_process_event_error(error_code); 4745e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4746e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4747e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4748e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_SWVDEC_EVENT_ETB: 4749e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4750e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE *p_buffer_hdr = 4751e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_BUFFERHEADERTYPE *) event_info.event_param1; 4752e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4753e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int index = event_info.event_param2; 4754e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4755e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = p_omx_swvdec->async_process_event_etb(p_buffer_hdr, index); 4756e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4757e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4758e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4759e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_SWVDEC_EVENT_FTB: 4760e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4761e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE *p_buffer_hdr = 4762e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_BUFFERHEADERTYPE *) event_info.event_param1; 4763e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4764e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int index = event_info.event_param2; 4765e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4766e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = p_omx_swvdec->async_process_event_ftb(p_buffer_hdr, index); 4767e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4768e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4769e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4770e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_SWVDEC_EVENT_EBD: 4771e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4772e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE *p_buffer_hdr = 4773e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_BUFFERHEADERTYPE *) event_info.event_param1; 4774e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4775e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int index = event_info.event_param2; 4776e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4777e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = p_omx_swvdec->async_process_event_ebd(p_buffer_hdr, index); 4778e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4779e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4780e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4781e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_SWVDEC_EVENT_FBD: 4782e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4783e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE *p_buffer_hdr = 4784e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_BUFFERHEADERTYPE *) event_info.event_param1; 4785e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4786e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int index = event_info.event_param2; 4787e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4788e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = p_omx_swvdec->async_process_event_fbd(p_buffer_hdr, index); 4789e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4790e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4791e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4792e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_SWVDEC_EVENT_EOS: 4793e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4794e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = p_omx_swvdec->async_process_event_eos(); 4795e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4796e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4797e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4798e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_SWVDEC_EVENT_FLUSH_PORT_IP: 4799e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4800e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = p_omx_swvdec->async_process_event_flush_port_ip(); 4801e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4802e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4803e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4804e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_SWVDEC_EVENT_FLUSH_PORT_OP: 4805e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4806e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = p_omx_swvdec->async_process_event_flush_port_op(); 4807e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4808e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4809e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4810e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_SWVDEC_EVENT_PORT_RECONFIG: 4811e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4812e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = p_omx_swvdec->async_process_event_port_reconfig(); 4813e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4814e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4815e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4816e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 4817e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4818e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin assert(0); 4819e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorUndefined; 4820e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4821e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4822e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4823e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4824e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4825e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (retval != OMX_ErrorNone) 4826e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4827e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_omx_swvdec->async_post_event(OMX_SWVDEC_EVENT_ERROR, retval, 0); 4828e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4829e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4830e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinasync_process_event_exit: 4831e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return; 4832e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 4833e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4834e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 4835e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Process command event. 4836e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 4837e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] cmd: Command. 4838e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] param: Command parameter. 4839e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 4840e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 4841e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 4842e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::async_process_event_cmd(OMX_COMMANDTYPE cmd, 4843e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U32 param) 4844e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 4845e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 4846e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4847e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bool cmd_ack = false; // set to 'true' if command is to be acknowledged 4848e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4849e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS retval_swvdec; 4850e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4851e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch (cmd) 4852e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4853e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4854e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_CommandStateSet: 4855e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4856e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = async_process_event_cmd_state_set(&cmd_ack, 4857e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_STATETYPE) param); 4858e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4859e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4860e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4861e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_CommandFlush: 4862e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4863e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = async_process_event_cmd_flush((unsigned int) param); 4864e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4865e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4866e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4867e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_CommandPortDisable: 4868e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4869e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = async_process_event_cmd_port_disable(&cmd_ack, 4870e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (unsigned int) param); 4871e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4872e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4873e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4874e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_CommandPortEnable: 4875e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4876e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = async_process_event_cmd_port_enable(&cmd_ack, 4877e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (unsigned int) param); 4878e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4879e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4880e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4881e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 4882e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4883e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("cmd '%d' invalid", (int) cmd); 4884e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4885e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 4886e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4887e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4888e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4889e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } // switch (cmd) 4890e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4891e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // post appropriate event 4892e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4893e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (retval != OMX_ErrorNone) 4894e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4895e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_post_event(OMX_SWVDEC_EVENT_ERROR, retval, 0); 4896e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4897e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (cmd_ack) 4898e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4899e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_post_event(OMX_SWVDEC_EVENT_CMD_ACK, cmd, param); 4900e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4901e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4902e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // post to command semaphore 4903e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin sem_post(&m_sem_cmd); 4904e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4905e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 4906e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 4907e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4908e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 4909e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Process command acknowledgement event. 4910e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 4911e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] cmd: Command. 4912e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] param: Command parameter. 4913e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 4914e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 4915e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 4916e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::async_process_event_cmd_ack(OMX_COMMANDTYPE cmd, 4917e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U32 param) 4918e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 4919e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 4920e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4921e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch (cmd) 4922e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4923e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4924e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_CommandStateSet: 4925e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4926e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_state = (OMX_STATETYPE) param; 4927e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4928e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_CALLBACK("EventHandler(): OMX_EventCmdComplete, " 4929e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "OMX_CommandStateSet, %s", 4930e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_STATETYPE_STRING(m_state)); 4931e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4932e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_callback.EventHandler(&m_cmp, 4933e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_app_data, 4934e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_EventCmdComplete, 4935e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CommandStateSet, 4936e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_U32) m_state, 4937e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin NULL); 4938e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4939e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4940e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4941e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_CommandFlush: 4942e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_CommandPortEnable: 4943e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_CommandPortDisable: 4944e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4945e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((cmd == OMX_CommandPortEnable) && m_port_reconfig_inprogress) 4946e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4947e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_reconfig_inprogress = false; 4948e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4949e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4950e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_CALLBACK("EventHandler(): OMX_EventCmdComplete, " 4951e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "%s, port index %d", 4952e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_COMMANDTYPE_STRING(cmd), 4953e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin param); 4954e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4955e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_callback.EventHandler(&m_cmp, 4956e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_app_data, 4957e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_EventCmdComplete, 4958e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin cmd, 4959e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin param, 4960e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin NULL); 4961e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4962e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4963e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4964e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 4965e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4966e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("cmd '%d' invalid", (int) cmd); 4967e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 4968e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 4969e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4970e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4971e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } // switch (cmd) 4972e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4973e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 4974e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 4975e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4976e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 4977e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Process error event. 4978e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 4979e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] error_code: Error code. 4980e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 4981e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ErrorNone 4982e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 4983e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::async_process_event_error(OMX_ERRORTYPE error_code) 4984e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 4985e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (error_code == OMX_ErrorInvalidState) 4986e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 4987e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_state = OMX_StateInvalid; 4988e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 4989e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4990e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_CALLBACK("EventHandler(): OMX_EventError, 0x%08x", 4991e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin error_code); 4992e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 4993e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_callback.EventHandler(&m_cmp, 4994e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_app_data, 4995e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_EventError, 4996e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (OMX_U32) error_code, 4997e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 0, 4998e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin NULL); 4999e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5000e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorNone; 5001e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 5002e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5003e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 5004e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Process OMX_CommandStateSet. 5005e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 5006e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] p_cmd_ack: Pointer to 'command acknowledge' boolean variable. 5007e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] state_new: New state to which transition is requested. 5008e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 5009e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 5010e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 5011e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::async_process_event_cmd_state_set( 5012e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bool *p_cmd_ack, 5013e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_STATETYPE state_new) 5014e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 5015e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 5016e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5017e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS retval_swvdec; 5018e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5019e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("'%s-to-%s' requested", 5020e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_STATETYPE_STRING(m_state), 5021e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_STATETYPE_STRING(state_new)); 5022e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5023e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin /** 5024e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * Only the following state transitions are allowed via CommandStateSet: 5025e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 5026e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * LOADED -> IDLE -> EXECUTING 5027e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * LOADED <- IDLE <- EXECUTING 5028e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 5029e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5030e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_state == OMX_StateInvalid) 5031e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5032e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("in state %s", OMX_STATETYPE_STRING(m_state)); 5033e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInvalidState; 5034e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5035e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (state_new == OMX_StateInvalid) 5036e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5037e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("requested transition to state %s", 5038e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_STATETYPE_STRING(state_new)); 5039e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorInvalidState; 5040e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5041e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if ((m_state == OMX_StateLoaded) && 5042e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (state_new == OMX_StateIdle)) 5043e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5044e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((m_port_ip.populated == OMX_TRUE) && 5045e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_port_op.populated == OMX_TRUE)) 5046e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5047e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // start SwVdec 5048e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval_swvdec = swvdec_start(m_swvdec_handle)) == 5049e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS_SUCCESS) 5050e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5051e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *p_cmd_ack = true; 5052e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5053e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 5054e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5055e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("failed to start SwVdec"); 5056e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = retval_swvdec2omx(retval_swvdec); 5057e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5058e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5059e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 5060e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5061e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_status_flags |= (1 << PENDING_STATE_LOADED_TO_IDLE); 5062e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5063e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_LOW("'loaded-to-idle' pending"); 5064e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5065e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5066e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if ((m_state == OMX_StateIdle) && 5067e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (state_new == OMX_StateExecuting)) 5068e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5069e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *p_cmd_ack = true; 5070e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5071e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if ((m_state == OMX_StateExecuting) && 5072e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (state_new == OMX_StateIdle)) 5073e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5074e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_status_flags |= (1 << PENDING_STATE_EXECUTING_TO_IDLE); 5075e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5076e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_LOW("'executing-to-idle' pending"); 5077e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5078e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = flush(OMX_ALL); 5079e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5080e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if ((m_state == OMX_StateIdle) && 5081e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (state_new == OMX_StateLoaded)) 5082e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5083e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((m_port_ip.unpopulated == OMX_TRUE) && 5084e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_port_op.unpopulated == OMX_TRUE)) 5085e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5086e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // stop SwVdec 5087e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval_swvdec = swvdec_stop(m_swvdec_handle)) == 5088e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS_SUCCESS) 5089e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5090e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *p_cmd_ack = true; 5091e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5092e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 5093e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5094e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("failed to stop SwVdec"); 5095e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = retval_swvdec2omx(retval_swvdec); 5096e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5097e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5098e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 5099e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5100e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_status_flags |= (1 << PENDING_STATE_IDLE_TO_LOADED); 5101e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5102e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_LOW("'idle-to-loaded' pending"); 5103e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5104e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5105e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 5106e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5107e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("state transition '%s -> %s' illegal", 5108e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_STATETYPE_STRING(m_state), 5109e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_STATETYPE_STRING(state_new)); 5110e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5111e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = ((state_new == m_state) ? 5112e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ErrorSameState : 5113e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ErrorIncorrectStateTransition); 5114e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5115e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5116e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 5117e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 5118e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5119e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 5120e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Process OMX_CommandFlush. 5121e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 5122e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] port_index: Index of port to flush. 5123e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 5124e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 5125e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 5126e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::async_process_event_cmd_flush(unsigned int port_index) 5127e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 5128e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 5129e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5130e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("flush port %d requested", port_index); 5131e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5132e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (port_index == OMX_CORE_PORT_INDEX_IP) 5133e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5134e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_status_flags |= (1 << PENDING_PORT_FLUSH_IP); 5135e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5136e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_LOW("ip port flush pending"); 5137e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5138e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (port_index == OMX_CORE_PORT_INDEX_OP) 5139e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5140e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_status_flags |= (1 << PENDING_PORT_FLUSH_OP); 5141e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5142e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_LOW("op port flush pending"); 5143e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5144e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (port_index == OMX_ALL) 5145e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5146e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_status_flags |= (1 << PENDING_PORT_FLUSH_IP); 5147e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_status_flags |= (1 << PENDING_PORT_FLUSH_OP); 5148e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5149e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_LOW("ip & op ports flush pending"); 5150e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5151e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5152e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = flush(port_index); 5153e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5154e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 5155e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 5156e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5157e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 5158e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Process OMX_CommandPortDisable. 5159e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 5160e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] p_cmd_ack: Pointer to 'command acknowledge' boolean variable. 5161e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] port_index: Index of port to disable. 5162e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 5163e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 5164e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 5165e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::async_process_event_cmd_port_disable( 5166e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bool *p_cmd_ack, 5167e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int port_index) 5168e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 5169e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 5170e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5171e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("disable port %d requested", port_index); 5172e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5173e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (port_index == OMX_CORE_PORT_INDEX_IP) 5174e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5175e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_port_ip.enabled == OMX_FALSE) 5176e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5177e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("ip port already disabled"); 5178e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadPortIndex; 5179e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5180e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 5181e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5182e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.enabled = OMX_FALSE; 5183e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5184e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_port_ip.unpopulated) 5185e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5186e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *p_cmd_ack = true; 5187e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5188e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 5189e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5190e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_status_flags |= (1 << PENDING_PORT_DISABLE_IP); 5191e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5192e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_LOW("ip port disable pending"); 5193e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5194e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_port_ip.num_pending_buffers) 5195e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5196e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = flush(port_index); 5197e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5198e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5199e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5200e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5201e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (port_index == OMX_CORE_PORT_INDEX_OP) 5202e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5203e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_port_op.enabled == OMX_FALSE) 5204e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5205e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("op port already disabled"); 5206e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadPortIndex; 5207e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5208e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 5209e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5210e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.enabled = OMX_FALSE; 5211e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5212e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_port_op.unpopulated) 5213e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5214e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *p_cmd_ack = true; 5215e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5216e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 5217e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5218e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_status_flags |= (1 << PENDING_PORT_DISABLE_OP); 5219e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5220e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_LOW("op port disable pending"); 5221e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5222e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_port_op.num_pending_buffers) 5223e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5224e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = flush(port_index); 5225e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5226e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5227e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5228e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5229e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (port_index == OMX_ALL) 5230e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5231e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_port_ip.enabled == OMX_FALSE) 5232e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5233e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("ip port already disabled"); 5234e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadPortIndex; 5235e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5236e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (m_port_op.enabled == OMX_FALSE) 5237e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5238e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("op port already disabled"); 5239e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadPortIndex; 5240e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5241e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 5242e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5243e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_port_ip.unpopulated && m_port_op.unpopulated) 5244e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5245e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *p_cmd_ack = true; 5246e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5247e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 5248e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5249e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.enabled = OMX_FALSE; 5250e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.enabled = OMX_FALSE; 5251e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5252e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_port_ip.unpopulated == OMX_FALSE) 5253e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5254e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_status_flags |= (1 << PENDING_PORT_DISABLE_IP); 5255e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5256e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_LOW("ip port disable pending"); 5257e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5258e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_port_ip.num_pending_buffers) 5259e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5260e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = flush(port_index); 5261e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5262e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5263e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5264e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval == OMX_ErrorNone) && 5265e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_port_op.unpopulated == OMX_FALSE)) 5266e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5267e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_status_flags |= (1 << PENDING_PORT_DISABLE_OP); 5268e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5269e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_LOW("op port disable pending"); 5270e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5271e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_port_op.num_pending_buffers) 5272e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5273e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = flush(port_index); 5274e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5275e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5276e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5277e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5278e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5279e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 5280e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5281e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("port index '%d' invalid"); 5282e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadPortIndex; 5283e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5284e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5285e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 5286e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 5287e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5288e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 5289e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Process OMX_CommandPortEnable. 5290e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 5291e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] p_cmd_ack: Pointer to 'command acknowledge' boolean variable. 5292e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] port_index: Index of port to enable. 5293e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 5294e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 5295e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 5296e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::async_process_event_cmd_port_enable( 5297e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin bool *p_cmd_ack, 5298e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int port_index) 5299e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 5300e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 5301e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5302e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("enable port %d requested", port_index); 5303e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5304e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (port_index == OMX_CORE_PORT_INDEX_IP) 5305e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5306e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_port_ip.enabled) 5307e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5308e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("ip port already enabled"); 5309e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadPortIndex; 5310e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5311e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 5312e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5313e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.enabled = OMX_TRUE; 5314e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5315e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_port_ip.populated) 5316e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5317e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *p_cmd_ack = true; 5318e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5319e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 5320e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5321e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_status_flags |= (1 << PENDING_PORT_ENABLE_IP); 5322e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5323e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_LOW("ip port enable pending"); 5324e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5325e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5326e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5327e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (port_index == OMX_CORE_PORT_INDEX_OP) 5328e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5329e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_port_op.enabled) 5330e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5331e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("op port already enabled"); 5332e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadPortIndex; 5333e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5334e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 5335e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5336e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.enabled = OMX_TRUE; 5337e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5338e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_port_op.populated) 5339e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5340e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *p_cmd_ack = true; 5341e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5342e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 5343e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5344e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_status_flags |= (1 << PENDING_PORT_ENABLE_OP); 5345e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5346e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_LOW("op port enable pending"); 5347e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5348e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5349e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5350e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (port_index == OMX_ALL) 5351e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5352e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_port_ip.enabled) 5353e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5354e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("ip port already enabled"); 5355e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadPortIndex; 5356e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5357e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (m_port_op.enabled) 5358e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5359e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("op port already enabled"); 5360e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadPortIndex; 5361e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5362e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 5363e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5364e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.enabled = OMX_TRUE; 5365e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.enabled = OMX_TRUE; 5366e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5367e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_port_ip.populated && m_port_op.populated) 5368e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5369e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *p_cmd_ack = true; 5370e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5371e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (m_port_ip.populated == false) 5372e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5373e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_status_flags |= (1 << PENDING_PORT_ENABLE_IP); 5374e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5375e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_LOW("ip port enable pending"); 5376e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5377e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (m_port_op.populated == false) 5378e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5379e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_status_flags |= (1 << PENDING_PORT_ENABLE_OP); 5380e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5381e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_LOW("op port enable pending"); 5382e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5383e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5384e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5385e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 5386e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5387e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("port index '%d' invalid"); 5388e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadPortIndex; 5389e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5390e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5391e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 5392e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 5393e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5394e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 5395e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Process ETB event. 5396e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 5397e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_buffer_hdr: Pointer to buffer header. 5398e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] index: Index of buffer in input buffer info array. 5399e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 5400e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 5401e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 5402e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::async_process_event_etb( 5403e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE *p_buffer_hdr, 5404e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int index) 5405e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 5406e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 5407e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5408e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.num_pending_buffers++; 5409e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5410e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((p_buffer_hdr->nFilledLen == 0) && 5411e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ((p_buffer_hdr->nFlags & OMX_BUFFERFLAG_EOS) == 0)) 5412e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5413e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("returning %p, buffer %p; " 5414e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "zero length & no EOS flag", 5415e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr, 5416e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->pBuffer); 5417e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5418e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_post_event(OMX_SWVDEC_EVENT_EBD, 5419e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (unsigned long) p_buffer_hdr, 5420e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (unsigned long) index); 5421e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5422e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else if (m_port_ip.flush_inprogress) 5423e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5424e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("returning %p, buffer %p; " 5425e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "ip port flush in progress", 5426e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr, 5427e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->pBuffer); 5428e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5429e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_post_event(OMX_SWVDEC_EVENT_EBD, 5430e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (unsigned long) p_buffer_hdr, 5431e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (unsigned long) index); 5432e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5433e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 5434e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5435e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS retval_swvdec; 5436e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5437e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_BUFFER *p_buffer_swvdec = 5438e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin &(m_buffer_array_ip[index].buffer_swvdec); 5439e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5440e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p_buffer_hdr->nFilledLen && 5441e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ((p_buffer_hdr->nFlags & OMX_BUFFERFLAG_CODECCONFIG) == 0)) 5442e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5443e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_ts_list.push(p_buffer_hdr->nTimeStamp); 5444e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5445e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5446e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin assert(p_buffer_swvdec->p_buffer == p_buffer_hdr->pBuffer); 5447e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5448e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_swvdec->flags = p_buffer_hdr->nFlags; 5449e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_swvdec->timestamp = p_buffer_hdr->nTimeStamp; 5450e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_swvdec->filled_length = p_buffer_hdr->nFilledLen; 5451e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5452e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_diag.dump_ip(p_buffer_swvdec->p_buffer, 5453e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_swvdec->filled_length); 5454e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5455e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval_swvdec = swvdec_emptythisbuffer(m_swvdec_handle, 5456e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_swvdec); 5457e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5458e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (retval_swvdec != SWVDEC_STATUS_SUCCESS) 5459e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5460e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = retval_swvdec2omx(retval_swvdec); 5461e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5462e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5463e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5464e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 5465e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 5466e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5467e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 5468e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Process FTB event. 5469e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 5470e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_buffer_hdr: Pointer to buffer header. 5471e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] index: Index of buffer in output buffer info array. 5472e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 5473e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 5474e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 5475e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::async_process_event_ftb( 5476e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE *p_buffer_hdr, 5477e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int index) 5478e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 5479e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 5480e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5481e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.num_pending_buffers++; 5482e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5483e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_port_op.flush_inprogress) 5484e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5485e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_HIGH("returning %p, buffer %p; " 5486e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "op port flush in progress", 5487e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr, 5488e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op[index].buffer_swvdec.p_buffer); 5489e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5490e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_post_event(OMX_SWVDEC_EVENT_FBD, 5491e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (unsigned long) p_buffer_hdr, 5492e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (unsigned long) index); 5493e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5494e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 5495e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5496e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_STATUS retval_swvdec; 5497e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5498e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin SWVDEC_BUFFER *p_buffer_swvdec = 5499e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin &(m_buffer_array_op[index].buffer_swvdec); 5500e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5501e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval_swvdec = swvdec_fillthisbuffer(m_swvdec_handle, p_buffer_swvdec); 5502e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5503e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (retval_swvdec != SWVDEC_STATUS_SUCCESS) 5504e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5505e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = retval_swvdec2omx(retval_swvdec); 5506e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5507e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5508e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5509e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 5510e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 5511e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5512e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 5513e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Process EBD event. 5514e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 5515e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_buffer_hdr: Pointer to buffer header. 5516e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] index: Index of buffer in output buffer info array. 5517e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 5518e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 5519e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 5520e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::async_process_event_ebd( 5521e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE *p_buffer_hdr, 5522e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int index) 5523e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 5524e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 5525e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5526e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (index < m_port_ip.def.nBufferCountActual) 5527e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5528e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.num_pending_buffers--; 5529e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5530e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // should ideally be set in swvdec_empty_buffer_done() 5531e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->nFilledLen = 0; 5532e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5533e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_CALLBACK( 5534e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "EmptyBufferDone(): %p, buffer %p", 5535e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr, 5536e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_ip[index].buffer_swvdec.p_buffer); 5537e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5538e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_callback.EmptyBufferDone(&m_cmp, m_app_data, p_buffer_hdr); 5539e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5540e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 5541e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5542e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("buffer index '%d' invalid", index); 5543e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 5544e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5545e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5546e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 5547e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 5548e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5549e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 5550e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Process FBD event. 5551e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 5552e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_buffer_hdr: Pointer to buffer header. 5553e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] index: Index of buffer in output buffer info array. 5554e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 5555e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 5556e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 5557e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::async_process_event_fbd( 5558e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE *p_buffer_hdr, 5559e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int index) 5560e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 5561e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 5562e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5563e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (index < m_port_op.def.nBufferCountActual) 5564e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5565e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_U8 *p_buffer; 5566e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5567e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer = m_buffer_array_op[index].buffer_swvdec.p_buffer; 5568e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5569e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.num_pending_buffers--; 5570e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5571e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_port_op.flush_inprogress) 5572e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5573e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->nFilledLen = 0; 5574e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->nTimeStamp = 0; 5575e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT; 5576e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5577e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5578e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p_buffer_hdr->nFilledLen) 5579e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5580e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_sync_frame_decoding_mode) 5581e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5582e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->nTimeStamp = 0; 5583e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5584e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 5585e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5586e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_ts_list.pop(&p_buffer_hdr->nTimeStamp) == false) 5587e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5588e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("failed to pop timestamp from list"); 5589e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5590e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5591e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5592e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_diag.dump_op(p_buffer, 5593e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_frame_dimensions.width, 5594e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_frame_dimensions.height, 5595e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_frame_attributes.stride, 5596e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_frame_attributes.scanlines); 5597e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5598e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5599e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (p_buffer_hdr->nFlags & OMX_BUFFERFLAG_EOS) 5600e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5601e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_post_event(OMX_SWVDEC_EVENT_EOS, 0, 0); 5602e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5603e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_ts_list.reset(); 5604e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5605e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5606e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_meta_buffer_mode && 5607e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin ((p_buffer_hdr->nFlags & OMX_BUFFERFLAG_READONLY)) == 0) 5608e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5609e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin meta_buffer_ref_remove( 5610e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op[index].buffer_payload.pmem_fd, 5611e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_buffer_array_op[index].buffer_payload.offset); 5612e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5613e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5614e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_CALLBACK( 5615e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "FillBufferDone(): %p, buffer %p, " 5616e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "flags 0x%08x, timestamp %lld", 5617e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr, 5618e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer, 5619e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->nFlags, 5620e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr->nTimeStamp); 5621e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5622e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_callback.FillBufferDone(&m_cmp, m_app_data, p_buffer_hdr); 5623e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5624e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 5625e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5626e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("buffer index '%d' invalid", index); 5627e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorBadParameter; 5628e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5629e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5630e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinasync_process_event_fbd_exit: 5631e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 5632e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 5633e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5634e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 5635e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Process EOS event. 5636e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 5637e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ErrorNone 5638e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 5639e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::async_process_event_eos() 5640e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 5641e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_CALLBACK("EventHandler(): " 5642e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "OMX_EventBufferFlag, port %d, EOS", 5643e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CORE_PORT_INDEX_OP); 5644e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5645e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_callback.EventHandler(&m_cmp, 5646e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_app_data, 5647e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_EventBufferFlag, 5648e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CORE_PORT_INDEX_OP, 5649e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERFLAG_EOS, 5650e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin NULL); 5651e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5652e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return OMX_ErrorNone; 5653e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 5654e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5655e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 5656e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Process input port flush event. 5657e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 5658e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 5659e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 5660e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::async_process_event_flush_port_ip() 5661e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 5662e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 5663e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5664e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_EVENT_INFO event_info; 5665e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5666e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE *p_buffer_hdr; 5667e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5668e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int index; 5669e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5670e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin while (m_queue_port_ip.pop(&event_info)) 5671e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5672e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch (event_info.event_id) 5673e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5674e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5675e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_SWVDEC_EVENT_ETB: 5676e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5677e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr = (OMX_BUFFERHEADERTYPE *) event_info.event_param1; 5678e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin index = event_info.event_param2; 5679e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5680e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // compensate decrement in async_process_event_ebd() 5681e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.num_pending_buffers++; 5682e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5683e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = async_process_event_ebd(p_buffer_hdr, index); 5684e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 5685e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5686e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5687e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_SWVDEC_EVENT_EBD: 5688e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5689e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr = (OMX_BUFFERHEADERTYPE *) event_info.event_param1; 5690e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin index = event_info.event_param2; 5691e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5692e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = async_process_event_ebd(p_buffer_hdr, index); 5693e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 5694e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5695e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5696e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 5697e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5698e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin assert(0); 5699e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 5700e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5701e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5702e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5703e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5704e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5705e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin assert(m_port_ip.num_pending_buffers == 0); 5706e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5707e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval == OMX_ErrorNone) && 5708e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_status_flags & (1 << PENDING_PORT_FLUSH_IP))) 5709e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5710e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_status_flags &= ~(1 << PENDING_PORT_FLUSH_IP); 5711e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5712e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_post_event(OMX_SWVDEC_EVENT_CMD_ACK, 5713e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CommandFlush, 5714e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CORE_PORT_INDEX_IP); 5715e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5716e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5717e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_ip.flush_inprogress = OMX_FALSE; 5718e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5719e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 5720e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 5721e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5722e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 5723e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Process output port flush event. 5724e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 5725e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 5726e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 5727e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::async_process_event_flush_port_op() 5728e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 5729e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 5730e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5731e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_EVENT_INFO event_info; 5732e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5733e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_BUFFERHEADERTYPE *p_buffer_hdr; 5734e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5735e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin unsigned int index; 5736e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5737e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin while (m_queue_port_op.pop(&event_info)) 5738e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5739e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin switch (event_info.event_id) 5740e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5741e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5742e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_SWVDEC_EVENT_FTB: 5743e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5744e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr = (OMX_BUFFERHEADERTYPE *) event_info.event_param1; 5745e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin index = event_info.event_param2; 5746e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5747e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin // compensate decrement in async_process_event_fbd() 5748e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.num_pending_buffers++; 5749e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5750e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = async_process_event_fbd(p_buffer_hdr, index); 5751e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 5752e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5753e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5754e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin case OMX_SWVDEC_EVENT_FBD: 5755e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5756e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin p_buffer_hdr = (OMX_BUFFERHEADERTYPE *) event_info.event_param1; 5757e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin index = event_info.event_param2; 5758e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5759e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = async_process_event_fbd(p_buffer_hdr, index); 5760e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 5761e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5762e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5763e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin default: 5764e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5765e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin assert(0); 5766e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin break; 5767e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5768e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5769e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5770e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5771e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5772e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin assert(m_port_op.num_pending_buffers == 0); 5773e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5774e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval == OMX_ErrorNone) && 5775e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_status_flags & (1 << PENDING_PORT_FLUSH_OP))) 5776e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5777e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_status_flags &= ~(1 << PENDING_PORT_FLUSH_OP); 5778e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5779e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_post_event(OMX_SWVDEC_EVENT_CMD_ACK, 5780e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CommandFlush, 5781e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CORE_PORT_INDEX_OP); 5782e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5783e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5784e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if ((retval == OMX_ErrorNone) && 5785e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin (m_status_flags & (1 << PENDING_STATE_EXECUTING_TO_IDLE))) 5786e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5787e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_status_flags &= ~(1 << PENDING_STATE_EXECUTING_TO_IDLE); 5788e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5789e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin async_post_event(OMX_SWVDEC_EVENT_CMD_ACK, 5790e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CommandStateSet, 5791e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_StateIdle); 5792e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5793e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5794e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_port_reconfig_inprogress == false) 5795e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5796e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_ts_list.reset(); 5797e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5798e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5799e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_op.flush_inprogress = OMX_FALSE; 5800e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5801e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 5802e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 5803e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5804e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/** 5805e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Process port reconfiguration event. 5806e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * 5807e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE 5808e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */ 5809e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::async_process_event_port_reconfig() 5810e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{ 5811e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_ERRORTYPE retval = OMX_ErrorNone; 5812e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5813e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin if (m_port_reconfig_inprogress) 5814e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5815e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_ERROR("port reconfiguration in progress"); 5816e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin retval = OMX_ErrorIncorrectStateOperation; 5817e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5818e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin else 5819e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin { 5820e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_port_reconfig_inprogress = true; 5821e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5822e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_SWVDEC_LOG_CALLBACK("EventHandler(): " 5823e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin "OMX_EventPortSettingsChanged, port %d", 5824e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CORE_PORT_INDEX_OP); 5825e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5826e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_callback.EventHandler(&m_cmp, 5827e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin m_app_data, 5828e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_EventPortSettingsChanged, 5829e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin OMX_CORE_PORT_INDEX_OP, 5830e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 0, 5831e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin NULL); 5832e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin } 5833e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin 5834e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin return retval; 5835e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} 5836