111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @copyright 311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. 511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Redistribution and use in source and binary forms, with or without 711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * modification, are permitted provided that the following conditions are met: 811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * * Redistributions of source code must retain the above copyright notice, 1011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * this list of conditions and the following disclaimer. 1111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * * Redistributions in binary form must reproduce the above copyright notice, 1211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * this list of conditions and the following disclaimer in the documentation 1311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * and/or other materials provided with the distribution. 1411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * * Neither the name of The Linux Foundation nor the names of its 1511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * contributors may be used to endorse or promote products derived from 1611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * this software without specific prior written permission. 1711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 1811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 1911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, 2011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE DISCLAIMED. 2111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY 2211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 2311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 2411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 2511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH 2811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * DAMAGE. 2911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 3011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @file 3111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 3211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * omx_swvdec.cpp 3311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 3411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief 3511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 3611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * OMX software video decoder component source. 3711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 3811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 3911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <assert.h> 4011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <fcntl.h> 4111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <sys/mman.h> 4211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 4311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <cutils/properties.h> 4411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 4511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <media/hardware/HardwareAPI.h> 4611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <gralloc_priv.h> 4711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 4811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "OMX_QCOMExtns.h" 4911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 5011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "omx_swvdec.h" 5111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 5211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "swvdec_api.h" 5311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 5411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic unsigned int split_buffer_mpeg4(unsigned int *offset_array, 5511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *p_buffer_hdr); 5611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 5711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 5811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * ---------------- 5911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * PUBLIC FUNCTIONS 6011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * ---------------- 6111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 6211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 6311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 6411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Create & return component class instance. 6511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 6611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval Pointer to new component class instance. 6711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 6811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid *get_omx_component_factory_fn(void) 6911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 7011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return new omx_swvdec; 7111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 7211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 7311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 7411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Component constructor. 7511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 7611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_swvdec::omx_swvdec(): 7711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state(OMX_StateInvalid), 7811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_status_flags(0), 7911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_swvdec_codec(SWVDEC_CODEC_INVALID), 8011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_swvdec_handle(NULL), 8111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_swvdec_created(false), 8211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_omx_video_codingtype(OMX_VIDEO_CodingUnused), 8311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_omx_color_formattype(OMX_COLOR_FormatUnused), 8411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sync_frame_decoding_mode(false), 8511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_android_native_buffers(false), 8611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_meta_buffer_mode_disabled(false), 8711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_meta_buffer_mode(false), 8811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_adaptive_playback_mode(false), 8911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_arbitrary_bytes_mode(false), 9011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_reconfig_inprogress(false), 9111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_dimensions_update_inprogress(false), 9211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_ip(NULL), 9311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_op(NULL), 9411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_meta_buffer_array(NULL) 9511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 9611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // memset all member variables that are composite structures 9711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_cmp, 0, sizeof(m_cmp)); // part of base class 9811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_cmp_name[0], 0, sizeof(m_cmp_name)); 9911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_role_name[0], 0, sizeof(m_role_name)); 10011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_frame_dimensions, 0, sizeof(m_frame_dimensions)); 10111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_frame_attributes, 0, sizeof(m_frame_attributes)); 10211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_frame_dimensions_max, 0, sizeof(m_frame_dimensions_max)); 10311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_async_thread, 0, sizeof(m_async_thread)); 10411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_port_ip, 0, sizeof(m_port_ip)); 10511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_port_op, 0, sizeof(m_port_op)); 10611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_callback, 0, sizeof(m_callback)); 10711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_app_data, 0, sizeof(m_app_data)); 10811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_prio_mgmt, 0, sizeof(m_prio_mgmt)); 10911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_sem_cmd, 0, sizeof(m_sem_cmd)); 11011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_meta_buffer_array_mutex, 0, sizeof(m_meta_buffer_array_mutex)); 11111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 11211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // null-terminate component name & role name strings 11311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_cmp_name[0] = '\0'; 11411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_role_name[0] = '\0'; 11511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 11611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // ports are enabled & unpopulated by default 11711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.enabled = OMX_TRUE; 11811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.enabled = OMX_TRUE; 11911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.unpopulated = OMX_TRUE; 12011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.unpopulated = OMX_TRUE; 12111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 12211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 12311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 12411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Component destructor. 12511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 12611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_swvdec::~omx_swvdec() 12711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 12811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 12911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 13011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 13111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Initialize component. 13211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 13311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] cmp_name: Component name string. 13411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 13511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 13611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 13711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::component_init(OMX_STRING cmp_name) 13811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 13911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 14011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 14111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("'%s', version date: %s", 14211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel cmp_name, 14311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_VERSION_DATE); 14411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 14511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_swvdec_log_init(); 14611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 14711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 14811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char property_value[PROPERTY_VALUE_MAX] = {0}; 14911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 15011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (property_get("omx_swvdec.meta_buffer.disable", 15111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_value, 15211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel NULL)) 15311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 15411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_meta_buffer_mode_disabled = (bool) atoi(property_value); 15511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 15611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_LOW("omx_swvdec.meta_buffer.disable: %d", 15711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_meta_buffer_mode_disabled ? 1 : 0); 15811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 15911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 16011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 16111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state != OMX_StateInvalid) 16211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 16311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("disallowed in state %s", 16411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_STATETYPE_STRING(m_state)); 16511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 16611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorIncorrectStateOperation; 16711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto component_init_exit; 16811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 16911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 17011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp(cmp_name, 17111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX.qti.video.decoder.mpeg4sw", 17211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) 17311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 17411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_LOW("'video_decoder.mpeg4'"); 17511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 17611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy(m_cmp_name, cmp_name, OMX_MAX_STRINGNAME_SIZE); 17711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy(m_role_name, "video_decoder.mpeg4", OMX_MAX_STRINGNAME_SIZE); 17811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 17911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_swvdec_codec = SWVDEC_CODEC_MPEG4; 18011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_omx_video_codingtype = OMX_VIDEO_CodingMPEG4; 18111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 18211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (!strncmp(cmp_name, 18311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX.qti.video.decoder.h263sw", 18411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) 18511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 18611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_LOW("video_decoder.h263"); 18711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 18811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy(m_cmp_name, cmp_name, OMX_MAX_STRINGNAME_SIZE); 18911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy(m_role_name, "video_decoder.h263", OMX_MAX_STRINGNAME_SIZE); 19011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 19111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_swvdec_codec = SWVDEC_CODEC_H263; 19211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_omx_video_codingtype = OMX_VIDEO_CodingH263; 19311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 19411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (((!strncmp(cmp_name, 19511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX.qti.video.decoder.divxsw", 19611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE))) || 19711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((!strncmp(cmp_name, 19811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX.qti.video.decoder.divx4sw", 19911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)))) 20011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 20111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_LOW("video_decoder.divx"); 20211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 20311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy(m_cmp_name, cmp_name, OMX_MAX_STRINGNAME_SIZE); 20411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy(m_role_name, "video_decoder.divx", OMX_MAX_STRINGNAME_SIZE); 20511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 20611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_swvdec_codec = SWVDEC_CODEC_MPEG4; 20711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_omx_video_codingtype = ((OMX_VIDEO_CODINGTYPE) QOMX_VIDEO_CodingDivx); 20811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 20911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 21011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 21111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("'%s': invalid component name", cmp_name); 21211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 21311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInvalidComponentName; 21411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto component_init_exit; 21511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 21611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 21711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 21811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_CALLBACK callback; 21911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 22011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS retval_swvdec; 22111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 22211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel callback.pfn_empty_buffer_done = swvdec_empty_buffer_done_callback; 22311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel callback.pfn_fill_buffer_done = swvdec_fill_buffer_done_callback; 22411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel callback.pfn_event_notification = swvdec_event_handler_callback; 22511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel callback.p_client = this; 22611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 22711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval_swvdec = swvdec_init(&m_swvdec_handle, 22811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_swvdec_codec, 22911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &callback)) != 23011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS_SUCCESS) 23111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 23211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = retval_swvdec2omx(retval_swvdec); 23311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto component_init_exit; 23411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 23511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 23611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_swvdec_created = true; 23711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 23811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval = set_frame_dimensions(DEFAULT_FRAME_WIDTH, 23911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEFAULT_FRAME_HEIGHT)) != 24011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ErrorNone) 24111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 24211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto component_init_exit; 24311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 24411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 24511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_omx_color_formattype = 24611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((OMX_COLOR_FORMATTYPE) 24711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_COLOR_FormatYUV420PackedSemiPlanar32m); 24811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 24911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval = set_frame_attributes(m_omx_color_formattype)) != 25011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ErrorNone) 25111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 25211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto component_init_exit; 25311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 25411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 25511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 25611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval = get_buffer_requirements_swvdec(OMX_CORE_PORT_INDEX_IP)) != 25711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ErrorNone) 25811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 25911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto component_init_exit; 26011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 26111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 26211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval = get_buffer_requirements_swvdec(OMX_CORE_PORT_INDEX_OP)) != 26311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ErrorNone) 26411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 26511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto component_init_exit; 26611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 26711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 26811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval = async_thread_create()) != OMX_ErrorNone) 26911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 27011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto component_init_exit; 27111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 27211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 27311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (sem_init(&m_sem_cmd, 0, 0)) 27411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 27511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("failed to create command processing semaphore"); 27611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 27711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInsufficientResources; 27811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto component_init_exit; 27911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 28011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 28111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pthread_mutex_init(&m_meta_buffer_array_mutex, NULL)) 28211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 28311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("failed to create meta buffer info array mutex"); 28411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 28511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInsufficientResources; 28611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto component_init_exit; 28711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 28811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 28911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("OMX_StateInvalid -> OMX_StateLoaded"); 29011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 29111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state = OMX_StateLoaded; 29211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 29311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelcomponent_init_exit: 29411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 29511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 29611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 29711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 29811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief De-initialize component. 29911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 30011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] cmp_handle: Component handle. 30111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 30211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 30311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 30411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::component_deinit(OMX_HANDLETYPE cmp_handle) 30511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 30611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API(""); 30711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 30811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (cmp_handle == NULL) 30911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 31011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL"); 31111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 31211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 31311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_destroy(&m_meta_buffer_array_mutex); 31411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 31511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_destroy(&m_sem_cmd); 31611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 31711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_thread_destroy(); 31811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 31911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_swvdec_created) 32011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 32111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel swvdec_deinit(m_swvdec_handle); 32211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 32311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_swvdec_handle = NULL; 32411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 32511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 32611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("all done, goodbye!"); 32711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 32811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 32911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 33011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 33111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 33211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Get component version. 33311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 33411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] cmp_handle: Component handle. 33511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] cmp_name: Component name string. 33611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in,out] p_cmp_version: Pointer to component version variable. 33711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in,out] p_spec_version: Pointer to OMX spec version variable. 33811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in,out] p_cmp_UUID: Pointer to component UUID variable. 33911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 34011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 34111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 34211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::get_component_version(OMX_HANDLETYPE cmp_handle, 34311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_STRING cmp_name, 34411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VERSIONTYPE *p_cmp_version, 34511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VERSIONTYPE *p_spec_version, 34611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_UUIDTYPE *p_cmp_UUID) 34711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 34811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 34911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 35011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) p_cmp_UUID; 35111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 35211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API(""); 35311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 35411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) 35511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 35611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("in invalid state"); 35711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 35811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInvalidState; 35911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 36011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (cmp_handle == NULL) 36111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 36211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL"); 36311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 36411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInvalidComponent; 36511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 36611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (strncmp(cmp_name, m_cmp_name, sizeof(m_cmp_name))) 36711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 36811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("'%s': invalid component name", cmp_name); 36911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 37011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInvalidComponentName; 37111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 37211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (p_cmp_version == NULL) 37311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 37411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("p_cmp_version = NULL"); 37511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 37611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 37711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 37811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (p_spec_version == NULL) 37911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 38011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("p_spec_version = NULL"); 38111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 38211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 38311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 38411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 38511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 38611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_spec_version->nVersion = OMX_SPEC_VERSION; 38711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 38811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 38911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelget_component_version_exit: 39011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 39111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 39211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 39311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 39411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Send command to component. 39511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 39611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] cmp_handle: Component handle. 39711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] cmd: Command. 39811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] param: Command parameter. 39911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_cmd_data: Pointer to command data. 40011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 40111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 40211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 40311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::send_command(OMX_HANDLETYPE cmp_handle, 40411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMMANDTYPE cmd, 40511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 param, 40611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PTR p_cmd_data) 40711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 40811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 40911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 41011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) p_cmd_data; // prevent warning for unused function argument 41111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 41211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) 41311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 41411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("in invalid state"); 41511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 41611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInvalidState; 41711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto send_command_exit; 41811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 41911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (cmp_handle == NULL) 42011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 42111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL"); 42211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 42311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInvalidComponent; 42411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto send_command_exit; 42511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 42611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 42711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (cmd) 42811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 42911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 43011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_CommandStateSet: 43111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 43211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("%s, %s", 43311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMMANDTYPE_STRING(cmd), 43411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_STATETYPE_STRING((OMX_STATETYPE) param)); 43511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 43611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 43711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 43811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_CommandFlush: 43911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_CommandPortDisable: 44011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_CommandPortEnable: 44111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 44211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("%s, port index %d", 44311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMMANDTYPE_STRING(cmd), 44411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel param); 44511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 44611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((param != OMX_CORE_PORT_INDEX_IP) && 44711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (param != OMX_CORE_PORT_INDEX_OP) && 44811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (param != OMX_ALL)) 44911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 45011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", param); 45111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 45211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadPortIndex; 45311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 45411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 45511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 45611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 45711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 45811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 45911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 46011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("cmd %d, param %d", cmd, param); 46111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 46211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("cmd '%d' invalid", cmd); 46311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 46411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 46511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 46611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 46711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 46811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } // switch (cmd) 46911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 47011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (retval == OMX_ErrorNone) 47111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 47211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (cmp_handle == NULL) 47311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 47411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL"); 47511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 47611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInvalidComponent; 47711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 47811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_state == OMX_StateInvalid) 47911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 48011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("in invalid state"); 48111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 48211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInvalidState; 48311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 48411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 48511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 48611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (retval != OMX_ErrorNone) 48711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 48811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_post_event(OMX_SWVDEC_EVENT_ERROR, retval, 0); 48911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 49011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 49111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 49211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_post_event(OMX_SWVDEC_EVENT_CMD, cmd, param); 49311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 49411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_wait(&m_sem_cmd); 49511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 49611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 49711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelsend_command_exit: 49811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 49911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 50011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 50111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 50211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Get a parameter from component. 50311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 50411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] cmp_handle: Component handle. 50511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] param_index: Parameter index. 50611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in,out] p_param_data: Pointer to parameter data. 50711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 50811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 50911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 51011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::get_parameter(OMX_HANDLETYPE cmp_handle, 51111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INDEXTYPE param_index, 51211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PTR p_param_data) 51311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 51411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 51511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 51611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) 51711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 51811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("in invalid state"); 51911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 52011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInvalidState; 52111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 52211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (cmp_handle == NULL) 52311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 52411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL"); 52511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 52611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInvalidComponent; 52711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 52811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (p_param_data == NULL) 52911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 53011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("p_param_data = NULL"); 53111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 53211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 53311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 53411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 53511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (retval != OMX_ErrorNone) 53611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 53711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto get_parameter_exit; 53811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 53911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 54011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (param_index) 54111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 54211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 54311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamAudioInit: 54411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 54511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PORT_PARAM_TYPE *p_port_param = 54611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_PORT_PARAM_TYPE *) p_param_data; 54711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 54811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_param->nPorts = 0; 54911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_param->nStartPortNumber = 0; 55011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 55111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("OMX_IndexParamAudioInit: " 55211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "%d port(s), start port index %d", 55311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_param->nPorts, 55411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_param->nStartPortNumber); 55511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 55611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 55711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 55811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamImageInit: 55911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 56011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PORT_PARAM_TYPE *p_port_param = 56111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_PORT_PARAM_TYPE *) p_param_data; 56211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 56311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_param->nPorts = 0; 56411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_param->nStartPortNumber = 0; 56511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 56611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("OMX_IndexParamImageInit: " 56711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "%d port(s), start port index %d", 56811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_param->nPorts, 56911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_param->nStartPortNumber); 57011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 57111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 57211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 57311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoInit: 57411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 57511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PORT_PARAM_TYPE *p_port_param = 57611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_PORT_PARAM_TYPE *) p_param_data; 57711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 57811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_param->nPorts = 2; 57911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_param->nStartPortNumber = 0; 58011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 58111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("OMX_IndexParamVideoInit: " 58211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "%d port(s), start port index %d", 58311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_param->nPorts, 58411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_param->nStartPortNumber); 58511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 58611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 58711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 58811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamOtherInit: 58911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 59011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PORT_PARAM_TYPE *p_port_param = 59111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_PORT_PARAM_TYPE *) p_param_data; 59211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 59311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_param->nPorts = 0; 59411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_param->nStartPortNumber = 0; 59511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 59611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("OMX_IndexParamOtherInit: " 59711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "%d port(s), start port index %d", 59811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_param->nPorts, 59911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_param->nStartPortNumber); 60011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 60111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 60211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 60311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexConfigPriorityMgmt: 60411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 60511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PRIORITYMGMTTYPE *p_prio_mgmt = 60611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_PRIORITYMGMTTYPE *) p_param_data; 60711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 60811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("OMX_IndexConfigPriorityMgmt"); 60911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 61011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(p_prio_mgmt, &m_prio_mgmt, sizeof(OMX_PRIORITYMGMTTYPE)); 61111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 61211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 61311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 61411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamStandardComponentRole: 61511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 61611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_COMPONENTROLETYPE *p_cmp_role = 61711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_PARAM_COMPONENTROLETYPE *) p_param_data; 61811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 61911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel strlcpy((char *) p_cmp_role->cRole, 62011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_role_name, 62111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE); 62211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 62311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("OMX_IndexParamStandardComponentRole: %s", 62411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_cmp_role->cRole); 62511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 62611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 62711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 62811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamPortDefinition: 62911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 63011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_PORTDEFINITIONTYPE *p_port_def = 63111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_PARAM_PORTDEFINITIONTYPE *) p_param_data; 63211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 63311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("OMX_IndexParamPortDefinition, port index %d", 63411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->nPortIndex); 63511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 63611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = get_port_definition(p_port_def); 63711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 63811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 63911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 64011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamCompBufferSupplier: 64111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 64211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_BUFFERSUPPLIERTYPE *p_buffer_supplier = 64311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_PARAM_BUFFERSUPPLIERTYPE *) p_param_data; 64411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 64511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("OMX_IndexParamCompBufferSupplier, port index %d", 64611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_supplier->nPortIndex); 64711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 64811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((p_buffer_supplier->nPortIndex == OMX_CORE_PORT_INDEX_IP) || 64911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (p_buffer_supplier->nPortIndex == OMX_CORE_PORT_INDEX_OP)) 65011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 65111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_supplier->eBufferSupplier = OMX_BufferSupplyUnspecified; 65211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 65311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 65411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 65511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", 65611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_supplier->nPortIndex); 65711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 65811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadPortIndex; 65911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 66011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 66111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 66211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 66311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 66411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoPortFormat: 66511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 66611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_PORTFORMATTYPE *p_port_format = 66711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_VIDEO_PARAM_PORTFORMATTYPE *) p_param_data; 66811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 66911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("OMX_IndexParamVideoPortFormat, " 67011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "port index %d, index %d", 67111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_format->nPortIndex, 67211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_format->nIndex); 67311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 67411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = get_video_port_format(p_port_format); 67511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 67611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 67711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 67811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoMpeg2: 67911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 68011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("OMX_IndexParamVideoMpeg2: unsupported"); 68111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 68211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorUnsupportedIndex; 68311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 68411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 68511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 68611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoMpeg4: 68711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 68811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("OMX_IndexParamVideoMpeg4: unsupported"); 68911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 69011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorUnsupportedIndex; 69111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 69211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 69311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 69411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoAvc: 69511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 69611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("OMX_IndexParamVideoAvc: unsupported"); 69711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 69811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorUnsupportedIndex; 69911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 70011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 70111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 70211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoH263: 70311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 70411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("OMX_IndexParamVideoH263: unsupported"); 70511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 70611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorUnsupportedIndex; 70711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 70811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 70911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 71011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoProfileLevelQuerySupported: 71111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 71211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_PROFILELEVELTYPE *p_profilelevel = 71311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_VIDEO_PARAM_PROFILELEVELTYPE *) p_param_data; 71411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 71511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("OMX_IndexParamVideoProfileLevelQuerySupported, " 71611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "port index %d, profile index %d", 71711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_profilelevel->nPortIndex, 71811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_profilelevel->nProfileIndex); 71911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 72011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = get_supported_profilelevel(p_profilelevel); 72111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 72211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 72311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 72411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 72511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 72611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /** 72711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Vendor-specific extension indices checked here since they are not 72811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * part of the OMX_INDEXTYPE enumerated type. 72911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 73011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 73111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch ((OMX_QCOM_EXTN_INDEXTYPE) param_index) 73211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 73311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 73411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage: 73511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 73611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel GetAndroidNativeBufferUsageParams *p_buffer_usage = 73711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (GetAndroidNativeBufferUsageParams *) p_param_data; 73811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 73911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API( 74011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage, " 74111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "port index %d", p_buffer_usage->nPortIndex); 74211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 74311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_buffer_usage->nPortIndex == OMX_CORE_PORT_INDEX_OP) 74411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 74511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_usage->nUsage = (GRALLOC_USAGE_PRIVATE_IOMMU_HEAP | 74611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel GRALLOC_USAGE_SW_READ_OFTEN | 74711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel GRALLOC_USAGE_SW_WRITE_OFTEN); 74811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 74911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 75011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 75111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", 75211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_usage->nPortIndex); 75311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 75411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadPortIndex; 75511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 75611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 75711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 75811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 75911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexFlexibleYUVDescription: 76011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 76111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("OMX_QcomIndexFlexibleYUVDescription"); 76211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 76311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = describe_color_format((DescribeColorFormatParams *) 76411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_param_data); 76511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 76611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 76711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 76811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 76911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 77011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("param index '0x%08x' invalid", 77111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_QCOM_EXTN_INDEXTYPE) param_index); 77211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 77311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 77411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 77511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 77611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 77711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } // switch ((OMX_QCOM_EXTN_INDEXTYPE) param_index) 77811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 77911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } // default case 78011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 78111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } // switch (param_index) 78211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 78311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelget_parameter_exit: 78411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 78511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 78611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 78711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 78811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Set a parameter to component. 78911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 79011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] cmp_handle: Component handle. 79111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] param_index: Parameter index. 79211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_param_data: Pointer to parameter data. 79311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 79411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 79511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 79611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::set_parameter(OMX_HANDLETYPE cmp_handle, 79711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INDEXTYPE param_index, 79811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PTR p_param_data) 79911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 80011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 80111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 80211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) 80311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 80411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("in invalid state"); 80511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 80611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInvalidState; 80711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 80811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (cmp_handle == NULL) 80911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 81011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL"); 81111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 81211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInvalidComponent; 81311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 81411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (p_param_data == NULL) 81511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 81611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("p_param_data = NULL"); 81711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 81811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 81911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 82011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if ((m_state != OMX_StateLoaded) && 82111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_port_reconfig_inprogress == false)) 82211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 82311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("disallowed in state %s", 82411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_STATETYPE_STRING(m_state)); 82511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 82611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorIncorrectStateOperation; 82711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 82811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 82911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (retval != OMX_ErrorNone) 83011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 83111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto set_parameter_exit; 83211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 83311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 83411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (param_index) 83511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 83611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 83711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamPriorityMgmt: 83811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 83911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PRIORITYMGMTTYPE *p_prio_mgmt = 84011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_PRIORITYMGMTTYPE *) p_param_data; 84111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 84211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("OMX_IndexConfigPriorityMgmt: " 84311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "group ID %d, group priority %d", 84411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_prio_mgmt->nGroupID, 84511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_prio_mgmt->nGroupPriority); 84611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 84711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state != OMX_StateLoaded) 84811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 84911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("'%d' state invalid; " 85011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "should be in loaded state", 85111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state); 85211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 85311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorIncorrectStateOperation; 85411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 85511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 85611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 85711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(&m_prio_mgmt, p_prio_mgmt, sizeof(OMX_PRIORITYMGMTTYPE)); 85811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 85911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 86011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 86111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 86211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 86311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamStandardComponentRole: 86411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 86511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_COMPONENTROLETYPE *p_cmp_role = 86611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_PARAM_COMPONENTROLETYPE *) p_param_data; 86711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 86811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("OMX_IndexParamStandardComponentRole '%s'", 86911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_cmp_role->cRole); 87011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 87111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state != OMX_StateLoaded) 87211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 87311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("'%d' state invalid; " 87411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "should be in loaded state", 87511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state); 87611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 87711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorIncorrectStateOperation; 87811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 87911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 88011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 88111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (strncmp((char *) p_cmp_role->cRole, 88211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_role_name, 88311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) 88411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 88511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("'%s': invalid component role name", 88611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_cmp_role->cRole); 88711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 88811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 88911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 89011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 89111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 89211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 89311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 89411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 89511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamPortDefinition: 89611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 89711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_PORTDEFINITIONTYPE *p_port_def = 89811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_PARAM_PORTDEFINITIONTYPE *) p_param_data; 89911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 90011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("OMX_IndexParamPortDefinition, port index %d", 90111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->nPortIndex); 90211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 90311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((m_state != OMX_StateLoaded) && 90411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (((p_port_def->nPortIndex == OMX_CORE_PORT_INDEX_IP) && 90511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_port_ip.enabled == OMX_TRUE) && 90611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_port_ip.populated == OMX_TRUE)) || 90711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((p_port_def->nPortIndex == OMX_CORE_PORT_INDEX_OP) && 90811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_port_op.enabled == OMX_TRUE) && 90911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_port_op.populated == OMX_TRUE)))) 91011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 91111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("OMX_IndexParamPortDefinition " 91211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "disallowed in state %s " 91311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "while port index %d is enabled & populated", 91411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_STATETYPE_STRING(m_state), 91511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->nPortIndex); 91611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 91711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorIncorrectStateOperation; 91811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 91911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 92011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 92111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = set_port_definition(p_port_def); 92211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 92311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 92411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 92511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 92611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 92711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamCompBufferSupplier: 92811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 92911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_BUFFERSUPPLIERTYPE *p_buffer_supplier = 93011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_PARAM_BUFFERSUPPLIERTYPE *) p_param_data; 93111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 93211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("OMX_IndexParamCompBufferSupplier: " 93311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "port index %d, buffer supplier %d", 93411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_supplier->nPortIndex, 93511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (int) p_buffer_supplier->eBufferSupplier); 93611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 93711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((p_buffer_supplier->nPortIndex != OMX_CORE_PORT_INDEX_IP) && 93811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (p_buffer_supplier->nPortIndex != OMX_CORE_PORT_INDEX_OP)) 93911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 94011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", 94111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_supplier->nPortIndex); 94211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 94311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadPortIndex; 94411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 94511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 94611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 94711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 94811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 94911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoPortFormat: 95011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 95111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_PORTFORMATTYPE *p_port_format = 95211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_VIDEO_PARAM_PORTFORMATTYPE *) p_param_data; 95311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 95411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("OMX_IndexParamVideoPortFormat, port index %d", 95511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_format->nPortIndex); 95611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 95711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((m_state != OMX_StateLoaded) && 95811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (((p_port_format->nPortIndex == OMX_CORE_PORT_INDEX_IP) && 95911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_port_ip.enabled == OMX_TRUE) && 96011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_port_ip.populated == OMX_TRUE)) || 96111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((p_port_format->nPortIndex == OMX_CORE_PORT_INDEX_OP) && 96211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_port_op.enabled == OMX_TRUE) && 96311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_port_op.populated == OMX_TRUE)))) 96411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 96511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("OMX_IndexParamVideoPortFormat " 96611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "disallowed in state %s " 96711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "while port index %d is enabled & populated", 96811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_STATETYPE_STRING(m_state), 96911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_format->nPortIndex); 97011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 97111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorIncorrectStateOperation; 97211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 97311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 97411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 97511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = set_video_port_format(p_port_format); 97611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 97711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 97811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 97911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 98011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 98111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoMpeg2: 98211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 98311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("OMX_IndexParamVideoMpeg2 unsupported"); 98411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 98511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorUnsupportedIndex; 98611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 98711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 98811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 98911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoMpeg4: 99011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 99111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("OMX_IndexParamVideoMpeg4 unsupported"); 99211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 99311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorUnsupportedIndex; 99411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 99511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 99611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 99711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoAvc: 99811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 99911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("OMX_IndexParamVideoAvc unsupported"); 100011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 100111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorUnsupportedIndex; 100211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 100311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 100411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 100511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoH263: 100611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 100711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("OMX_IndexParamVideoH263 unsupported"); 100811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 100911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorUnsupportedIndex; 101011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 101111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 101211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 101311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 101411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 101511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /** 101611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Vendor-specific extension indices checked here since they are not 101711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * part of the OMX_INDEXTYPE enumerated type. 101811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 101911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 102011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch ((OMX_QCOM_EXTN_INDEXTYPE) param_index) 102111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 102211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 102311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexPortDefn: 102411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 102511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PARAM_PORTDEFINITIONTYPE *p_port_def = 102611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) p_param_data; 102711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 102811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("OMX_QcomIndexPortDefn, port index %d", 102911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->nPortIndex); 103011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 103111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((m_state != OMX_StateLoaded) && 103211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (((p_port_def->nPortIndex == OMX_CORE_PORT_INDEX_IP) && 103311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_port_ip.enabled == OMX_TRUE) && 103411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_port_ip.populated == OMX_TRUE)) || 103511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((p_port_def->nPortIndex == OMX_CORE_PORT_INDEX_OP) && 103611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_port_op.enabled == OMX_TRUE) && 103711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_port_op.populated == OMX_TRUE)))) 103811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 103911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("OMX_QcomIndexPortDefn " 104011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "disallowed in state %s " 104111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "while port index %d " 104211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "is enabled & populated", 104311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_STATETYPE_STRING(m_state), 104411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->nPortIndex); 104511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 104611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorIncorrectStateOperation; 104711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 104811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 104911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 105011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = set_port_definition_qcom(p_port_def); 105111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 105211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 105311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 105411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 105511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 105611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamVideoDivx: 105711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 105811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("OMX_QcomIndexParamVideoDivx"); 105911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 106011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 106111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 106211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 106311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamVideoSyncFrameDecodingMode: 106411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 106511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("OMX_QcomIndexParamVideoSyncFrameDecodingMode"); 106611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 106711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sync_frame_decoding_mode = true; 106811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 106911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 107011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 107111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamVideoDecoderPictureOrder: 107211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 107311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_VIDEO_DECODER_PICTURE_ORDER *p_picture_order = 107411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (QOMX_VIDEO_DECODER_PICTURE_ORDER *) p_param_data; 107511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 107611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (p_picture_order->eOutputPictureOrder) 107711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 107811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 107911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case QOMX_VIDEO_DISPLAY_ORDER: 108011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 108111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API( 108211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX_QcomIndexParamVideoDecoderPictureOrder, " 108311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "QOMX_VIDEO_DISPLAY_ORDER"); 108411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 108511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 108611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 108711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 108811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case QOMX_VIDEO_DECODE_ORDER: 108911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 109011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API( 109111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX_QcomIndexParamVideoDecoderPictureOrder, " 109211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "QOMX_VIDEO_DECODE_ORDER"); 109311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 109411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR( 109511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX_QcomIndexParamVideoDecoderPictureOrder, " 109611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "QOMX_VIDEO_DECODE_ORDER; unsupported"); 109711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 109811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorUnsupportedSetting; 109911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 110011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 110111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 110211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 110311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 110411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR( 110511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX_QcomIndexParamVideoDecoderPictureOrder, %d; invalid", 110611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_picture_order->eOutputPictureOrder); 110711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 110811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 110911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 111011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 111111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 111211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 111311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 111411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 111511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 111611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 111711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers: 111811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 111911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API( 112011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX_GoogleAndroidIndexEnableAndroidNativeBuffers, %s", 112111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (((EnableAndroidNativeBuffersParams *) p_param_data)->enable ? 112211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "enable" : 112311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "disable")); 112411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 112511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_android_native_buffers = 112611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (bool) (((EnableAndroidNativeBuffersParams *) 112711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_param_data)->enable); 112811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 112911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 113011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 113111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 113211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_GoogleAndroidIndexUseAndroidNativeBuffer: 113311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 113411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("OMX_GoogleAndroidIndexUseAndroidNativeBuffer " 113511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "unsupported"); 113611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 113711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorUnsupportedIndex; 113811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 113911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 114011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 114111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamEnableTimeStampReorder: 114211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 114311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API( 114411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX_QcomIndexParamEnableTimeStampReorder, %s", 114511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (((QOMX_INDEXTIMESTAMPREORDER *) p_param_data)->bEnable ? 114611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "enable" : 114711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "disable")); 114811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 114911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 115011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 115111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 115211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamVideoMetaBufferMode: 115311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 115411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel StoreMetaDataInBuffersParams *p_meta_data = 115511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (StoreMetaDataInBuffersParams *) p_param_data; 115611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 115711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("OMX_QcomIndexParamVideoMetaBufferMode, " 115811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "port index %d, %s", 115911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_meta_data->nPortIndex, 116011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (p_meta_data->bStoreMetaData ? 116111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "enable" : 116211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "disable")); 116311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 116411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_meta_data->nPortIndex == OMX_CORE_PORT_INDEX_OP) 116511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 116611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_meta_data->bStoreMetaData && m_meta_buffer_mode_disabled) 116711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 116811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("meta buffer mode disabled " 116911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "via ADB setprop: " 117011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "'omx_swvdec.meta_buffer.disable'"); 117111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 117211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 117311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 117411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 117511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 117611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_meta_buffer_mode = (bool) p_meta_data->bStoreMetaData; 117711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 117811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 117911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 118011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 118111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", 118211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_meta_data->nPortIndex); 118311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 118411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadPortIndex; 118511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 118611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 118711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 118811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 118911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 119011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamVideoAdaptivePlaybackMode: 119111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 119211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PrepareForAdaptivePlaybackParams *p_adaptive_playback_params = 119311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (PrepareForAdaptivePlaybackParams *) p_param_data; 119411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 119511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("OMX_QcomIndexParamVideoAdaptivePlaybackMode, " 119611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "port index %d, %s, max dimensions: %d x %d", 119711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_adaptive_playback_params->nPortIndex, 119811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (p_adaptive_playback_params->bEnable ? 119911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "enable" : 120011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "disable"), 120111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_adaptive_playback_params->nMaxFrameWidth, 120211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_adaptive_playback_params->nMaxFrameHeight); 120311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 120411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_adaptive_playback_params->nPortIndex == 120511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_PORT_INDEX_OP) 120611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 120711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_adaptive_playback_params->bEnable) 120811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 120911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_adaptive_playback_mode = true; 121011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 121111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = 121211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel set_adaptive_playback( 121311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_adaptive_playback_params->nMaxFrameWidth, 121411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_adaptive_playback_params->nMaxFrameHeight); 121511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 121611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 121711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 121811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 121911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", 122011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_adaptive_playback_params->nPortIndex); 122111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 122211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadPortIndex; 122311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 122411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 122511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 122611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 122711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 122811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 122911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 123011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("param index '0x%08x' invalid", 123111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_QCOM_EXTN_INDEXTYPE) param_index); 123211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 123311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 123411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 123511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 123611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 123711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } // switch ((OMX_QCOM_EXTN_INDEXTYPE) param_index) 123811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 123911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 124011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } // default case 124111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 124211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } // switch (param_index) 124311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 124411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelset_parameter_exit: 124511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 124611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 124711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 124811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 124911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Get a configuration from component. 125011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 125111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] cmp_handle: Component handle. 125211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] config_index: Configuration index. 125311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_config_data: Pointer to configuration data. 125411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 125511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 125611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 125711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::get_config(OMX_HANDLETYPE cmp_handle, 125811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INDEXTYPE config_index, 125911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PTR p_config_data) 126011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 126111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 126211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 126311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) 126411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 126511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("in invalid state"); 126611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 126711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInvalidState; 126811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 126911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (cmp_handle == NULL) 127011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 127111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL"); 127211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 127311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInvalidComponent; 127411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 127511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (p_config_data == NULL) 127611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 127711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("p_config_data = NULL"); 127811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 127911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 128011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 128111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 128211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (retval != OMX_ErrorNone) 128311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 128411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto get_config_exit; 128511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 128611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 128711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (config_index) 128811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 128911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 129011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexConfigCommonOutputCrop: 129111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 129211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CONFIG_RECTTYPE *p_recttype = (OMX_CONFIG_RECTTYPE *) p_config_data; 129311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 129411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("OMX_IndexConfigCommonOutputCrop, port index %d", 129511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_recttype->nPortIndex); 129611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 129711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_recttype->nPortIndex == OMX_CORE_PORT_INDEX_OP) 129811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 129911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_dimensions_update_inprogress) 130011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 130111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = get_frame_dimensions_swvdec(); 130211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 130311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_dimensions_update_inprogress = false; 130411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 130511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 130611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (retval == OMX_ErrorNone) 130711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 130811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_recttype->nLeft = 0; 130911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_recttype->nTop = 0; 131011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_recttype->nWidth = m_frame_dimensions.width; 131111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_recttype->nHeight = m_frame_dimensions.height; 131211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 131311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 131411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 131511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 131611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", 131711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_recttype->nPortIndex); 131811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 131911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadPortIndex; 132011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 132111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 132211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 132311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 132411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 132511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 132611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 132711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch ((OMX_QCOM_EXTN_INDEXTYPE) config_index) 132811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 132911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 133011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexConfigInterlaced: 133111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 133211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_CONFIG_INTERLACETYPE *p_config_interlacetype = 133311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_QCOM_CONFIG_INTERLACETYPE *) p_config_data; 133411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 133511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("OMX_QcomIndexConfigInterlaced, " 133611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "port index %d, index %d", 133711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_config_interlacetype->nPortIndex, 133811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_config_interlacetype->nIndex); 133911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 134011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_config_interlacetype->nPortIndex == OMX_CORE_PORT_INDEX_OP) 134111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 134211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_config_interlacetype->nIndex == 0) 134311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 134411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_config_interlacetype->eInterlaceType = 134511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_InterlaceFrameProgressive; 134611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 134711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (p_config_interlacetype->nIndex == 1) 134811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 134911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_config_interlacetype->eInterlaceType = 135011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst; 135111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 135211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (p_config_interlacetype->nIndex == 2) 135311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 135411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_config_interlacetype->eInterlaceType = 135511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst; 135611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 135711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 135811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 135911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("index '%d' unsupported; " 136011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "no more interlaced types", 136111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_config_interlacetype->nIndex); 136211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 136311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorNoMore; 136411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 136511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 136611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 136711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 136811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", 136911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_config_interlacetype->nPortIndex); 137011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 137111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadPortIndex; 137211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 137311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 137411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 137511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 137611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 137711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexQueryNumberOfVideoDecInstance: 137811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 137911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_VIDEO_QUERY_DECODER_INSTANCES *p_decoder_instances = 138011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (QOMX_VIDEO_QUERY_DECODER_INSTANCES *) p_config_data; 138111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 138211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("OMX_QcomIndexQueryNumberOfVideoDecInstance"); 138311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 138411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_decoder_instances->nNumOfInstances = OMX_SWVDEC_NUM_INSTANCES; 138511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 138611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 138711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 138811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexConfigVideoFramePackingArrangement: 138911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 139011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API( 139111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX_QcomIndexConfigVideoFramePackingArrangement"); 139211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 139311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR( 139411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX_QcomIndexConfigVideoFramePackingArrangement unsupported"); 139511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 139611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorUnsupportedIndex; 139711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 139811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 139911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 140011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 140111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 140211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("config index '0x%08x' invalid", config_index); 140311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 140411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 140511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 140611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 140711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 140811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } // switch ((OMX_QCOM_EXTN_INDEXTYPE) config_index) 140911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 141011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 141111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 141211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 141311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } // switch (config_index) 141411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 141511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelget_config_exit: 141611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 141711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 141811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 141911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 142011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Set a configuration to component. 142111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 142211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 142311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 142411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::set_config(OMX_HANDLETYPE cmp_handle, 142511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INDEXTYPE config_index, 142611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PTR p_config_data) 142711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 142811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) cmp_handle; 142911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) p_config_data; 143011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 143111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("config index 0x%08x", config_index); 143211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 143311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("not implemented"); 143411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 143511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNotImplemented; 143611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 143711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 143811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 143911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Translate a vendor-specific extension string to a standard index type. 144011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 144111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] cmp_handle: Component handle. 144211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] param_name: Parameter name (extension string). 144311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in,out] p_index_type: Pointer to extension string's index type. 144411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 144511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 144611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 144711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::get_extension_index(OMX_HANDLETYPE cmp_handle, 144811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_STRING param_name, 144911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_INDEXTYPE *p_index_type) 145011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 145111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 145211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 145311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) 145411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 145511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("in invalid state"); 145611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 145711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInvalidState; 145811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 145911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (cmp_handle == NULL) 146011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 146111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL"); 146211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 146311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInvalidComponent; 146411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 146511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (p_index_type == NULL) 146611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 146711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("p_index_type = NULL"); 146811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 146911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 147011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 147111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 147211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (retval != OMX_ErrorNone) 147311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 147411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto get_extension_index_exit; 147511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 147611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 147711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("'%s'", param_name); 147811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 147911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp(param_name, 148011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX.QCOM.index.param.video.SyncFrameDecodingMode", 148111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) 148211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 148311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *p_index_type = 148411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_INDEXTYPE) OMX_QcomIndexParamVideoSyncFrameDecodingMode; 148511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 148611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (!strncmp(param_name, 148711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX.QCOM.index.param.IndexExtraData", 148811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) 148911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 149011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *p_index_type = (OMX_INDEXTYPE) OMX_QcomIndexParamIndexExtraDataType; 149111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 149211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (!strncmp(param_name, 149311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX.google.android.index.enableAndroidNativeBuffers", 149411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) 149511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 149611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *p_index_type = 149711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_INDEXTYPE) OMX_GoogleAndroidIndexEnableAndroidNativeBuffers; 149811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 149911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (!strncmp(param_name, 150011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX.google.android.index.useAndroidNativeBuffer2", 150111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) 150211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 150311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *p_index_type = 150411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_INDEXTYPE) OMX_GoogleAndroidIndexUseAndroidNativeBuffer2; 150511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 150611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (!strncmp(param_name, 150711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX.google.android.index.useAndroidNativeBuffer", 150811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) 150911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 151011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *p_index_type = 151111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_INDEXTYPE) OMX_GoogleAndroidIndexUseAndroidNativeBuffer; 151211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 151311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (!strncmp(param_name, 151411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX.google.android.index.getAndroidNativeBufferUsage", 151511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) 151611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 151711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *p_index_type = 151811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_INDEXTYPE) OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage; 151911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 152011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (!strncmp(param_name, 152111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX.google.android.index.storeMetaDataInBuffers", 152211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) 152311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 152411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *p_index_type = (OMX_INDEXTYPE) OMX_QcomIndexParamVideoMetaBufferMode; 152511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 152611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (!strncmp(param_name, 152711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX.google.android.index.describeColorFormat", 152811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) 152911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 153011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *p_index_type = (OMX_INDEXTYPE) OMX_QcomIndexFlexibleYUVDescription; 153111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 153211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (!strncmp(param_name, 153311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX.google.android.index.prepareForAdaptivePlayback", 153411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_MAX_STRINGNAME_SIZE)) 153511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 153611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *p_index_type = 153711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_INDEXTYPE) OMX_QcomIndexParamVideoAdaptivePlaybackMode; 153811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 153911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 154011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 154111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("'%s': not implemented", param_name); 154211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 154311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorNotImplemented; 154411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 154511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 154611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelget_extension_index_exit: 154711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 154811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 154911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 155011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 155111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Get component state. 155211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 155311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] cmp_handle: Component handle. 155411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in,out] p_state: Pointer to state variable. 155511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 155611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 155711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 155811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::get_state(OMX_HANDLETYPE cmp_handle, 155911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_STATETYPE *p_state) 156011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 156111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 156211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 156311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (cmp_handle == NULL) 156411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 156511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL"); 156611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 156711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInvalidComponent; 156811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 156911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 157011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 157111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("%s", OMX_STATETYPE_STRING(m_state)); 157211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 157311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *p_state = m_state; 157411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 157511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 157611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 157711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 157811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 157911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 158011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Component tunnel request. 158111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 158211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ErrorNotImplemented 158311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 158411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::component_tunnel_request( 158511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_HANDLETYPE cmp_handle, 158611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 port, 158711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_HANDLETYPE peer_component, 158811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 peer_port, 158911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_TUNNELSETUPTYPE *p_tunnel_setup) 159011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 159111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) cmp_handle; 159211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) port; 159311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) peer_component; 159411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) peer_port; 159511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) p_tunnel_setup; 159611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 159711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API(""); 159811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 159911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("not implemented"); 160011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 160111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNotImplemented; 160211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 160311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 160411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 160511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Use buffer. 160611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 160711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] cmp_handle: Component handle. 160811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in,out] pp_buffer_hdr: Pointer to pointer to buffer header type 160911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * structure. 161011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] port: Port index. 161111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_app_data: Pointer to IL client app data. 161211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] bytes: Size of buffer to be allocated in bytes. 161311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_buffer: Pointer to buffer to be used. 161411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 161511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 161611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 161711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::use_buffer(OMX_HANDLETYPE cmp_handle, 161811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE **pp_buffer_hdr, 161911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 port, 162011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PTR p_app_data, 162111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 bytes, 162211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 *p_buffer) 162311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 162411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 162511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 162611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) 162711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 162811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("in invalid state"); 162911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 163011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInvalidState; 163111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 163211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (cmp_handle == NULL) 163311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 163411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL"); 163511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 163611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInvalidComponent; 163711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 163811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (pp_buffer_hdr == NULL) 163911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 164011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("pp_buffer_hdr = NULL"); 164111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 164211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 164311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 164411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 164511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 164611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("port index %d, %p", port, p_buffer); 164711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 164811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (port == OMX_CORE_PORT_INDEX_OP) 164911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 165011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = buffer_use_op(pp_buffer_hdr, p_app_data, bytes, p_buffer); 165111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 165211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (retval == OMX_ErrorNone) 165311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 165411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS retval_swvdec; 165511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 165611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((m_status_flags & (1 << PENDING_STATE_LOADED_TO_IDLE)) && 165711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_port_ip.populated == OMX_TRUE) && 165811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_port_op.populated == OMX_TRUE)) 165911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 166011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval_swvdec = swvdec_start(m_swvdec_handle)) != 166111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS_SUCCESS) 166211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 166311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("failed to start SwVdec"); 166411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 166511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = retval_swvdec2omx(retval_swvdec); 166611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto use_buffer_exit; 166711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 166811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 166911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_status_flags &= ~(1 << PENDING_STATE_LOADED_TO_IDLE); 167011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 167111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_post_event(OMX_SWVDEC_EVENT_CMD_ACK, 167211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CommandStateSet, 167311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_StateIdle); 167411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 167511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 167611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((m_status_flags & (1 << PENDING_PORT_ENABLE_OP)) && 167711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_port_op.populated == OMX_TRUE)) 167811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 167911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_port_reconfig_inprogress) 168011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 168111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval_swvdec = swvdec_start(m_swvdec_handle)) != 168211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS_SUCCESS) 168311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 168411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("failed to start SwVdec"); 168511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 168611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = retval_swvdec2omx(retval_swvdec); 168711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 168811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 168911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 169011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_status_flags &= ~(1 << PENDING_PORT_ENABLE_OP); 169111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 169211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_post_event(OMX_SWVDEC_EVENT_CMD_ACK, 169311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CommandPortEnable, 169411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_PORT_INDEX_OP); 169511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 169611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 169711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 169811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 169911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 170011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", port); 170111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 170211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadPortIndex; 170311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 170411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 170511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 170611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudeluse_buffer_exit: 170711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 170811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 170911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 171011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 171111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Allocate new buffer & associated header. 171211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 171311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] cmp_handle: Component handle. 171411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in,out] pp_buffer_hdr: Pointer to pointer to buffer header type 171511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * structure. 171611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] port: Port index. 171711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_app_data: Pointer to IL client app data. 171811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] bytes: Size of buffer to be allocated in bytes. 171911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 172011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 172111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 172211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::allocate_buffer(OMX_HANDLETYPE cmp_handle, 172311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE **pp_buffer_hdr, 172411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 port, 172511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PTR p_app_data, 172611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 bytes) 172711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 172811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 172911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 173011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) 173111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 173211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("in invalid state"); 173311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 173411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInvalidState; 173511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 173611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (cmp_handle == NULL) 173711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 173811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL"); 173911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 174011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInvalidComponent; 174111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 174211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (pp_buffer_hdr == NULL) 174311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 174411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("pp_buffer_hdr = NULL"); 174511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 174611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 174711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 174811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 174911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 175011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("port index %d, %d bytes", port, bytes); 175111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 175211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (port == OMX_CORE_PORT_INDEX_IP) 175311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 175411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = buffer_allocate_ip(pp_buffer_hdr, 175511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_app_data, 175611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bytes); 175711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 175811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (port == OMX_CORE_PORT_INDEX_OP) 175911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 176011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_meta_buffer_mode == true) 176111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 176211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("'meta buffer mode' enabled"); 176311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 176411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 176511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 176611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_android_native_buffers == true) 176711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 176811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("'android native buffers' enabled"); 176911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 177011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 177111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 177211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 177311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 177411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = buffer_allocate_op(pp_buffer_hdr, 177511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_app_data, 177611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bytes); 177711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 177811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 177911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 178011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 178111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("port index %d invalid", port); 178211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 178311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadPortIndex; 178411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 178511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 178611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (retval == OMX_ErrorNone) 178711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 178811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS retval_swvdec; 178911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 179011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((m_status_flags & (1 << PENDING_STATE_LOADED_TO_IDLE)) && 179111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_port_ip.populated == OMX_TRUE) && 179211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_port_op.populated == OMX_TRUE)) 179311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 179411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval_swvdec = swvdec_start(m_swvdec_handle)) != 179511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS_SUCCESS) 179611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 179711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("failed to start SwVdec"); 179811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 179911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = retval_swvdec2omx(retval_swvdec); 180011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto allocate_buffer_exit; 180111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 180211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 180311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_status_flags &= ~(1 << PENDING_STATE_LOADED_TO_IDLE); 180411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 180511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_post_event(OMX_SWVDEC_EVENT_CMD_ACK, 180611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CommandStateSet, 180711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_StateIdle); 180811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 180911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 181011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((m_status_flags & (1 << PENDING_PORT_ENABLE_IP)) && 181111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_port_ip.populated == OMX_TRUE)) 181211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 181311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_status_flags &= ~(1 << PENDING_PORT_ENABLE_IP); 181411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 181511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_post_event(OMX_SWVDEC_EVENT_CMD_ACK, 181611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CommandPortEnable, 181711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_PORT_INDEX_IP); 181811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 181911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 182011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((m_status_flags & (1 << PENDING_PORT_ENABLE_OP)) && 182111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_port_op.populated == OMX_TRUE)) 182211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 182311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_port_reconfig_inprogress) 182411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 182511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval_swvdec = swvdec_start(m_swvdec_handle)) != 182611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS_SUCCESS) 182711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 182811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("failed to start SwVdec"); 182911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 183011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = retval_swvdec2omx(retval_swvdec); 183111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 183211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 183311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 183411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_status_flags &= ~(1 << PENDING_PORT_ENABLE_OP); 183511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 183611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_post_event(OMX_SWVDEC_EVENT_CMD_ACK, 183711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CommandPortEnable, 183811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_PORT_INDEX_OP); 183911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 184011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 184111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 184211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 184311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelallocate_buffer_exit: 184411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 184511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 184611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 184711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 184811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Release buffer & associated header. 184911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 185011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] cmp_handle: Component handle. 185111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] port: Port index. 185211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_buffer_hdr: Pointer to buffer's buffer header. 185311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 185411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 185511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 185611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::free_buffer(OMX_HANDLETYPE cmp_handle, 185711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 port, 185811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *p_buffer_hdr) 185911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 186011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 186111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 186211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (cmp_handle == NULL) 186311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 186411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL"); 186511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 186611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInvalidComponent; 186711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 186811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (p_buffer_hdr == NULL) 186911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 187011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("p_buffer_hdr = NULL"); 187111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 187211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 187311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 187411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if ((port != OMX_CORE_PORT_INDEX_IP) && 187511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (port != OMX_CORE_PORT_INDEX_OP)) 187611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 187711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", port); 187811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 187911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadPortIndex; 188011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 188111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_state != OMX_StateIdle) 188211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 188311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state != OMX_StateExecuting) 188411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 188511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("disallowed in state %s", 188611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_STATETYPE_STRING(m_state)); 188711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 188811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorIncorrectStateOperation; 188911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 189011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 189111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 189211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (((port == OMX_CORE_PORT_INDEX_IP) && m_port_ip.enabled) || 189311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((port == OMX_CORE_PORT_INDEX_OP) && m_port_op.enabled)) 189411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 189511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("port index %d not disabled", port); 189611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 189711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadPortIndex; 189811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 189911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 190011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 190111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 190211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (retval == OMX_ErrorNone) 190311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 190411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("port index %d, %p", port, p_buffer_hdr); 190511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 190611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (port == OMX_CORE_PORT_INDEX_IP) 190711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 190811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = buffer_deallocate_ip(p_buffer_hdr); 190911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 191011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 191111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 191211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = buffer_deallocate_op(p_buffer_hdr); 191311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 191411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 191511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 191611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval == OMX_ErrorNone) && 191711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_status_flags & (1 << PENDING_STATE_IDLE_TO_LOADED))) 191811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 191911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((m_port_ip.unpopulated == OMX_TRUE) && 192011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_port_op.unpopulated == OMX_TRUE)) 192111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 192211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS retval_swvdec; 192311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 192411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval_swvdec = swvdec_stop(m_swvdec_handle)) == 192511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS_SUCCESS) 192611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 192711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_status_flags &= ~(1 << PENDING_STATE_IDLE_TO_LOADED); 192811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 192911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_post_event(OMX_SWVDEC_EVENT_CMD_ACK, 193011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CommandStateSet, 193111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_StateLoaded); 193211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 193311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 193411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 193511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("failed to stop SwVdec"); 193611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 193711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = retval_swvdec2omx(retval_swvdec); 193811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 193911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 194011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 194111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 194211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval == OMX_ErrorNone) && 194311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_status_flags & (1 << PENDING_PORT_DISABLE_IP)) && 194411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.unpopulated) 194511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 194611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_status_flags &= ~(1 << PENDING_PORT_DISABLE_IP); 194711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 194811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_post_event(OMX_SWVDEC_EVENT_CMD_ACK, 194911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CommandPortDisable, 195011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_PORT_INDEX_IP); 195111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 195211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 195311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval == OMX_ErrorNone) && 195411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_status_flags & (1 << PENDING_PORT_DISABLE_OP)) && 195511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.unpopulated) 195611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 195711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_port_reconfig_inprogress) 195811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 195911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS retval_swvdec; 196011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 196111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval_swvdec = swvdec_stop(m_swvdec_handle)) != 196211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS_SUCCESS) 196311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 196411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("failed to stop SwVdec"); 196511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 196611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = retval_swvdec2omx(retval_swvdec); 196711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 196811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 196911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 197011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_status_flags &= ~(1 << PENDING_PORT_DISABLE_OP); 197111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 197211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_post_event(OMX_SWVDEC_EVENT_CMD_ACK, 197311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CommandPortDisable, 197411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_PORT_INDEX_OP); 197511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 197611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 197711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 197811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 197911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 198011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 198111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Send a buffer to component's input port to be emptied. 198211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 198311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] cmp_handle: Component handle. 198411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_buffer_hdr: Pointer to buffer's buffer header. 198511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 198611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 198711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 198811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::empty_this_buffer(OMX_HANDLETYPE cmp_handle, 198911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *p_buffer_hdr) 199011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 199111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 199211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 199311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int ii; 199411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 199511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) 199611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 199711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("in invalid state"); 199811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 199911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInvalidState; 200011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 200111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (cmp_handle == NULL) 200211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 200311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL"); 200411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 200511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInvalidComponent; 200611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 200711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (p_buffer_hdr == NULL) 200811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 200911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("p_buffer_hdr = NULL"); 201011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 201111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 201211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 201311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (p_buffer_hdr->pBuffer == NULL) 201411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 201511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("p_buffer_hdr->pBuffer = NULL"); 201611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 201711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 201811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 201911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (p_buffer_hdr->pInputPortPrivate == NULL) 202011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 202111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("p_buffer_hdr->pInputPortPrivate = NULL"); 202211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 202311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 202411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 202511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_port_ip.enabled == OMX_FALSE) 202611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 202711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("ip port disabled"); 202811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 202911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorIncorrectStateOperation; 203011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 203111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (p_buffer_hdr->nInputPortIndex != OMX_CORE_PORT_INDEX_IP) 203211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 203311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", 203411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->nInputPortIndex); 203511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 203611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadPortIndex; 203711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 203811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 203911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (retval != OMX_ErrorNone) 204011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 204111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto empty_this_buffer_exit; 204211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 204311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 204411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (ii = 0; ii < m_port_ip.def.nBufferCountActual; ii++) 204511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 204611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_buffer_hdr == &(m_buffer_array_ip[ii].buffer_header)) 204711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 204811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_LOW("ip buffer %p has index %d", 204911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->pBuffer, 205011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ii); 205111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 205211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 205311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 205411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 205511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ii == m_port_ip.def.nBufferCountActual) 205611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 205711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("ip buffer %p not found", 205811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->pBuffer); 205911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 206011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 206111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto empty_this_buffer_exit; 206211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 206311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 206411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("%p: buffer %p, flags 0x%08x, filled length %d, " 206511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "timestamp %lld", 206611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr, 206711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->pBuffer, 206811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->nFlags, 206911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->nFilledLen, 207011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->nTimeStamp); 207111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 207211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_post_event(OMX_SWVDEC_EVENT_ETB, 207311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned long) p_buffer_hdr, 207411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned long) ii); 207511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 207611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelempty_this_buffer_exit: 207711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 207811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 207911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 208011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 208111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Send a buffer to component's output port to be filled. 208211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 208311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] cmp_handle: Component handle. 208411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_buffer_hdr: Pointer to buffer's buffer header. 208511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 208611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 208711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 208811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::fill_this_buffer(OMX_HANDLETYPE cmp_handle, 208911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *p_buffer_hdr) 209011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 209111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 209211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 209311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int ii; 209411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 209511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_BUFFER *p_buffer_swvdec; 209611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 209711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) 209811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 209911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("in invalid state"); 210011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 210111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInvalidState; 210211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 210311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (cmp_handle == NULL) 210411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 210511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL"); 210611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 210711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInvalidComponent; 210811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 210911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (p_buffer_hdr == NULL) 211011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 211111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("p_buffer_hdr = NULL"); 211211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 211311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 211411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 211511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (p_buffer_hdr->pBuffer == NULL) 211611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 211711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("p_buffer_hdr->pBuffer = NULL"); 211811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 211911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 212011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 212111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (p_buffer_hdr->pOutputPortPrivate == NULL) 212211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 212311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("p_buffer_hdr->pOutputPortPrivate = NULL"); 212411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 212511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 212611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 212711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_port_op.enabled == OMX_FALSE) 212811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 212911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("op port disabled"); 213011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 213111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorIncorrectStateOperation; 213211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 213311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (p_buffer_hdr->nOutputPortIndex != OMX_CORE_PORT_INDEX_OP) 213411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 213511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", 213611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->nOutputPortIndex); 213711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 213811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadPortIndex; 213911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 214011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 214111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (retval != OMX_ErrorNone) 214211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 214311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto fill_this_buffer_exit; 214411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 214511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 214611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("%p", p_buffer_hdr); 214711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 214811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (ii = 0; ii < m_port_op.def.nBufferCountActual; ii++) 214911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 215011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_buffer_hdr == &(m_buffer_array_op[ii].buffer_header)) 215111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 215211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_LOW("op buffer %p has index %d", 215311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->pBuffer, 215411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ii); 215511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 215611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 215711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 215811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 215911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ii == m_port_op.def.nBufferCountActual) 216011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 216111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("op buffer %p not found", 216211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->pBuffer); 216311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 216411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 216511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto fill_this_buffer_exit; 216611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 216711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 216811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_swvdec = &m_buffer_array_op[ii].buffer_swvdec; 216911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 217011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_meta_buffer_mode) 217111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 217211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct VideoDecoderOutputMetaData *p_meta_data; 217311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 217411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel private_handle_t *p_private_handle; 217511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 217611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_bufferpayload *p_buffer_payload; 217711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 217811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_meta_data = 217911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (struct VideoDecoderOutputMetaData *) p_buffer_hdr->pBuffer; 218011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 218111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_private_handle = (private_handle_t *) (p_meta_data->pHandle); 218211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 218311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_payload = &m_buffer_array_op[ii].buffer_payload; 218411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 218511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_private_handle == NULL) 218611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 218711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR( 218811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "p_buffer_hdr->pBuffer->pHandle = NULL"); 218911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 219011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 219111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto fill_this_buffer_exit; 219211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 219311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 219411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&m_meta_buffer_array_mutex); 219511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 219611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_meta_buffer_array[ii].ref_count == 0) 219711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 219811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned char *bufferaddr; 219911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 220011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufferaddr = (unsigned char *) mmap(NULL, 220111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.def.nBufferSize, 220211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PROT_READ | PROT_WRITE, 220311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel MAP_SHARED, 220411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_private_handle->fd, 220511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 0); 220611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 220711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bufferaddr == MAP_FAILED) 220811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 220911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("mmap() failed for " 221011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "fd %d of size %d", 221111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_private_handle->fd, 221211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.def.nBufferSize); 221311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 221411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&m_meta_buffer_array_mutex); 221511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 221611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInsufficientResources; 221711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto fill_this_buffer_exit; 221811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 221911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 222011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_payload->bufferaddr = bufferaddr; 222111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_payload->pmem_fd = p_private_handle->fd; 222211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_payload->buffer_len = m_port_op.def.nBufferSize; 222311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_payload->mmaped_size = m_port_op.def.nBufferSize; 222411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 222511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_swvdec->p_buffer = bufferaddr; 222611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_swvdec->size = m_port_op.def.nBufferSize; 222711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_swvdec->p_client_data = (void *) ((unsigned long) ii); 222811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 222911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 223011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel meta_buffer_ref_add(ii, p_buffer_payload->pmem_fd); 223111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 223211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&m_meta_buffer_array_mutex); 223311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 223411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 223511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_LOW("%p: buffer %p", 223611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr, 223711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_swvdec->p_buffer); 223811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 223911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_post_event(OMX_SWVDEC_EVENT_FTB, 224011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned long) p_buffer_hdr, 224111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned long) ii); 224211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 224311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelfill_this_buffer_exit: 224411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 224511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 224611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 224711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 224811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Set component's callback structure. 224911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 225011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] cmp_handle: Component handle. 225111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_callbacks: Pointer to callback structure. 225211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_app_data: Pointer to IL client app data. 225311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 225411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 225511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 225611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::set_callbacks(OMX_HANDLETYPE cmp_handle, 225711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CALLBACKTYPE *p_callbacks, 225811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PTR p_app_data) 225911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 226011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 226111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 226211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API(""); 226311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 226411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) 226511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 226611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("in invalid state"); 226711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 226811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInvalidState; 226911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 227011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (cmp_handle == NULL) 227111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 227211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL"); 227311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 227411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInvalidComponent; 227511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 227611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (p_callbacks->EventHandler == NULL) 227711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 227811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("p_callbacks->EventHandler = NULL"); 227911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 228011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 228111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 228211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (p_callbacks->EmptyBufferDone == NULL) 228311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 228411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("p_callbacks->EmptyBufferDone = NULL"); 228511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 228611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 228711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 228811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (p_callbacks->FillBufferDone == NULL) 228911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 229011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("p_callbacks->FillBufferDone = NULL"); 229111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 229211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 229311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 229411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 229511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 229611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_callback = *p_callbacks; 229711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_app_data = p_app_data; 229811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 229911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 230011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 230111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 230211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 230311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 230411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Use EGL image. 230511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 230611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ErrorNotImplemented 230711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 230811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::use_EGL_image(OMX_HANDLETYPE cmp_handle, 230911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE **pp_buffer_hdr, 231011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 port, 231111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PTR p_app_data, 231211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel void *egl_image) 231311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 231411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) cmp_handle; 231511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) pp_buffer_hdr; 231611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) port; 231711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) p_app_data; 231811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) egl_image; 231911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 232011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API(""); 232111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 232211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("not implemented"); 232311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 232411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNotImplemented; 232511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 232611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 232711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 232811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Enumerate component role. 232911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 233011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] cmp_handle: Component handle. 233111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in,out] p_role: Pointer to component role string. 233211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] index: Role index being queried. 233311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 233411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 233511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 233611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::component_role_enum(OMX_HANDLETYPE cmp_handle, 233711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 *p_role, 233811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 index) 233911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 234011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 234111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 234211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) 234311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 234411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("in invalid state"); 234511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 234611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInvalidState; 234711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 234811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (cmp_handle == NULL) 234911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 235011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL"); 235111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 235211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInvalidComponent; 235311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 235411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (index > 0) 235511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 235611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("index '%d' unsupported; no more roles", index); 235711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 235811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorNoMore; 235911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 236011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 236111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 236211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(p_role, m_role_name, OMX_MAX_STRINGNAME_SIZE); 236311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 236411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_API("index '%d': '%s'", index, p_role); 236511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 236611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 236711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 236811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 236911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 237011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 237111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * ------------------------- 237211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * SwVdec callback functions 237311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * ------------------------- 237411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 237511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 237611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 237711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief SwVdec empty buffer done callback. 237811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 237911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] swvdec_handle: SwVdec handle. 238011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_buffer_ip: Pointer to input buffer structure. 238111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_client_handle: Pointer to SwVdec's client handle. 238211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 238311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval SWVDEC_STATUS_SUCCESS 238411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval SWVDEC_STATUS_NULL_POINTER 238511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval SWVDEC_STATUS_INVALID_PARAMETERS 238611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 238711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelSWVDEC_STATUS omx_swvdec::swvdec_empty_buffer_done_callback( 238811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_HANDLE swvdec_handle, 238911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_BUFFER *p_buffer_ip, 239011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel void *p_client_handle) 239111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 239211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS retval = SWVDEC_STATUS_SUCCESS; 239311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 239411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_buffer_ip == NULL) 239511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 239611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("p_buffer_ip = NULL"); 239711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 239811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = SWVDEC_STATUS_NULL_POINTER; 239911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 240011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (p_client_handle == NULL) 240111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 240211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("p_client_handle = NULL"); 240311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 240411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = SWVDEC_STATUS_NULL_POINTER; 240511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 240611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 240711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 240811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_swvdec *p_omx_swvdec = (omx_swvdec *) p_client_handle; 240911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 241011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (swvdec_handle != p_omx_swvdec->m_swvdec_handle) 241111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 241211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("invalid SwVdec handle"); 241311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 241411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = SWVDEC_STATUS_INVALID_PARAMETERS; 241511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 241611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 241711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 241811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_omx_swvdec->swvdec_empty_buffer_done(p_buffer_ip); 241911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 242011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 242111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 242211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 242311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 242411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 242511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 242611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief SwVdec fill buffer done callback. 242711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 242811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] swvdec_handle: SwVdec handle. 242911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_buffer_op: Pointer to output buffer structure. 243011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_client_handle: Pointer to SwVdec's client handle. 243111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 243211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval SWVDEC_STATUS_SUCCESS 243311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval SWVDEC_STATUS_NULL_POINTER 243411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval SWVDEC_STATUS_INVALID_PARAMETERS 243511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 243611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelSWVDEC_STATUS omx_swvdec::swvdec_fill_buffer_done_callback( 243711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_HANDLE swvdec_handle, 243811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_BUFFER *p_buffer_op, 243911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel void *p_client_handle) 244011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 244111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS retval = SWVDEC_STATUS_SUCCESS; 244211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 244311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_buffer_op == NULL) 244411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 244511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("p_buffer_op = NULL"); 244611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 244711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = SWVDEC_STATUS_NULL_POINTER; 244811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 244911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (p_client_handle == NULL) 245011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 245111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("p_client_handle = NULL"); 245211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 245311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = SWVDEC_STATUS_NULL_POINTER; 245411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 245511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 245611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 245711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_swvdec *p_omx_swvdec = (omx_swvdec *) p_client_handle; 245811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 245911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (swvdec_handle != p_omx_swvdec->m_swvdec_handle) 246011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 246111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("invalid SwVdec handle"); 246211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 246311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = SWVDEC_STATUS_INVALID_PARAMETERS; 246411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 246511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 246611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 246711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_omx_swvdec->swvdec_fill_buffer_done(p_buffer_op); 246811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 246911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 247011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 247111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 247211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 247311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 247411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 247511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief SwVdec event handler callback. 247611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 247711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] swvdec_handle: SwVdec handle. 247811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] event: Event. 247911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_data: Pointer to event-specific data. 248011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_client_handle: Pointer to SwVdec's client handle. 248111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 248211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval SWVDEC_STATUS_SUCCESS 248311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval SWVDEC_STATUS_NULL_POINTER 248411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval SWVDEC_STATUS_INVALID_PARAMETERS 248511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 248611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelSWVDEC_STATUS omx_swvdec::swvdec_event_handler_callback( 248711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_HANDLE swvdec_handle, 248811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_EVENT event, 248911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel void *p_data, 249011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel void *p_client_handle) 249111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 249211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS retval = SWVDEC_STATUS_SUCCESS; 249311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 249411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((event == SWVDEC_EVENT_RELEASE_REFERENCE) && (p_data == NULL)) 249511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 249611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("p_data = NULL"); 249711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 249811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = SWVDEC_STATUS_NULL_POINTER; 249911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 250011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (p_client_handle == NULL) 250111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 250211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("p_client_handle = NULL"); 250311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 250411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = SWVDEC_STATUS_NULL_POINTER; 250511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 250611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 250711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 250811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_swvdec *p_omx_swvdec = (omx_swvdec *) p_client_handle; 250911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 251011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (swvdec_handle != p_omx_swvdec->m_swvdec_handle) 251111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 251211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("invalid SwVdec handle"); 251311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 251411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = SWVDEC_STATUS_INVALID_PARAMETERS; 251511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 251611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 251711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 251811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_omx_swvdec->swvdec_event_handler(event, p_data); 251911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 252011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 252111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 252211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 252311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 252411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 252511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 252611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * ----------------- 252711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * PRIVATE FUNCTIONS 252811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * ----------------- 252911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 253011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 253111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 253211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Set frame dimensions for OMX component & SwVdec core. 253311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 253411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] width: Frame width. 253511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] height: Frame height. 253611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 253711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 253811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 253911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::set_frame_dimensions(unsigned int width, 254011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int height) 254111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 254211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval; 254311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 254411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_dimensions.width = width; 254511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_dimensions.height = height; 254611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 254711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("%d x %d", 254811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_dimensions.width, 254911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_dimensions.height); 255011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 255111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = set_frame_dimensions_swvdec(); 255211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 255311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 255411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 255511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 255611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 255711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Set frame attributes for OMX component & SwVdec core, based on 255811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * frame dimensions & color format. 255911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 256011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] color_format: Color format. 256111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 256211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 256311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 256411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::set_frame_attributes( 256511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COLOR_FORMATTYPE color_format) 256611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 256711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 256811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 256911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int width = m_frame_dimensions.width; 257011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int height = m_frame_dimensions.height; 257111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 257211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int scanlines_uv; 257311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 257411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int plane_size_y; 257511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int plane_size_uv; 257611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 257711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (color_format) 257811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 257911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 258011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QCOM_COLOR_FormatYUV420PackedSemiPlanar32m: 258111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 258211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /** 258311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * alignment factors: 258411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 258511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * - stride: 128 258611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * - scanlines_y: 32 258711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * - scanlines_uv: 16 258811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * - size: 4096 258911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 259011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 259111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_attributes.stride = ALIGN(width, 128); 259211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_attributes.scanlines = ALIGN(height, 32); 259311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 259411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel scanlines_uv = ALIGN(height / 2, 16); 259511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 259611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane_size_y = (m_frame_attributes.stride * 259711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_attributes.scanlines); 259811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 259911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane_size_uv = m_frame_attributes.stride * scanlines_uv; 260011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 260111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_attributes.size = ALIGN(plane_size_y + plane_size_uv, 4096); 260211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 260311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("'OMX_QCOM_COLOR_FormatYUV420PackedSemiPlanar32m': " 260411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "stride %d, scanlines %d, size %d", 260511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_attributes.stride, 260611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_attributes.scanlines, 260711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_attributes.size); 260811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 260911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 261011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 261111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 261211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COLOR_FormatYUV420SemiPlanar: 261311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 261411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /** 261511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * alignment factors: 261611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 261711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * - stride: 16 261811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * - scanlines_y: 16 261911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * - scanlines_uv: 16 262011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * - size: 4096 262111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 262211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 262311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_attributes.stride = ALIGN(width, 16); 262411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_attributes.scanlines = ALIGN(height, 16); 262511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 262611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel scanlines_uv = ALIGN(height / 2, 16); 262711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 262811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane_size_y = (m_frame_attributes.stride * 262911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_attributes.scanlines); 263011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 263111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane_size_uv = m_frame_attributes.stride * scanlines_uv; 263211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 263311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_attributes.size = ALIGN(plane_size_y + plane_size_uv, 4096); 263411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 263511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("'OMX_COLOR_FormatYUV420SemiPlanar': " 263611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "stride %d, scanlines %d, size %d", 263711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_attributes.stride, 263811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_attributes.scanlines, 263911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_attributes.size); 264011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 264111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 264211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 264311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 264411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 264511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 264611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("'0x%08x' color format invalid or unsupported", 264711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel color_format); 264811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 264911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 265011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 265111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 265211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 265311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } // switch (color_format) 265411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 265511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (retval == OMX_ErrorNone) 265611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 265711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_omx_color_formattype = color_format; 265811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 265911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = set_frame_attributes_swvdec(); 266011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 266111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 266211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 266311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 266411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 266511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 266611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Set maximum adaptive playback frame dimensions for OMX component & 266711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * SwVdec core. 266811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 266911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] width: Max adaptive playback frame width. 267011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] height: Max adaptive playback frame height. 267111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 267211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 267311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 267411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::set_adaptive_playback(unsigned int max_width, 267511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int max_height) 267611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 267711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval; 267811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 267911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_dimensions_max.width = max_width; 268011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_dimensions_max.height = max_height; 268111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 268211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("%d x %d", 268311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_dimensions_max.width, 268411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_dimensions_max.height); 268511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 268611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = set_adaptive_playback_swvdec(); 268711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 268811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (retval == OMX_ErrorNone) 268911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 269011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = set_frame_dimensions(max_width, max_height); 269111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 269211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 269311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (retval == OMX_ErrorNone) 269411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 269511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = set_frame_attributes(m_omx_color_formattype); 269611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 269711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 269811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelset_adaptive_playback_exit: 269911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 270011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 270111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 270211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 270311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Get video port format for input or output port. 270411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 270511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in,out] p_port_format: Pointer to video port format type. 270611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 270711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 270811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 270911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::get_video_port_format( 271011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_PORTFORMATTYPE *p_port_format) 271111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 271211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 271311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 271411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_port_format->nPortIndex == OMX_CORE_PORT_INDEX_IP) 271511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 271611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_port_format->nIndex == 0) 271711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 271811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_format->eColorFormat = OMX_COLOR_FormatUnused; 271911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 272011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_format->eCompressionFormat = m_omx_video_codingtype; 272111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 272211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("color format 0x%08x, " 272311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "compression format 0x%08x", 272411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_format->eColorFormat, 272511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_format->eCompressionFormat); 272611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 272711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 272811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 272911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("index '%d' unsupported; " 273011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "no more compression formats", 273111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_format->nIndex); 273211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 273311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorNoMore; 273411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 273511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 273611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (p_port_format->nPortIndex == OMX_CORE_PORT_INDEX_OP) 273711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 273811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_port_format->nIndex == 0) 273911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 274011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_format->eColorFormat = 274111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_COLOR_FormatYUV420PackedSemiPlanar32m; 274211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 274311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_format->eCompressionFormat = OMX_VIDEO_CodingUnused; 274411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 274511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("color format 0x%08x, " 274611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "compression format 0x%08x", 274711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_format->eColorFormat, 274811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_format->eCompressionFormat); 274911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 275011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (p_port_format->nIndex == 1) 275111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 275211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_format->eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar; 275311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 275411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_format->eCompressionFormat = OMX_VIDEO_CodingUnused; 275511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 275611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("color format 0x%08x, " 275711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "compression format 0x%08x", 275811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_format->eColorFormat, 275911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_format->eCompressionFormat); 276011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 276111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 276211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 276311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("index '%d' unsupported; no more color formats", 276411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_format->nIndex); 276511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 276611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorNoMore; 276711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 276811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 276911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 277011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 277111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", 277211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_format->nPortIndex); 277311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 277411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadPortIndex; 277511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 277611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 277711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 277811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 277911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 278011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 278111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Set video port format for input or output port. 278211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 278311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_port_format: Pointer to video port format type. 278411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 278511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 278611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 278711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::set_video_port_format( 278811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_PORTFORMATTYPE *p_port_format) 278911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 279011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 279111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 279211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_port_format->nPortIndex == OMX_CORE_PORT_INDEX_IP) 279311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 279411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("OMX_IndexParamVideoPortFormat, port index 0; " 279511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "doing nothing"); 279611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 279711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (p_port_format->nPortIndex == OMX_CORE_PORT_INDEX_OP) 279811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 279911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = set_frame_attributes(p_port_format->eColorFormat); 280011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 280111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 280211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 280311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", 280411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_format->nPortIndex); 280511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 280611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadPortIndex; 280711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 280811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 280911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelset_video_port_format_exit: 281011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 281111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 281211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 281311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 281411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Get port definition for input or output port. 281511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 281611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in,out] p_port_def: Pointer to port definition type. 281711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 281811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 281911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 282011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::get_port_definition( 282111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_PORTDEFINITIONTYPE *p_port_def) 282211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 282311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 282411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 282511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->eDomain = OMX_PortDomainVideo; 282611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 282711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_port_def->nPortIndex == OMX_CORE_PORT_INDEX_IP) 282811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 282911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval = get_buffer_requirements_swvdec(OMX_CORE_PORT_INDEX_IP)) != 283011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ErrorNone) 283111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 283211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto get_port_definition_exit; 283311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 283411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 283511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->eDir = OMX_DirInput; 283611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->nBufferCountActual = m_port_ip.def.nBufferCountActual; 283711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->nBufferCountMin = m_port_ip.def.nBufferCountMin; 283811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->nBufferSize = m_port_ip.def.nBufferSize; 283911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->bEnabled = m_port_ip.enabled; 284011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->bPopulated = m_port_ip.populated; 284111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 284211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("port index %d: " 284311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "count actual %d, count min %d, size %d", 284411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->nPortIndex, 284511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->nBufferCountActual, 284611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->nBufferCountMin, 284711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->nBufferSize); 284811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 284911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // frame dimensions & attributes don't apply to input port 285011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 285111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->format.video.eColorFormat = OMX_COLOR_FormatUnused; 285211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->format.video.eCompressionFormat = m_omx_video_codingtype; 285311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 285411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (p_port_def->nPortIndex == OMX_CORE_PORT_INDEX_OP) 285511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 285611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval = get_frame_dimensions_swvdec()) != OMX_ErrorNone) 285711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 285811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto get_port_definition_exit; 285911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 286011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 286111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->format.video.nFrameWidth = m_frame_dimensions.width; 286211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->format.video.nFrameHeight = m_frame_dimensions.height; 286311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 286411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_port_reconfig_inprogress) 286511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 286611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval = set_frame_attributes(m_omx_color_formattype)) != 286711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ErrorNone) 286811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 286911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto get_port_definition_exit; 287011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 287111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 287211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 287311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval = get_frame_attributes_swvdec()) != OMX_ErrorNone) 287411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 287511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto get_port_definition_exit; 287611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 287711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 287811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->format.video.nStride = m_frame_attributes.stride; 287911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->format.video.nSliceHeight = m_frame_attributes.scanlines; 288011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 288111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("port index %d: " 288211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "%d x %d, stride %d, sliceheight %d", 288311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->nPortIndex, 288411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->format.video.nFrameWidth, 288511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->format.video.nFrameHeight, 288611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->format.video.nStride, 288711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->format.video.nSliceHeight); 288811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 288911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /** 289011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Query to SwVdec core for buffer requirements is not allowed in 289111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * executing state since it will overwrite the component's buffer 289211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * requirements updated via the most recent set_parameter(). 289311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 289411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Buffer requirements communicated to component via set_parameter() are 289511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * not propagated to SwVdec core. 289611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 289711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * The only execption is if port reconfiguration is in progress, in 289811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * which case the query to SwVdec core is required since buffer 289911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * requirements can change based on new dimensions. 290011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 290111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((m_state != OMX_StateExecuting) || m_port_reconfig_inprogress) 290211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 290311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval = 290411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel get_buffer_requirements_swvdec(OMX_CORE_PORT_INDEX_OP)) != 290511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ErrorNone) 290611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 290711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto get_port_definition_exit; 290811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 290911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 291011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 291111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->eDir = OMX_DirOutput; 291211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->nBufferCountActual = m_port_op.def.nBufferCountActual; 291311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->nBufferCountMin = m_port_op.def.nBufferCountMin; 291411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->nBufferSize = m_port_op.def.nBufferSize; 291511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->bEnabled = m_port_op.enabled; 291611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->bPopulated = m_port_op.populated; 291711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 291811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("port index %d: " 291911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "count actual %d, count min %d, size %d", 292011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->nPortIndex, 292111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->nBufferCountActual, 292211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->nBufferCountMin, 292311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->nBufferSize); 292411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 292511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->format.video.eColorFormat = m_omx_color_formattype; 292611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused; 292711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 292811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_omx_color_formattype == 292911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_COLOR_FormatYUV420PackedSemiPlanar32m) 293011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 293111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH( 293211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "port index %d: color format '0x%08x': " 293311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX_QCOM_COLOR_FormatYUV420PackedSemiPlanar32m", 293411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->nPortIndex, 293511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->format.video.eColorFormat); 293611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 293711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_omx_color_formattype == OMX_COLOR_FormatYUV420SemiPlanar) 293811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 293911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("port index %d: color format '0x%08x': " 294011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX_COLOR_FormatYUV420SemiPlanar", 294111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->nPortIndex, 294211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->format.video.eColorFormat); 294311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 294411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 294511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 294611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel assert(0); 294711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorUndefined; 294811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 294911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 295011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 295111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 295211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", p_port_def->nPortIndex); 295311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 295411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadPortIndex; 295511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 295611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 295711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelget_port_definition_exit: 295811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 295911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 296011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 296111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 296211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Set port definition for input or output port. 296311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 296411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_port_def: Pointer to port definition type. 296511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 296611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 296711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 296811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::set_port_definition( 296911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_PORTDEFINITIONTYPE *p_port_def) 297011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 297111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 297211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 297311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("port index %d: " 297411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "count actual %d, count min %d, size %d", 297511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->nPortIndex, 297611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->nBufferCountActual, 297711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->nBufferCountMin, 297811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->nBufferSize); 297911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 298011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_port_def->nPortIndex == OMX_CORE_PORT_INDEX_IP) 298111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 298211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.def.nBufferCountActual = p_port_def->nBufferCountActual; 298311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.def.nBufferCountMin = p_port_def->nBufferCountMin; 298411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.def.nBufferSize = p_port_def->nBufferSize; 298511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 298611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (p_port_def->nPortIndex == OMX_CORE_PORT_INDEX_OP) 298711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 298811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /** 298911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * OMX component's output port nBufferSize is not updated based on what 299011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * IL client sends; instead it is updated based on the possibly updated 299111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * frame attributes. 299211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 299311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * This is because set_parameter() for output port definition only has 299411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * updates to buffer counts or frame dimensions. 299511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 299611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 299711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.def.nBufferCountActual = p_port_def->nBufferCountActual; 299811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.def.nBufferCountMin = p_port_def->nBufferCountMin; 299911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 300011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("port index %d: %d x %d", 300111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->nPortIndex, 300211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->format.video.nFrameWidth, 300311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->format.video.nFrameHeight); 300411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 300511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /** 300611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Update frame dimensions & attributes if: 300711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 300811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 1. not in adaptive playback mode 300911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * OR 301011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 2. new frame dimensions greater than adaptive playback mode's 301111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * max frame dimensions 301211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 301311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 301411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((m_adaptive_playback_mode == false) || 301511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (p_port_def->format.video.nFrameWidth > 301611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_dimensions_max.width) || 301711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (p_port_def->format.video.nFrameHeight > 301811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_dimensions_max.height)) 301911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 302011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("updating frame dimensions & attributes"); 302111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 302211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval = 302311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel set_frame_dimensions(p_port_def->format.video.nFrameWidth, 302411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->format.video.nFrameHeight)) != 302511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ErrorNone) 302611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 302711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto set_port_definition_exit; 302811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 302911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 303011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval = set_frame_attributes(m_omx_color_formattype)) != 303111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ErrorNone) 303211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 303311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto set_port_definition_exit; 303411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 303511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 303611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // nBufferSize updated based on (possibly new) frame attributes 303711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 303811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.def.nBufferSize = m_frame_attributes.size; 303911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 304011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 304111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 304211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("not updating frame dimensions & attributes"); 304311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 304411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 304511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 304611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 304711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", p_port_def->nPortIndex); 304811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 304911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadPortIndex; 305011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 305111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 305211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelset_port_definition_exit: 305311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 305411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 305511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 305611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 305711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Get supported profile & level. 305811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 305911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * The supported profiles & levels are not queried from SwVdec core, but 306011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * hard-coded. This should ideally be replaced with a query to SwVdec core. 306111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 306211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in,out] p_profilelevel: Pointer to video profile & level type. 306311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 306411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 306511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 306611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::get_supported_profilelevel( 306711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_PROFILELEVELTYPE *p_profilelevel) 306811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 306911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 307011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 307111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_profilelevel == NULL) 307211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 307311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("p_profilelevel = NULL"); 307411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 307511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 307611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto get_supported_profilelevel_exit; 307711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 307811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 307911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_profilelevel->nPortIndex != OMX_CORE_PORT_INDEX_IP) 308011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 308111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", 308211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_profilelevel->nPortIndex); 308311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 308411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadPortIndex; 308511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto get_supported_profilelevel_exit; 308611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 308711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 308811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_omx_video_codingtype == OMX_VIDEO_CodingH263) 308911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 309011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_profilelevel->nProfileIndex == 0) 309111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 309211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_profilelevel->eProfile = OMX_VIDEO_H263ProfileBaseline; 309311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_profilelevel->eLevel = OMX_VIDEO_H263Level70; 309411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 309511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("H.263 baseline profile, level 70"); 309611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 309711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 309811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 309911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("profile index '%d' unsupported; " 310011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "no more profiles", 310111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_profilelevel->nProfileIndex); 310211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 310311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorNoMore; 310411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 310511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 310611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if ((m_omx_video_codingtype == OMX_VIDEO_CodingMPEG4) || 310711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_omx_video_codingtype == 310811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((OMX_VIDEO_CODINGTYPE) QOMX_VIDEO_CodingDivx))) 310911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 311011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_profilelevel->nProfileIndex == 0) 311111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 311211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_profilelevel->eProfile = OMX_VIDEO_MPEG4ProfileSimple; 311311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_profilelevel->eLevel = OMX_VIDEO_MPEG4Level5; 311411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 311511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("MPEG-4 simple profile, level 5"); 311611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 311711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (p_profilelevel->nProfileIndex == 1) 311811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 311911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_profilelevel->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple; 312011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_profilelevel->eLevel = OMX_VIDEO_MPEG4Level5; 312111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 312211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("MPEG-4 advanced simple profile, level 5"); 312311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 312411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 312511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 312611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("profile index '%d' unsupported; " 312711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "no more profiles", 312811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_profilelevel->nProfileIndex); 312911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 313011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorNoMore; 313111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 313211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 313311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 313411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 313511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel assert(0); 313611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorUndefined; 313711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 313811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 313911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelget_supported_profilelevel_exit: 314011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 314111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 314211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 314311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 314411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Describe color format. 314511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 314611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in,out] p_params: Pointer to 'DescribeColorFormatParams' structure. 314711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 314811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 314911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 315011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::describe_color_format( 315111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DescribeColorFormatParams *p_params) 315211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 315311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 315411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 315511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_params == NULL) 315611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 315711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("p_params = NULL"); 315811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 315911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 316011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 316111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 316211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 316311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel MediaImage *p_img = &p_params->sMediaImage; 316411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 316511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (p_params->eColorFormat) 316611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 316711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 316811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QCOM_COLOR_FormatYUV420PackedSemiPlanar32m: 316911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 317011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel size_t stride, scanlines; 317111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 317211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_img->mType = MediaImage::MEDIA_IMAGE_TYPE_YUV; 317311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_img->mNumPlanes = 3; 317411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 317511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_img->mWidth = p_params->nFrameWidth; 317611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_img->mHeight = p_params->nFrameHeight; 317711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 317811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /** 317911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * alignment factors: 318011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 318111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * - stride: 128 318211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * - scanlines: 32 318311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 318411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel stride = ALIGN(p_img->mWidth, 128); 318511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel scanlines = ALIGN(p_img->mHeight, 32); 318611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 318711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_img->mBitDepth = 8; 318811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 318911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // plane 0 (Y) 319011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_img->mPlane[MediaImage::Y].mOffset = 0; 319111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_img->mPlane[MediaImage::Y].mColInc = 1; 319211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_img->mPlane[MediaImage::Y].mRowInc = stride; 319311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_img->mPlane[MediaImage::Y].mHorizSubsampling = 1; 319411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_img->mPlane[MediaImage::Y].mVertSubsampling = 1; 319511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 319611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // plane 1 (U) 319711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_img->mPlane[MediaImage::U].mOffset = stride * scanlines; 319811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_img->mPlane[MediaImage::U].mColInc = 2; 319911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_img->mPlane[MediaImage::U].mRowInc = stride; 320011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_img->mPlane[MediaImage::U].mHorizSubsampling = 2; 320111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_img->mPlane[MediaImage::U].mVertSubsampling = 2; 320211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 320311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // plane 2 (V) 320411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_img->mPlane[MediaImage::V].mOffset = stride * scanlines + 1; 320511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_img->mPlane[MediaImage::V].mColInc = 2; 320611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_img->mPlane[MediaImage::V].mRowInc = stride; 320711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_img->mPlane[MediaImage::V].mHorizSubsampling = 2; 320811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_img->mPlane[MediaImage::V].mVertSubsampling = 2; 320911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 321011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 321111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 321211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 321311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COLOR_FormatYUV420SemiPlanar: 321411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 321511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // do nothing; standard OMX color formats should not be described 321642adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel retval = OMX_ErrorUnsupportedSetting; 321711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 321811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 321911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 322011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 322111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 322211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("color format '0x%08x' invalid/unsupported", 322311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_params->eColorFormat); 322411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 322511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_img->mType = MediaImage::MEDIA_IMAGE_TYPE_UNKNOWN; 322611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 322711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 322811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 322911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 323011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 323111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } // switch (p_params->eColorFormat) 323211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 323311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 323411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 323511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 323611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 323711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 323811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Set QTI vendor-specific port definition for input or output port. 323911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 324011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_port_def: Pointer to QTI vendor-specific port definition type. 324111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 324211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 324311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 324411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::set_port_definition_qcom( 324511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_PARAM_PORTDEFINITIONTYPE *p_port_def) 324611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 324711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 324811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 324911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_port_def->nPortIndex == OMX_CORE_PORT_INDEX_IP) 325011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 325111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (p_port_def->nFramePackingFormat) 325211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 325311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 325411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QCOM_FramePacking_Arbitrary: 325511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 325611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("OMX_QCOM_FramePacking_Arbitrary"); 325711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 325811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_arbitrary_bytes_mode = true; 325911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 326011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 326111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 326211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 326311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QCOM_FramePacking_OnlyOneCompleteFrame: 326411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 326511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH( 326611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX_QCOM_FramePacking_OnlyOneCompleteFrame"); 326711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 326811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 326911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 327011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 327111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 327211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 327311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR( 327411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "frame packing format '%d' unsupported", 327511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->nFramePackingFormat); 327611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 327711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorUnsupportedSetting; 327811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 327911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 328011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 328111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 328211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 328311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (p_port_def->nPortIndex == OMX_CORE_PORT_INDEX_OP) 328411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 328511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("nMemRegion %d, nCacheAttr %d", 328611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->nMemRegion, 328711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->nCacheAttr); 328811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 328911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 329011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 329111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", 329211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_port_def->nPortIndex); 329311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 329411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadPortIndex; 329511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 329611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 329711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 329811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 329911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 330011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 330111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Set SwVdec frame dimensions based on OMX component frame dimensions. 330211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 330311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 330411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 330511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::set_frame_dimensions_swvdec() 330611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 330711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 330811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 330911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_PROPERTY property; 331011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 331111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS retval_swvdec; 331211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 331311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property.id = SWVDEC_PROPERTY_ID_FRAME_DIMENSIONS; 331411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 331511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property.info.frame_dimensions.width = m_frame_dimensions.width; 331611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property.info.frame_dimensions.height = m_frame_dimensions.height; 331711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 331811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval_swvdec = swvdec_setproperty(m_swvdec_handle, &property)) != 331911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS_SUCCESS) 332011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 332111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = retval_swvdec2omx(retval_swvdec); 332211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 332311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 332411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 332511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 332611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 332711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 332811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Set SwVdec frame attributes based on OMX component frame attributes. 332911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 333011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 333111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 333211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::set_frame_attributes_swvdec() 333311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 333411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 333511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 333611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_FRAME_ATTRIBUTES *p_frame_attributes; 333711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 333811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_PROPERTY property; 333911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 334011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS retval_swvdec; 334111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 334211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_frame_attributes = &property.info.frame_attributes; 334311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 334411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property.id = SWVDEC_PROPERTY_ID_FRAME_ATTRIBUTES; 334511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 334611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_frame_attributes->color_format = SWVDEC_COLOR_FORMAT_SEMIPLANAR_NV12; 334711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 334811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_frame_attributes->stride = m_frame_attributes.stride; 334911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_frame_attributes->scanlines = m_frame_attributes.scanlines; 335011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_frame_attributes->size = m_frame_attributes.size; 335111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 335211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval_swvdec = swvdec_setproperty(m_swvdec_handle, &property)) != 335311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS_SUCCESS) 335411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 335511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = retval_swvdec2omx(retval_swvdec); 335611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 335711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 335811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 335911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 336011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 336111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 336211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Set maximum adaptive playback frame dimensions for SwVdec core. 336311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 336411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::set_adaptive_playback_swvdec() 336511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 336611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 336711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 336811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_PROPERTY property; 336911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 337011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS retval_swvdec; 337111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 337211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property.id = SWVDEC_PROPERTY_ID_ADAPTIVE_PLAYBACK; 337311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 337411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property.info.frame_dimensions.width = m_frame_dimensions_max.width; 337511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property.info.frame_dimensions.height = m_frame_dimensions_max.height; 337611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 337711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval_swvdec = swvdec_setproperty(m_swvdec_handle, &property)) != 337811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS_SUCCESS) 337911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 338011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = retval_swvdec2omx(retval_swvdec); 338111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 338211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 338311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 338411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 338511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 338611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 338711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Get SwVdec frame dimensions and set OMX component frame dimensions. 338811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 338911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 339011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 339111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::get_frame_dimensions_swvdec() 339211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 339311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 339411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 339511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_PROPERTY property; 339611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 339711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS retval_swvdec; 339811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 339911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property.id = SWVDEC_PROPERTY_ID_FRAME_DIMENSIONS; 340011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 340111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval_swvdec = swvdec_getproperty(m_swvdec_handle, &property)) != 340211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS_SUCCESS) 340311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 340411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = retval_swvdec2omx(retval_swvdec); 340511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 340611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 340711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 340811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_dimensions.width = property.info.frame_dimensions.width; 340911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_dimensions.height = property.info.frame_dimensions.height; 341011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 341111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 341211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 341311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 341411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 341511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 341611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Get SwVdec frame attributes and set OMX component frame attributes. 341711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 341811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 341911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 342011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::get_frame_attributes_swvdec() 342111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 342211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 342311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 342411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_PROPERTY property; 342511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 342611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS retval_swvdec; 342711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 342811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property.id = SWVDEC_PROPERTY_ID_FRAME_ATTRIBUTES; 342911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 343011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval_swvdec = swvdec_getproperty(m_swvdec_handle, &property)) != 343111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS_SUCCESS) 343211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 343311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = retval_swvdec2omx(retval_swvdec); 343411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 343511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 343611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 343711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_attributes.stride = property.info.frame_attributes.stride; 343811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_attributes.scanlines = property.info.frame_attributes.scanlines; 343911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_attributes.size = property.info.frame_attributes.size; 344011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 344111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 344211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 344311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 344411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 344511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 344611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Get SwVdec buffer requirements; set input or output port definitions. 344711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 344811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] port_index: Port index. 344911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 345011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 345111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 345211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::get_buffer_requirements_swvdec( 345311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int port_index) 345411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 345511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 345611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 345711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_PROPERTY property; 345811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 345911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS retval_swvdec; 346011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 346111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_BUFFER_REQ *p_buffer_req; 346211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 346311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (port_index == OMX_CORE_PORT_INDEX_IP) 346411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 346511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property.id = SWVDEC_PROPERTY_ID_BUFFER_REQ_IP; 346611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 346711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_req = &property.info.buffer_req_ip; 346811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 346911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval_swvdec = swvdec_getproperty(m_swvdec_handle, &property)) != 347011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS_SUCCESS) 347111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 347211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = retval_swvdec2omx(retval_swvdec); 347311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto get_buffer_requirements_swvdec_exit; 347411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 347511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 347611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.def.nBufferSize = p_buffer_req->size; 347711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.def.nBufferCountMin = p_buffer_req->mincount; 347811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.def.nBufferCountActual = MAX(p_buffer_req->mincount, 347911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_IP_BUFFER_COUNT_MIN); 348011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.def.nBufferAlignment = p_buffer_req->alignment; 348111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 348211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("ip port: %d bytes x %d, %d-byte aligned", 348311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.def.nBufferSize, 348411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.def.nBufferCountActual, 348511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.def.nBufferAlignment); 348611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 348711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (port_index == OMX_CORE_PORT_INDEX_OP) 348811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 348911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property.id = SWVDEC_PROPERTY_ID_BUFFER_REQ_OP; 349011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 349111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_req = &property.info.buffer_req_op; 349211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 349311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval_swvdec = swvdec_getproperty(m_swvdec_handle, &property)) != 349411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS_SUCCESS) 349511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 349611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = retval_swvdec2omx(retval_swvdec); 349711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto get_buffer_requirements_swvdec_exit; 349811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 349911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 350011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_sync_frame_decoding_mode) 350111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 350211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_req->mincount = 1; 350311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 350411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 350511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.def.nBufferSize = p_buffer_req->size; 350611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.def.nBufferCountMin = p_buffer_req->mincount; 350711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.def.nBufferCountActual = MAX(p_buffer_req->mincount, 350811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.def.nBufferCountActual); 350911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.def.nBufferAlignment = p_buffer_req->alignment; 351011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 351111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("op port: %d bytes x %d, %d-byte aligned", 351211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.def.nBufferSize, 351311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.def.nBufferCountActual, 351411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.def.nBufferAlignment); 351511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 351611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 351711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 351811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", port_index); 351911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 352011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadPortIndex; 352111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 352211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 352311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelget_buffer_requirements_swvdec_exit: 352411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 352511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 352611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 352711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 352811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Allocate input buffer, and input buffer info array if ncessary. 352911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 353011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in,out] pp_buffer_hdr: Pointer to pointer to buffer header type 353111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * structure. 353211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_app_data: Pointer to IL client app data. 353311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] size: Size of buffer to be allocated in bytes. 353411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 353511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 353611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 353711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::buffer_allocate_ip( 353811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE **pp_buffer_hdr, 353911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PTR p_app_data, 354011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 size) 354111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 354211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 354311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 354411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int ii; 354511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 354611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (size != m_port_ip.def.nBufferSize) 354711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 354811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("requested size (%d bytes) not equal to " 354911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "configured size (%d bytes)", 355011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel size, 355111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.def.nBufferSize); 355211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 355311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 355411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto buffer_allocate_ip_exit; 355511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 355611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 355711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_buffer_array_ip == NULL) 355811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 355911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("allocating buffer info array, %d element%s", 356011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.def.nBufferCountActual, 356111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_port_ip.def.nBufferCountActual > 1) ? "s" : ""); 356211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 356311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval = buffer_allocate_ip_info_array()) != OMX_ErrorNone) 356411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 356511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto buffer_allocate_ip_exit; 356611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 356711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 356811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 356911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (ii = 0; ii < m_port_ip.def.nBufferCountActual; ii++) 357011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 357111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_buffer_array_ip[ii].buffer_populated == false) 357211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 357311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_LOW("buffer %d not populated", ii); 357411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 357511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 357611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 357711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 357811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ii < m_port_ip.def.nBufferCountActual) 357911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 358011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int pmem_fd = -1; 358111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 358211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned char *bufferaddr; 358311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 358411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("ip buffer %d: %d bytes being allocated", 358511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ii, 358611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel size); 358711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 358811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_ip[ii].ion_info.ion_fd_device = 358911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ion_memory_alloc_map(&m_buffer_array_ip[ii].ion_info.ion_alloc_data, 359011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &m_buffer_array_ip[ii].ion_info.ion_fd_data, 359111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel size, 359211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.def.nBufferAlignment); 359311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 359411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_buffer_array_ip[ii].ion_info.ion_fd_device < 0) 359511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 359611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInsufficientResources; 359711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto buffer_allocate_ip_exit; 359811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 359911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 360011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_fd = m_buffer_array_ip[ii].ion_info.ion_fd_data.fd; 360111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 360211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufferaddr = (unsigned char *) mmap(NULL, 360311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel size, 360411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PROT_READ | PROT_WRITE, 360511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel MAP_SHARED, 360611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_fd, 360711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 0); 360811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 360911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bufferaddr == MAP_FAILED) 361011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 361111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("mmap() failed for fd %d of size %d", 361211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_fd, 361311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel size); 361411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 361511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(pmem_fd); 361611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ion_memory_free(&m_buffer_array_ip[ii].ion_info); 361711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 361811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInsufficientResources; 361911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto buffer_allocate_ip_exit; 362011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 362111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 362211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *pp_buffer_hdr = &m_buffer_array_ip[ii].buffer_header; 362311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 362411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_ip[ii].buffer_payload.bufferaddr = bufferaddr; 362511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_ip[ii].buffer_payload.pmem_fd = pmem_fd; 362611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_ip[ii].buffer_payload.buffer_len = size; 362711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_ip[ii].buffer_payload.mmaped_size = size; 362811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_ip[ii].buffer_payload.offset = 0; 362911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 363011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_ip[ii].buffer_swvdec.p_buffer = bufferaddr; 363111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_ip[ii].buffer_swvdec.size = size; 363211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_ip[ii].buffer_swvdec.p_client_data = 363311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void *) ((unsigned long) ii); 363411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 363511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_ip[ii].buffer_populated = true; 363611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 363711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("ip buffer %d: %p, %d bytes", 363811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ii, 363911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufferaddr, 364011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel size); 364111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 364211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*pp_buffer_hdr)->pBuffer = (OMX_U8 *) bufferaddr; 364311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*pp_buffer_hdr)->nSize = sizeof(OMX_BUFFERHEADERTYPE); 364411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*pp_buffer_hdr)->nVersion.nVersion = OMX_SPEC_VERSION; 364511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*pp_buffer_hdr)->nAllocLen = size; 364611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*pp_buffer_hdr)->pAppPrivate = p_app_data; 364711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*pp_buffer_hdr)->nInputPortIndex = OMX_CORE_PORT_INDEX_IP; 364811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*pp_buffer_hdr)->pInputPortPrivate = 364911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void *) &(m_buffer_array_ip[ii].buffer_payload); 365011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 365111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.populated = port_ip_populated(); 365211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.unpopulated = OMX_FALSE; 365311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 365411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 365511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 365611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("all %d ip buffers allocated", 365711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.def.nBufferCountActual); 365811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 365911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInsufficientResources; 366011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 366111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 366211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbuffer_allocate_ip_exit: 366311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 366411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 366511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 366611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 366711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Allocate output buffer, and output buffer info array if necessary. 366811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 366911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in,out] pp_buffer_hdr: Pointer to pointer to buffer header type 367011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * structure. 367111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_app_data: Pointer to IL client app data. 367211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] size: Size of buffer to be allocated in bytes. 367311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 367411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 367511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 367611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::buffer_allocate_op( 367711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE **pp_buffer_hdr, 367811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PTR p_app_data, 367911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 size) 368011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 368111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 368211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 368311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int ii; 368411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 368511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (size != m_port_op.def.nBufferSize) 368611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 368711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("requested size (%d bytes) not equal to " 368811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "configured size (%d bytes)", 368911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel size, 369011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.def.nBufferSize); 369111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 369211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 369311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto buffer_allocate_op_exit; 369411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 369511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 369611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_buffer_array_op == NULL) 369711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 369811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("allocating buffer info array, %d element%s", 369911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.def.nBufferCountActual, 370011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_port_op.def.nBufferCountActual > 1) ? "s" : ""); 370111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 370211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval = buffer_allocate_op_info_array()) != OMX_ErrorNone) 370311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 370411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto buffer_allocate_op_exit; 370511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 370611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 370711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 370811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (ii = 0; ii < m_port_op.def.nBufferCountActual; ii++) 370911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 371011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_buffer_array_op[ii].buffer_populated == false) 371111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 371211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_LOW("buffer %d not populated", ii); 371311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 371411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 371511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 371611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 371711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ii < m_port_op.def.nBufferCountActual) 371811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 371911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int pmem_fd = -1; 372011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 372111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned char *bufferaddr; 372211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 372311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("op buffer %d: %d bytes being allocated", 372411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ii, 372511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel size); 372611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 372711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_op[ii].ion_info.ion_fd_device = 372811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ion_memory_alloc_map(&m_buffer_array_op[ii].ion_info.ion_alloc_data, 372911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &m_buffer_array_op[ii].ion_info.ion_fd_data, 373011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel size, 373111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.def.nBufferAlignment); 373211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 373311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_buffer_array_op[ii].ion_info.ion_fd_device < 0) 373411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 373511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInsufficientResources; 373611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto buffer_allocate_op_exit; 373711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 373811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 373911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_fd = m_buffer_array_op[ii].ion_info.ion_fd_data.fd; 374011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 374111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufferaddr = (unsigned char *) mmap(NULL, 374211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel size, 374311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PROT_READ | PROT_WRITE, 374411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel MAP_SHARED, 374511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_fd, 374611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 0); 374711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 374811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bufferaddr == MAP_FAILED) 374911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 375011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("mmap() failed for fd %d of size %d", 375111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_fd, 375211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel size); 375311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 375411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(pmem_fd); 375511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ion_memory_free(&m_buffer_array_op[ii].ion_info); 375611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 375711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInsufficientResources; 375811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto buffer_allocate_op_exit; 375911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 376011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 376111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *pp_buffer_hdr = &m_buffer_array_op[ii].buffer_header; 376211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 376311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_op[ii].buffer_payload.bufferaddr = bufferaddr; 376411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_op[ii].buffer_payload.pmem_fd = pmem_fd; 376511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_op[ii].buffer_payload.buffer_len = size; 376611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_op[ii].buffer_payload.mmaped_size = size; 376711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_op[ii].buffer_payload.offset = 0; 376811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 376911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_op[ii].buffer_swvdec.p_buffer = bufferaddr; 377011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_op[ii].buffer_swvdec.size = size; 377111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_op[ii].buffer_swvdec.p_client_data = 377211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void *) ((unsigned long) ii); 377311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 377411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_op[ii].buffer_populated = true; 377511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 377611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("op buffer %d: %p, %d bytes", 377711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ii, 377811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufferaddr, 377911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel size); 378011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 378111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*pp_buffer_hdr)->pBuffer = (OMX_U8 *) bufferaddr; 378211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*pp_buffer_hdr)->nSize = sizeof(OMX_BUFFERHEADERTYPE); 378311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*pp_buffer_hdr)->nVersion.nVersion = OMX_SPEC_VERSION; 378411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*pp_buffer_hdr)->nAllocLen = size; 378511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*pp_buffer_hdr)->pAppPrivate = p_app_data; 378611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*pp_buffer_hdr)->nOutputPortIndex = OMX_CORE_PORT_INDEX_OP; 378711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*pp_buffer_hdr)->pOutputPortPrivate = 378811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void *) &(m_buffer_array_op[ii].buffer_payload); 378911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 379011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.populated = port_op_populated(); 379111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.unpopulated = OMX_FALSE; 379211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 379311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 379411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 379511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("all %d op buffers allocated", 379611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.def.nBufferCountActual); 379711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 379811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInsufficientResources; 379911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 380011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 380111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbuffer_allocate_op_exit: 380211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 380311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 380411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 380511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 380611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Allocate input buffer info array. 380711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 380811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::buffer_allocate_ip_info_array() 380911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 381011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 381111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 381211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int ii; 381311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 381411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *p_buffer_hdr; 381511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 381611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_buffer_array_ip != NULL) 381711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 381811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("buffer info array already allocated"); 381911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 382011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInsufficientResources; 382111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto buffer_allocate_ip_info_array_exit; 382211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 382311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 382411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("allocating buffer info array, %d element%s", 382511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.def.nBufferCountActual, 382611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_port_ip.def.nBufferCountActual > 1) ? "s" : ""); 382711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 382811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_ip = 382911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_SWVDEC_BUFFER_INFO *) calloc(sizeof(OMX_SWVDEC_BUFFER_INFO), 383011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.def.nBufferCountActual); 383111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 383211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_buffer_array_ip == NULL) 383311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 383411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("failed to allocate buffer info array; " 383511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "%d element%s, %zu bytes requested", 383611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.def.nBufferCountActual, 383711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_port_ip.def.nBufferCountActual > 1) ? "s" : "", 383811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(OMX_SWVDEC_BUFFER_INFO) * 383911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.def.nBufferCountActual); 384011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 384111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInsufficientResources; 384211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto buffer_allocate_ip_info_array_exit; 384311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 384411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 384511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (ii = 0; ii < m_port_ip.def.nBufferCountActual; ii++) 384611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 384711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr = &m_buffer_array_ip[ii].buffer_header; 384811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 384911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // reset file descriptors 385011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 385111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_ip[ii].buffer_payload.pmem_fd = -1; 385211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_ip[ii].ion_info.ion_fd_device = -1; 385311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 385411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_ip[ii].buffer_swvdec.p_client_data = 385511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void *) ((unsigned long) ii); 385611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 385711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->nSize = sizeof(OMX_BUFFERHEADERTYPE); 385811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->nVersion.nVersion = OMX_SPEC_VERSION; 385911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->nInputPortIndex = OMX_CORE_PORT_INDEX_IP; 386011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->pInputPortPrivate = 386111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void *) &(m_buffer_array_ip[ii].buffer_payload); 386211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 386311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 386411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbuffer_allocate_ip_info_array_exit: 386511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 386611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 386711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 386811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 386911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Allocate output buffer info array. 387011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 387111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::buffer_allocate_op_info_array() 387211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 387311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 387411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 387511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int ii; 387611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 387711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *p_buffer_hdr; 387811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 387911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_buffer_array_op != NULL) 388011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 388111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("buffer info array already allocated"); 388211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 388311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInsufficientResources; 388411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto buffer_allocate_op_info_array_exit; 388511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 388611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 388711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("allocating buffer info array, %d element%s", 388811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.def.nBufferCountActual, 388911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_port_op.def.nBufferCountActual > 1) ? "s" : ""); 389011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 389111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_op = 389211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_SWVDEC_BUFFER_INFO *) calloc(sizeof(OMX_SWVDEC_BUFFER_INFO), 389311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.def.nBufferCountActual); 389411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 389511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_buffer_array_op == NULL) 389611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 389711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("failed to allocate buffer info array; " 389811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "%d element%s, %zu bytes requested", 389911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.def.nBufferCountActual, 390011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_port_op.def.nBufferCountActual > 1) ? "s" : "", 390111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(OMX_SWVDEC_BUFFER_INFO) * 390211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.def.nBufferCountActual); 390311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 390411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInsufficientResources; 390511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto buffer_allocate_op_info_array_exit; 390611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 390711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 390811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (ii = 0; ii < m_port_op.def.nBufferCountActual; ii++) 390911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 391011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr = &m_buffer_array_op[ii].buffer_header; 391111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 391211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // reset file descriptors 391311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 391411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_op[ii].buffer_payload.pmem_fd = -1; 391511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_op[ii].ion_info.ion_fd_device = -1; 391611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 391711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_op[ii].buffer_swvdec.p_client_data = 391811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void *) ((unsigned long) ii); 391911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 392011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->nSize = sizeof(OMX_BUFFERHEADERTYPE); 392111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->nVersion.nVersion = OMX_SPEC_VERSION; 392211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->nOutputPortIndex = OMX_CORE_PORT_INDEX_OP; 392311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->pOutputPortPrivate = 392411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void *) &(m_buffer_array_op[ii].buffer_payload); 392511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 392611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 392711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbuffer_allocate_op_info_array_exit: 392811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 392911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 393011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 393111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 393211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Use buffer allocated by IL client; allocate output buffer info array 393311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * if necessary. 393411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 393511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in,out] pp_buffer_hdr: Pointer to pointer to buffer header type 393611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * structure. 393711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_app_data: Pointer to IL client app data. 393811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] size: Size of buffer to be allocated in bytes. 393911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_buffer: Pointer to buffer to be used. 394011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 394111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 394211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 394311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::buffer_use_op( 394411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE **pp_buffer_hdr, 394511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PTR p_app_data, 394611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 size, 394711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 *p_buffer) 394811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 394911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 395011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 395111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int ii; 395211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 395311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) size; 395411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 395511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_buffer_array_op == NULL) 395611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 395711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("allocating buffer info array, %d element%s", 395811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.def.nBufferCountActual, 395911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_port_op.def.nBufferCountActual > 1) ? "s" : ""); 396011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 396111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval = buffer_allocate_op_info_array()) != OMX_ErrorNone) 396211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 396311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto buffer_use_op_exit; 396411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 396511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 396611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 396711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_meta_buffer_mode && (m_meta_buffer_array == NULL)) 396811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 396911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("allocating meta buffer info array, %d element%s", 397011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.def.nBufferCountActual, 397111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_port_op.def.nBufferCountActual > 1) ? "s" : ""); 397211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 397311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval = meta_buffer_array_allocate()) != OMX_ErrorNone) 397411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 397511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto buffer_use_op_exit; 397611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 397711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 397811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 397911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (ii = 0; ii < m_port_op.def.nBufferCountActual; ii++) 398011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 398111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_buffer_array_op[ii].buffer_populated == false) 398211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 398311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_LOW("buffer %d not populated", ii); 398411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 398511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 398611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 398711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 398811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ii < m_port_op.def.nBufferCountActual) 398911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 399011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_bufferpayload *p_buffer_payload; 399111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 399211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_BUFFER *p_buffer_swvdec; 399311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 399411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *pp_buffer_hdr = &m_buffer_array_op[ii].buffer_header; 399511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_payload = &m_buffer_array_op[ii].buffer_payload; 399611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_swvdec = &m_buffer_array_op[ii].buffer_swvdec; 399711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 399811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_meta_buffer_mode) 399911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 400011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_swvdec->size = m_port_op.def.nBufferSize; 400111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_swvdec->p_client_data = (void *) ((unsigned long) ii); 400211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 400311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_op[ii].buffer_populated = true; 400411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 400511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*pp_buffer_hdr)->pBuffer = p_buffer; 400611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*pp_buffer_hdr)->pAppPrivate = p_app_data; 400711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*pp_buffer_hdr)->nAllocLen = 400811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(struct VideoDecoderOutputMetaData); 400911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 401011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("op buffer %d: %p (meta buffer)", 401111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ii, 401211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *pp_buffer_hdr); 401311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 401411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.populated = port_op_populated(); 401511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.unpopulated = OMX_FALSE; 401611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 401711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_android_native_buffers) 401811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 401911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel private_handle_t *p_handle; 402011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 402111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 *p_buffer_mapped; 402211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 402311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_handle = (private_handle_t *) p_buffer; 402411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 402511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (((OMX_U32) p_handle->size) < m_port_op.def.nBufferSize) 402611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 402711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("requested size (%d bytes) not equal to " 402811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "configured size (%d bytes)", 402911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_handle->size, 403011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.def.nBufferSize); 403111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 403211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 403311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto buffer_use_op_exit; 403411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 403511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 403611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.def.nBufferSize = p_handle->size; 403711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 403811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_mapped = (OMX_U8 *) mmap(NULL, 403911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_handle->size, 404011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PROT_READ | PROT_WRITE, 404111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel MAP_SHARED, 404211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_handle->fd, 404311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 0); 404411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 404511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_buffer_mapped == MAP_FAILED) 404611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 404711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("mmap() failed for fd %d of size %d", 404811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_handle->fd, 404911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_handle->size); 405011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 405111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInsufficientResources; 405211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto buffer_use_op_exit; 405311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 405411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 405511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_payload->bufferaddr = p_buffer_mapped; 405611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_payload->pmem_fd = p_handle->fd; 405711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_payload->buffer_len = p_handle->size; 405811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_payload->mmaped_size = p_handle->size; 405911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_payload->offset = 0; 406011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 406111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_swvdec->p_buffer = p_buffer_mapped; 406211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_swvdec->size = m_port_op.def.nBufferSize; 406311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_swvdec->p_client_data = (void *) ((unsigned long) ii); 406411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 406511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_op[ii].buffer_populated = true; 406611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 406711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*pp_buffer_hdr)->pBuffer = (m_android_native_buffers ? 406811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((OMX_U8 *) p_handle) : 406911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_mapped); 407011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*pp_buffer_hdr)->pAppPrivate = p_app_data; 407111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*pp_buffer_hdr)->nAllocLen = m_port_op.def.nBufferSize; 407211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 407311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_op[ii].ion_info.ion_fd_data.fd = p_handle->fd; 407411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 407511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("op buffer %d: %p", 407611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ii, 407711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *pp_buffer_hdr); 407811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 407911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.populated = port_op_populated(); 408011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.unpopulated = OMX_FALSE; 408111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 408211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 408311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 408411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("neither 'meta buffer mode' nor " 408511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "'android native buffers' enabled"); 408611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 408711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 408811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 408911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 409011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 409111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 409211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("all %d op buffers populated", 409311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.def.nBufferCountActual); 409411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 409511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInsufficientResources; 409611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 409711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 409811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbuffer_use_op_exit: 409911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 410011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 410111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 410211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 410311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief De-allocate input buffer. 410411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 410511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_buffer_hdr: Pointer to buffer header structure. 410611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 410711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 410811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 410911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::buffer_deallocate_ip( 411011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *p_buffer_hdr) 411111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 411211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 411311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 411411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int ii; 411511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 411611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_buffer_hdr == NULL) 411711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 411811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("p_buffer_hdr = NULL"); 411911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 412011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 412111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto buffer_deallocate_ip_exit; 412211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 412311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_buffer_array_ip == NULL) 412411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 412511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("ip buffer array not allocated"); 412611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 412711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 412811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto buffer_deallocate_ip_exit; 412911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 413011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 413111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (ii = 0; ii < m_port_ip.def.nBufferCountActual; ii++) 413211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 413311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_buffer_hdr == &(m_buffer_array_ip[ii].buffer_header)) 413411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 413511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_LOW("%p has index %d", 413611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->pBuffer, 413711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ii); 413811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 413911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 414011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 414111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 414211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ii < m_port_ip.def.nBufferCountActual) 414311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 414411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_buffer_array_ip[ii].buffer_payload.pmem_fd > 0) 414511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 414611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_ip[ii].buffer_populated = false; 414711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 414811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.populated = OMX_FALSE; 414911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 415011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel munmap(m_buffer_array_ip[ii].buffer_payload.bufferaddr, 415111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_ip[ii].buffer_payload.mmaped_size); 415211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 415311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(m_buffer_array_ip[ii].buffer_payload.pmem_fd); 415411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_ip[ii].buffer_payload.pmem_fd = -1; 415511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 415611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ion_memory_free(&m_buffer_array_ip[ii].ion_info); 415711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 415811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (ii = 0; ii < m_port_ip.def.nBufferCountActual; ii++) 415911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 416011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_buffer_array_ip[ii].buffer_populated) 416111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 416211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 416311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 416411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 416511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 416611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ii == m_port_ip.def.nBufferCountActual) 416711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 416811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_deallocate_ip_info_array(); 416911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 417011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.unpopulated = OMX_TRUE; 417111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 417211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 417311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 417411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 417511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("%p: pmem_fd %d", 417611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->pBuffer, 417711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_ip[ii].buffer_payload.pmem_fd); 417811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 417911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 418011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 418111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 418211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("%p not found", p_buffer_hdr->pBuffer); 418311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 418411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 418511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 418611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 418711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbuffer_deallocate_ip_exit: 418811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 418911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 419011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 419111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 419211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief De-allocate output buffer. 419311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 419411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_buffer_hdr: Pointer to buffer header structure. 419511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 419611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 419711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 419811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::buffer_deallocate_op( 419911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *p_buffer_hdr) 420011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 420111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 420211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 420311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int ii; 420411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 420511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_buffer_hdr == NULL) 420611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 420711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("p_buffer_hdr = NULL"); 420811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 420911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 421011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto buffer_deallocate_op_exit; 421111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 421211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_buffer_array_op == NULL) 421311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 421411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("op buffer array not allocated"); 421511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 421611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 421711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto buffer_deallocate_op_exit; 421811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 421911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 422011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (ii = 0; ii < m_port_op.def.nBufferCountActual; ii++) 422111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 422211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_buffer_hdr == &(m_buffer_array_op[ii].buffer_header)) 422311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 422411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_LOW("%p has index %d", 422511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->pBuffer, 422611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ii); 422711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 422811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 422911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 423011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 423111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ii < m_port_op.def.nBufferCountActual) 423211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 423311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_meta_buffer_mode) 423411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 423511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // do nothing; munmap() & FD reset done in FBD or RR 423611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 423711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_android_native_buffers) 423811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 423911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel munmap(m_buffer_array_op[ii].buffer_payload.bufferaddr, 424011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_op[ii].buffer_payload.mmaped_size); 424111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 424211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_op[ii].buffer_payload.pmem_fd = -1; 424311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 424411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 424511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 424611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel munmap(m_buffer_array_op[ii].buffer_payload.bufferaddr, 424711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_op[ii].buffer_payload.mmaped_size); 424811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 424911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(m_buffer_array_op[ii].buffer_payload.pmem_fd); 425011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 425111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_op[ii].buffer_payload.pmem_fd = -1; 425211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 425311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ion_memory_free(&m_buffer_array_op[ii].ion_info); 425411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 425511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 425611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_op[ii].buffer_populated = false; 425711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 425811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.populated = OMX_FALSE; 425911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 426011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (ii = 0; ii < m_port_op.def.nBufferCountActual; ii++) 426111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 426211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_buffer_array_op[ii].buffer_populated) 426311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 426411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 426511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 426611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 426711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 426811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ii == m_port_op.def.nBufferCountActual) 426911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 427011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buffer_deallocate_op_info_array(); 427111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 427211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.unpopulated = OMX_TRUE; 427311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 427411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_meta_buffer_mode) 427511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 427611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel meta_buffer_array_deallocate(); 427711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 427811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 427911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 428011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 428111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 428211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("%p not found", p_buffer_hdr->pBuffer); 428311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 428411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 428511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 428611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 428711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbuffer_deallocate_op_exit: 428811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 428911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 429011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 429111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 429211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief De-allocate input buffer info array. 429311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 429411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_swvdec::buffer_deallocate_ip_info_array() 429511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 429611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel assert(m_buffer_array_ip != NULL); 429711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 429811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(m_buffer_array_ip); 429911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 430011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_ip = NULL; 430111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 430211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 430311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 430411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief De-allocate output buffer info array. 430511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 430611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_swvdec::buffer_deallocate_op_info_array() 430711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 430811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel assert(m_buffer_array_op != NULL); 430911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 431011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(m_buffer_array_op); 431111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 431211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_op = NULL; 431311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 431411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 431511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 431611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Allocate meta buffer info array. 431711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 431811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 431911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 432011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::meta_buffer_array_allocate() 432111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 432211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 432311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 432411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_meta_buffer_array = ((OMX_SWVDEC_META_BUFFER_INFO *) 432511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel calloc(sizeof(OMX_SWVDEC_META_BUFFER_INFO), 432611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.def.nBufferCountActual)); 432711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 432811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_meta_buffer_array == NULL) 432911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 433011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("failed to allocate meta_buffer info array; " 433111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "%d element%s, %zu bytes requested", 433211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.def.nBufferCountActual, 433311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_port_op.def.nBufferCountActual > 1) ? "s" : "", 433411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sizeof(OMX_SWVDEC_META_BUFFER_INFO) * 433511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.def.nBufferCountActual); 433611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 433711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInsufficientResources; 433811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 433911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 434011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 434111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int ii; 434211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 434311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (ii = 0; ii < m_port_op.def.nBufferCountActual; ii++) 434411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 434511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_meta_buffer_array[ii].fd = -1; 434611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 434711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 434811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 434911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 435011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 435111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 435211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 435311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief De-allocate meta buffer info array. 435411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 435511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_swvdec::meta_buffer_array_deallocate() 435611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 435711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel assert(m_meta_buffer_array != NULL); 435811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 435911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel free(m_meta_buffer_array); 436011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 436111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_meta_buffer_array = NULL; 436211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 436311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 436411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 436511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Add meta buffer reference. 436611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 436711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] index: Buffer index. 436811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] fd: File descriptor. 436911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 437011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_swvdec::meta_buffer_ref_add(unsigned int index, int fd) 437111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 437211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_meta_buffer_array[index].ref_count == 0) 437311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 437411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_meta_buffer_array[index].fd = fd; 437511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 437611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 437711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_meta_buffer_array[index].ref_count++; 437811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 437911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 438011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 438111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Remove meta buffer reference. 438211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 438311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] index: Buffer index. 438411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 438511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_swvdec::meta_buffer_ref_remove(unsigned int index) 438611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 438711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&m_meta_buffer_array_mutex); 438811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 438911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_meta_buffer_array[index].ref_count--; 439011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 439111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_meta_buffer_array[index].ref_count == 0) 439211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 439311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_meta_buffer_array[index].fd = -1; 439411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 439511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel munmap(m_buffer_array_op[index].buffer_payload.bufferaddr, 439611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_op[index].buffer_payload.mmaped_size); 439711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 439811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_op[index].buffer_payload.bufferaddr = NULL; 439911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_op[index].buffer_payload.offset = 0; 440011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_op[index].buffer_payload.mmaped_size = 0; 440111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 440211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_op[index].buffer_swvdec.p_buffer = NULL; 440311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_op[index].buffer_swvdec.size = 0; 440411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 440511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 440611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&m_meta_buffer_array_mutex); 440711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 440811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 440911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 441011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Split MPEG-4 bitstream buffer into multiple frames (if they exist). 441111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 441211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in,out] offset_array: Array of offsets to frame headers. 441311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_buffer_hdr: Pointer to buffer header. 441411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 441511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval Number of frames in buffer. 441611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 441711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelunsigned int split_buffer_mpeg4(unsigned int *offset_array, 441811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *p_buffer_hdr) 441911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 442011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned char *p_buffer = p_buffer_hdr->pBuffer; 442111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 442211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int byte_count = 0; 442311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 442411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int num_frame_headers = 0; 442511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 442611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int next_4bytes; 442711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 442811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while ((byte_count < p_buffer_hdr->nFilledLen) && 442911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (num_frame_headers < OMX_SWVDEC_MAX_FRAMES_PER_ETB)) 443011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 443111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel next_4bytes = *((unsigned int *) p_buffer); 443211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 443311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel next_4bytes = __builtin_bswap32(next_4bytes); 443411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 443511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (next_4bytes == 0x000001B6) 443611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 443711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("%p, buffer %p: " 443811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "frame header at %d bytes offset", 443911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr, 444011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->pBuffer, 444111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel byte_count); 444211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 444311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel offset_array[num_frame_headers] = byte_count; 444411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 444511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel num_frame_headers++; 444611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 444711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer += 4; 444811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel byte_count += 4; 444911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 445011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 445111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 445211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer++; 445311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel byte_count++; 445411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 445511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 445611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 445711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return num_frame_headers; 445811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 445911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 446011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 446111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Check if ip port is populated, i.e., if all ip buffers are populated. 446211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 446311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval true 446411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval false 446511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 446611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_BOOL omx_swvdec::port_ip_populated() 446711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 446811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BOOL retval = OMX_FALSE; 446911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 447011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_buffer_array_ip != NULL) 447111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 447211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int ii; 447311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 447411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (ii = 0; ii < m_port_ip.def.nBufferCountActual; ii++) 447511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 447611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_buffer_array_ip[ii].buffer_populated == false) 447711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 447811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 447911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 448011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 448111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 448211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ii == m_port_ip.def.nBufferCountActual) 448311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 448411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_TRUE; 448511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 448611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 448711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 448811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 448911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 449011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 449111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 449211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Check if op port is populated, i.e., if all op buffers are populated. 449311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 449411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval true 449511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval false 449611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 449711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_BOOL omx_swvdec::port_op_populated() 449811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 449911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BOOL retval = OMX_FALSE; 450011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 450111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_buffer_array_op != NULL) 450211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 450311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int ii; 450411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 450511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (ii = 0; ii < m_port_op.def.nBufferCountActual; ii++) 450611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 450711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_buffer_array_op[ii].buffer_populated == false) 450811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 450911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 451011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 451111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 451211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 451311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ii == m_port_op.def.nBufferCountActual) 451411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 451511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_TRUE; 451611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 451711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 451811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 451911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 452011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 452111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 452211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 452311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Flush input, output, or both input & output ports. 452411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 452511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] port_index: Index of port to flush. 452611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 452711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 452811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 452911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::flush(unsigned int port_index) 453011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 453111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 453211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 453311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (((port_index == OMX_CORE_PORT_INDEX_IP) && 453411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.flush_inprogress) || 453511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((port_index == OMX_CORE_PORT_INDEX_OP) && 453611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.flush_inprogress) || 453711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((port_index == OMX_ALL) && 453811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.flush_inprogress && 453911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.flush_inprogress)) 454011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 454111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("flush port index %d already in progress", 454211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel port_index); 454311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 454411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 454511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 454611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_FLUSH_TYPE swvdec_flush_type; 454711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 454811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS retval_swvdec; 454911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 455011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (port_index == OMX_CORE_PORT_INDEX_IP) 455111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 455211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.flush_inprogress = OMX_TRUE; 455311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 455411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // no separate SwVdec flush type for input 455511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 455611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (port_index == OMX_CORE_PORT_INDEX_OP) 455711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 455811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.flush_inprogress = OMX_TRUE; 455911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 456011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel swvdec_flush_type = (m_port_ip.flush_inprogress ? 456111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_FLUSH_TYPE_ALL : 456211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_FLUSH_TYPE_OP); 456311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 456411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval_swvdec = swvdec_flush(m_swvdec_handle, 456511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel swvdec_flush_type)) != 456611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS_SUCCESS) 456711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 456811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = retval_swvdec2omx(retval_swvdec); 456911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 457011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 457111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (port_index == OMX_ALL) 457211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 457311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.flush_inprogress = OMX_TRUE; 457411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.flush_inprogress = OMX_TRUE; 457511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 457611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel swvdec_flush_type = SWVDEC_FLUSH_TYPE_ALL; 457711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 457811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval_swvdec = swvdec_flush(m_swvdec_handle, 457911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel swvdec_flush_type)) != 458011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS_SUCCESS) 458111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 458211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = retval_swvdec2omx(retval_swvdec); 458311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 458411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 458511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 458611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 458711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel assert(0); 458811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 458911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 459011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 459111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 459211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 459311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 459411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 459511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Allocate & map ION memory. 459611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 459711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_swvdec::ion_memory_alloc_map(struct ion_allocation_data *p_alloc_data, 459811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct ion_fd_data *p_fd_data, 459911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 size, 460011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 alignment) 460111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 460211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int fd = -EINVAL; 460311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = -EINVAL; 460411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 460511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((p_alloc_data == NULL) || (p_fd_data == NULL) || (size == 0)) 460611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 460711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("invalid arguments"); 460811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto ion_memory_alloc_map_exit; 460911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 461011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 461111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((fd = open("/dev/ion", O_RDONLY)) < 0) 461211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 461311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("failed to open ion device; fd = %d", fd); 461411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto ion_memory_alloc_map_exit; 461511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 461611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 461711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_alloc_data->len = size; 461811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_alloc_data->align = (alignment < 4096) ? 4096 : alignment; 461911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_alloc_data->heap_id_mask = ION_HEAP(ION_IOMMU_HEAP_ID); 462011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_alloc_data->flags = 0; 462111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 462211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_LOW("heap_id_mask 0x%08x, len %zu, align %zu", 462311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_alloc_data->heap_id_mask, 462411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_alloc_data->len, 462511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_alloc_data->align); 462611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 462711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(fd, ION_IOC_ALLOC, p_alloc_data); 462811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 462911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc || (p_alloc_data->handle == 0)) 463011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 463111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("ioctl() for allocation failed"); 463211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 463311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(fd); 463411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd = -ENOMEM; 463511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 463611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto ion_memory_alloc_map_exit; 463711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 463811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 463911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_fd_data->handle = p_alloc_data->handle; 464011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 464111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(fd, ION_IOC_MAP, p_fd_data)) 464211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 464311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_ion ion_buf_info; 464411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 464511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("ioctl() for mapping failed"); 464611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 464711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ion_buf_info.ion_alloc_data = *p_alloc_data; 464811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ion_buf_info.ion_fd_device = fd; 464911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ion_buf_info.ion_fd_data = *p_fd_data; 465011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 465111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ion_memory_free(&ion_buf_info); 465211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 465311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_fd_data->fd = -1; 465411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 465511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(fd); 465611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd = -ENOMEM; 465711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 465811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto ion_memory_alloc_map_exit; 465911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 466011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 466111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelion_memory_alloc_map_exit: 466211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return fd; 466311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 466411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 466511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 466611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Free ION memory. 466711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 466811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_swvdec::ion_memory_free(struct vdec_ion *p_ion_buf_info) 466911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 467011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_ion_buf_info == NULL) 467111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 467211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("p_ion_buf_info = NULL"); 467311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto ion_memory_free_exit; 467411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 467511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 467611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(p_ion_buf_info->ion_fd_device, 467711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ION_IOC_FREE, 467811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &p_ion_buf_info->ion_alloc_data.handle)) 467911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 468011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("ioctl() for freeing failed"); 468111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 468211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 468311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(p_ion_buf_info->ion_fd_device); 468411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 468511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_ion_buf_info->ion_fd_device = -1; 468611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_ion_buf_info->ion_alloc_data.handle = 0; 468711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_ion_buf_info->ion_fd_data.fd = -1; 468811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 468911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelion_memory_free_exit: 469011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 469111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 469211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 469311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 469411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Flush cached ION output buffer. 469511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 469611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] index: Index of buffer in output buffer info array. 469711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 469811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_swvdec::ion_flush_op(unsigned int index) 469911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 470011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (index < m_port_op.def.nBufferCountActual) 470111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 470211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct vdec_bufferpayload *p_buffer_payload = 470311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &m_buffer_array_op[index].buffer_payload; 470411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 470511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(p_buffer_payload) 470611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 470711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(p_buffer_payload->bufferaddr != NULL) 470811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 470911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel __builtin___clear_cache(reinterpret_cast<char*>((size_t*)p_buffer_payload->bufferaddr), 471011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel reinterpret_cast<char*>((size_t*)p_buffer_payload->bufferaddr +p_buffer_payload->buffer_len)); 471111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 471211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 471311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 471411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 471511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 471611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("buffer index '%d' invalid", index); 471711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 471811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 471911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 472011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 472111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 472211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 472311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * ---------------------------- 472411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * component callback functions 472511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * ---------------------------- 472611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 472711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 472811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 472911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Empty buffer done callback. 473011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 473111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_buffer_ip: Pointer to input buffer structure. 473211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 473311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_swvdec::swvdec_empty_buffer_done(SWVDEC_BUFFER *p_buffer_ip) 473411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 473511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long index = (unsigned long) p_buffer_ip->p_client_data; 473611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 473711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_ip[index].buffer_header.nFilledLen = 473811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_ip->filled_length; 473911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 474011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_post_event(OMX_SWVDEC_EVENT_EBD, 474111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned long) &m_buffer_array_ip[index].buffer_header, 474211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel index); 474311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 474411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 474511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 474611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Fill buffer done callback. 474711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 474811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_buffer_op: Pointer to output buffer structure. 474911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 475011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_swvdec::swvdec_fill_buffer_done(SWVDEC_BUFFER *p_buffer_op) 475111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 475211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long index = (unsigned long) p_buffer_op->p_client_data; 475311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 475411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *p_buffer_hdr; 475511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 475611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (index < ((unsigned long) m_port_op.def.nBufferCountActual)) 475711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 475811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr = &m_buffer_array_op[index].buffer_header; 475911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 476011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->nFlags = p_buffer_op->flags; 476111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->nTimeStamp = p_buffer_op->timestamp; 476211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->nFilledLen = ((m_meta_buffer_mode && 476311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_op->filled_length) ? 476411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->nAllocLen : 476511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_op->filled_length); 476611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 476711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 476811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_post_event(OMX_SWVDEC_EVENT_FBD, 476911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned long) &m_buffer_array_op[index].buffer_header, 477011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel index); 477111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 477211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 477311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 477411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Event handler callback. 477511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 477611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] event: Event. 477711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_data: Pointer to event-specific data. 477811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 477911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_swvdec::swvdec_event_handler(SWVDEC_EVENT event, void *p_data) 478011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 478111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (event) 478211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 478311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 478411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case SWVDEC_EVENT_FLUSH_ALL_DONE: 478511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 478611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_post_event(OMX_SWVDEC_EVENT_FLUSH_PORT_IP, 0, 0); 478711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_post_event(OMX_SWVDEC_EVENT_FLUSH_PORT_OP, 0, 0); 478811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 478911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 479011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 479111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 479211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case SWVDEC_EVENT_FLUSH_OP_DONE: 479311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 479411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_post_event(OMX_SWVDEC_EVENT_FLUSH_PORT_OP, 0, 0); 479511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 479611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 479711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 479811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 479911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case SWVDEC_EVENT_RELEASE_REFERENCE: 480011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 480111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_BUFFER *p_buffer_op = (SWVDEC_BUFFER *) p_data; 480211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 480311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long index = (unsigned long) p_buffer_op->p_client_data; 480411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 480511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_LOW("release reference: %p", p_buffer_op->p_buffer); 480611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 480711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel assert(index < ((unsigned long) m_port_op.def.nBufferCountActual)); 480811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 480911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_meta_buffer_mode) 481011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 481111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel meta_buffer_ref_remove(index); 481211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 481311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 481411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 481511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 481611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 481711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case SWVDEC_EVENT_RECONFIG_REQUIRED: 481811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 481911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_post_event(OMX_SWVDEC_EVENT_PORT_RECONFIG, 0, 0); 482011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 482111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 482211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 482311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 482411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case SWVDEC_EVENT_DIMENSIONS_UPDATED: 482511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 482611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_post_event(OMX_SWVDEC_EVENT_DIMENSIONS_UPDATED, 0, 0); 482711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 482811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 482911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 483011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 483111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case SWVDEC_EVENT_FATAL_ERROR: 483211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 483311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 483411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_post_event(OMX_SWVDEC_EVENT_ERROR, OMX_ErrorHardware, 0); 483511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 483611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 483711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 483811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 483911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 484011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 484111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 484211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 484311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Translate SwVdec status return value to OMX error type return value. 484411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 484511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] retval_swvdec: SwVdec status return value. 484611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 484711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 484811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 484911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::retval_swvdec2omx(SWVDEC_STATUS retval_swvdec) 485011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 485111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval_omx; 485211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 485311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (retval_swvdec) 485411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 485511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 485611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS_SUCCESS: 485711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval_omx = OMX_ErrorNone; 485811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 485911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 486011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS_FAILURE: 486111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval_omx = OMX_ErrorUndefined; 486211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 486311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 486411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS_NULL_POINTER: 486511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS_INVALID_PARAMETERS: 486611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval_omx = OMX_ErrorBadParameter; 486711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 486811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 486911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS_INVALID_STATE: 487011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval_omx = OMX_ErrorInvalidState; 487111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 487211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 487311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS_INSUFFICIENT_RESOURCES: 487411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval_omx = OMX_ErrorInsufficientResources; 487511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 487611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 487711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS_UNSUPPORTED: 487811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval_omx = OMX_ErrorUnsupportedSetting; 487911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 488011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 488111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS_NOT_IMPLEMENTED: 488211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval_omx = OMX_ErrorNotImplemented; 488311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 488411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 488511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 488611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval_omx = OMX_ErrorUndefined; 488711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 488811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 488911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 489011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 489111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval_omx; 489211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 489311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 489411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 489511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Create asynchronous thread. 489611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 489711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 489811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 489911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::async_thread_create() 490011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 490111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 490211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 490311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_attr_t thread_attributes; 490411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 490511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (sem_init(&m_async_thread.sem_thread_created, 0, 0)) 490611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 490711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("failed to create async thread created semaphore"); 490811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 490911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInsufficientResources; 491011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 491111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (sem_init(&m_async_thread.sem_event, 0, 0)) 491211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 491311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("failed to create async thread event semaphore"); 491411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 491511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInsufficientResources; 491611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 491711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (pthread_attr_init(&thread_attributes)) 491811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 491911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("failed to create thread attributes object"); 492011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 492111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInsufficientResources; 492211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 492311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (pthread_attr_setdetachstate(&thread_attributes, 492411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PTHREAD_CREATE_JOINABLE)) 492511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 492611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("failed to set detach state attribute"); 492711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 492811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInsufficientResources; 492911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 493011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_attr_destroy(&thread_attributes); 493111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 493211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 493311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 493411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_async_thread.created = false; 493511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_async_thread.exit = false; 493611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 493711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pthread_create(&m_async_thread.handle, 493811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &thread_attributes, 493911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void *(*)(void *)) async_thread, 494011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel this)) 494111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 494211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("failed to create async thread"); 494311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 494411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInsufficientResources; 494511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 494611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_attr_destroy(&thread_attributes); 494711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 494811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 494911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 495011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pthread_setname_np(m_async_thread.handle, "swvdec_async")) 495111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 495211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // don't return error 495311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("failed to set async thread name"); 495411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 495511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 495611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_wait(&m_async_thread.sem_thread_created); 495711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 495811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_async_thread.created = true; 495911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 496011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 496111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 496211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 496311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 496411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 496511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 496611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Destroy asynchronous thread. 496711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 496811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_swvdec::async_thread_destroy() 496911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 497011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_async_thread.created) 497111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 497211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_async_thread.exit = true; 497311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 497411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_post(&m_async_thread.sem_event); 497511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 497611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_join(m_async_thread.handle, NULL); 497711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 497811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_async_thread.created = false; 497911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 498011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 498111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_async_thread.exit = false; 498211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 498311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_destroy(&m_async_thread.sem_event); 498411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_destroy(&m_async_thread.sem_thread_created); 498511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 498611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 498711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 498811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Post event to appropriate queue. 498911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 499011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] event_id: Event ID. 499111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] event_param1: Event parameter 1. 499211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] event_param2: Event parameter 2. 499311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 499411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_swvdec::async_post_event(unsigned long event_id, 499511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long event_param1, 499611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long event_param2) 499711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 499811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_EVENT_INFO event_info; 499911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 500011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel event_info.event_id = event_id; 500111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel event_info.event_param1 = event_param1; 500211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel event_info.event_param2 = event_param2; 500311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 500411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (event_id) 500511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 500611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 500711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_SWVDEC_EVENT_ETB: 500811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_SWVDEC_EVENT_EBD: 500911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 501011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_queue_port_ip.push(&event_info); 501111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 501211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 501311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 501411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_SWVDEC_EVENT_FTB: 501511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_SWVDEC_EVENT_FBD: 501611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 501711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_queue_port_op.push(&event_info); 501811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 501911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 502011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 502111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 502211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 502311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_queue_command.push(&event_info); 502411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 502511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 502611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 502711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 502811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 502911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_post(&m_async_thread.sem_event); 503011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 503111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 503211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 503311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Asynchronous thread. 503411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 503511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_cmp: Pointer to OMX SwVdec component class. 503611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 503711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_swvdec::async_thread(void *p_cmp) 503811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 503911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_cmp == NULL) 504011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 504111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("p_cmp = NULL"); 504211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 504311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 504411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 504511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_swvdec *p_omx_swvdec = (omx_swvdec *) p_cmp; 504611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 504711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ASYNC_THREAD *p_async_thread = &p_omx_swvdec->m_async_thread; 504811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 504911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("created"); 505011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 505111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_post(&p_async_thread->sem_thread_created); 505211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 505311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (p_async_thread->exit == false) 505411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 505511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_wait(&p_async_thread->sem_event); 505611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 505711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_async_thread->exit == true) 505811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 505911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 506011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 506111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 506211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_omx_swvdec->async_process_event(p_cmp); 506311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 506411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 506511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 506611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("exiting"); 506711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 506811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 506911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 507011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Process event. 507111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 507211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_cmp: Pointer to OMX SwVdec component class. 507311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 507411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_swvdec::async_process_event(void *p_cmp) 507511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 507611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_swvdec *p_omx_swvdec; 507711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 507811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_EVENT_INFO event_info; 507911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 508011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 508111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 508211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_cmp == NULL) 508311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 508411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("p_cmp = NULL"); 508511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 508611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto async_process_event_exit; 508711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 508811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 508911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_omx_swvdec = (omx_swvdec *) p_cmp; 509011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 509111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // NOTE: queues popped in order of priority; do not change! 509211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 509311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((p_omx_swvdec->m_queue_command.pop(&event_info) == false) && 509411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (p_omx_swvdec->m_queue_port_op.pop(&event_info) == false) && 509511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (p_omx_swvdec->m_queue_port_ip.pop(&event_info) == false)) 509611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 509711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_LOW("no event popped"); 509811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 509911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel goto async_process_event_exit; 510011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 510111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 510211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (event_info.event_id) 510311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 510411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 510511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_SWVDEC_EVENT_CMD: 510611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 510711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMMANDTYPE cmd = (OMX_COMMANDTYPE) event_info.event_param1; 510811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 param = (OMX_U32) event_info.event_param2; 510911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 511011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = p_omx_swvdec->async_process_event_cmd(cmd, param); 511111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 511211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 511311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 511411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_SWVDEC_EVENT_CMD_ACK: 511511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 511611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMMANDTYPE cmd = (OMX_COMMANDTYPE) event_info.event_param1; 511711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 param = (OMX_U32) event_info.event_param2; 511811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 511911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = p_omx_swvdec->async_process_event_cmd_ack(cmd, param); 512011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 512111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 512211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 512311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_SWVDEC_EVENT_ERROR: 512411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 512511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE error_code = (OMX_ERRORTYPE) event_info.event_param1; 512611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 512711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = p_omx_swvdec->async_process_event_error(error_code); 512811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 512911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 513011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 513111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_SWVDEC_EVENT_ETB: 513211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 513311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *p_buffer_hdr = 513411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *) event_info.event_param1; 513511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 513611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int index = event_info.event_param2; 513711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 513811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = p_omx_swvdec->async_process_event_etb(p_buffer_hdr, index); 513911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 514011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 514111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 514211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_SWVDEC_EVENT_FTB: 514311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 514411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *p_buffer_hdr = 514511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *) event_info.event_param1; 514611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 514711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int index = event_info.event_param2; 514811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 514911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = p_omx_swvdec->async_process_event_ftb(p_buffer_hdr, index); 515011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 515111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 515211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 515311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_SWVDEC_EVENT_EBD: 515411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 515511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *p_buffer_hdr = 515611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *) event_info.event_param1; 515711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 515811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int index = event_info.event_param2; 515911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 516011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = p_omx_swvdec->async_process_event_ebd(p_buffer_hdr, index); 516111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 516211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 516311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 516411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_SWVDEC_EVENT_FBD: 516511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 516611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *p_buffer_hdr = 516711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_BUFFERHEADERTYPE *) event_info.event_param1; 516811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 516911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int index = event_info.event_param2; 517011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 517111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = p_omx_swvdec->async_process_event_fbd(p_buffer_hdr, index); 517211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 517311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 517411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 517511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_SWVDEC_EVENT_EOS: 517611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 517711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = p_omx_swvdec->async_process_event_eos(); 517811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 517911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 518011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 518111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_SWVDEC_EVENT_FLUSH_PORT_IP: 518211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 518311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = p_omx_swvdec->async_process_event_flush_port_ip(); 518411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 518511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 518611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 518711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_SWVDEC_EVENT_FLUSH_PORT_OP: 518811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 518911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = p_omx_swvdec->async_process_event_flush_port_op(); 519011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 519111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 519211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 519311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_SWVDEC_EVENT_PORT_RECONFIG: 519411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 519511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = p_omx_swvdec->async_process_event_port_reconfig(); 519611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 519711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 519811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 519911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_SWVDEC_EVENT_DIMENSIONS_UPDATED: 520011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 520111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = p_omx_swvdec->async_process_event_dimensions_updated(); 520211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 520311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 520411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 520511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 520611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 520711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel assert(0); 520811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 520911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorUndefined; 521011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 521111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 521211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 521311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 521411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 521511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (retval != OMX_ErrorNone) 521611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 521711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_omx_swvdec->async_post_event(OMX_SWVDEC_EVENT_ERROR, retval, 0); 521811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 521911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 522011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelasync_process_event_exit: 522111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return; 522211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 522311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 522411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 522511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Process command event. 522611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 522711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] cmd: Command. 522811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] param: Command parameter. 522911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 523011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 523111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 523211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::async_process_event_cmd(OMX_COMMANDTYPE cmd, 523311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 param) 523411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 523511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 523611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 523711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool cmd_ack = false; 523811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 523911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS retval_swvdec; 524011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 524111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (cmd) 524211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 524311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 524411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_CommandStateSet: 524511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 524611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = async_process_event_cmd_state_set(&cmd_ack, 524711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_STATETYPE) param); 524811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 524911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 525011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 525111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_CommandFlush: 525211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 525311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = async_process_event_cmd_flush((unsigned int) param); 525411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 525511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 525611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 525711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_CommandPortDisable: 525811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 525911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = async_process_event_cmd_port_disable(&cmd_ack, 526011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int) param); 526111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 526211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 526311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 526411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_CommandPortEnable: 526511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 526611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = async_process_event_cmd_port_enable(&cmd_ack, 526711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int) param); 526811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 526911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 527011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 527111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 527211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 527311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("cmd '%d' invalid", (int) cmd); 527411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 527511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 527611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 527711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 527811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 527911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } // switch (cmd) 528011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 528111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (retval != OMX_ErrorNone) 528211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 528311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_post_event(OMX_SWVDEC_EVENT_ERROR, retval, 0); 528411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 528511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (cmd_ack) 528611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 528711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_post_event(OMX_SWVDEC_EVENT_CMD_ACK, cmd, param); 528811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 528911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 529011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sem_post(&m_sem_cmd); 529111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 529211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 529311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 529411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 529511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 529611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Process command acknowledgement event. 529711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 529811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] cmd: Command. 529911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] param: Command parameter. 530011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 530111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 530211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 530311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::async_process_event_cmd_ack(OMX_COMMANDTYPE cmd, 530411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 param) 530511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 530611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 530711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 530811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (cmd) 530911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 531011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 531111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_CommandStateSet: 531211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 531311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("%s -> %s", 531411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_STATETYPE_STRING(m_state), 531511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_STATETYPE_STRING((OMX_STATETYPE) param)); 531611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 531711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state = (OMX_STATETYPE) param; 531811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 531911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_CALLBACK("EventHandler(): OMX_EventCmdComplete, " 532011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX_CommandStateSet, %s", 532111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_STATETYPE_STRING(m_state)); 532211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 532311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_callback.EventHandler(&m_cmp, 532411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_app_data, 532511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete, 532611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CommandStateSet, 532711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_U32) m_state, 532811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel NULL); 532911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 533011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 533111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 533211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_CommandFlush: 533311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_CommandPortEnable: 533411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_CommandPortDisable: 533511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 533611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((cmd == OMX_CommandPortEnable) && m_port_reconfig_inprogress) 533711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 533811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_reconfig_inprogress = false; 533911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 534011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 534111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_CALLBACK("EventHandler(): OMX_EventCmdComplete, " 534211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "%s, port index %d", 534311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMMANDTYPE_STRING(cmd), 534411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel param); 534511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 534611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_callback.EventHandler(&m_cmp, 534711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_app_data, 534811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventCmdComplete, 534911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel cmd, 535011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel param, 535111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel NULL); 535211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 535311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 535411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 535511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 535611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 535711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("cmd '%d' invalid", (int) cmd); 535811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 535911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 536011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 536111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 536211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 536311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } // switch (cmd) 536411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 536511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 536611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 536711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 536811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 536911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Process error event. 537011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 537111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] error_code: Error code. 537211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 537311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ErrorNone 537411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 537511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::async_process_event_error(OMX_ERRORTYPE error_code) 537611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 537711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (error_code == OMX_ErrorInvalidState) 537811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 537911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("%s -> OMX_StateInvalid", 538011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_STATETYPE_STRING(m_state)); 538111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 538211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_state = OMX_StateInvalid; 538311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 538411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 538511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_CALLBACK("EventHandler(): OMX_EventError, 0x%08x", 538611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel error_code); 538711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 538811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_callback.EventHandler(&m_cmp, 538911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_app_data, 539011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventError, 539111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_U32) error_code, 539211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 0, 539311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel NULL); 539411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 539511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 539611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 539711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 539811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 539911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Process OMX_CommandStateSet. 540011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 540111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in,out] p_cmd_ack: Pointer to 'command acknowledge' boolean variable. 540211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] state_new: New state to which transition is requested. 540311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 540411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 540511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 540611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::async_process_event_cmd_state_set( 540711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool *p_cmd_ack, 540811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_STATETYPE state_new) 540911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 541011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 541111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 541211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS retval_swvdec; 541311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 541411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("'%s-to-%s' requested", 541511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_STATETYPE_STRING(m_state), 541611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_STATETYPE_STRING(state_new)); 541711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 541811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /** 541911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Only the following state transitions are allowed via CommandStateSet: 542011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 542111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * LOADED -> IDLE -> EXECUTING 542211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * LOADED <- IDLE <- EXECUTING 542311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 542411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 542511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_state == OMX_StateInvalid) 542611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 542711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("in state %s", OMX_STATETYPE_STRING(m_state)); 542811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 542911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInvalidState; 543011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 543111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (state_new == OMX_StateInvalid) 543211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 543311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("requested transition to state %s", 543411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_STATETYPE_STRING(state_new)); 543511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 543611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorInvalidState; 543711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 543811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if ((m_state == OMX_StateLoaded) && 543911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (state_new == OMX_StateIdle)) 544011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 544111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((m_port_ip.populated == OMX_TRUE) && 544211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_port_op.populated == OMX_TRUE)) 544311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 544411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval_swvdec = swvdec_start(m_swvdec_handle)) == 544511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS_SUCCESS) 544611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 544711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *p_cmd_ack = true; 544811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 544911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 545011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 545111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("failed to start SwVdec"); 545211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 545311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = retval_swvdec2omx(retval_swvdec); 545411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 545511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 545611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 545711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 545811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_status_flags |= (1 << PENDING_STATE_LOADED_TO_IDLE); 545911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 546011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_LOW("'loaded-to-idle' pending"); 546111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 546211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 546311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if ((m_state == OMX_StateIdle) && 546411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (state_new == OMX_StateExecuting)) 546511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 546611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *p_cmd_ack = true; 546711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 546811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if ((m_state == OMX_StateExecuting) && 546911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (state_new == OMX_StateIdle)) 547011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 547111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_status_flags |= (1 << PENDING_STATE_EXECUTING_TO_IDLE); 547211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 547311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_LOW("'executing-to-idle' pending"); 547411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 547511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = flush(OMX_ALL); 547611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 547711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if ((m_state == OMX_StateIdle) && 547811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (state_new == OMX_StateLoaded)) 547911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 548011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((m_port_ip.unpopulated == OMX_TRUE) && 548111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_port_op.unpopulated == OMX_TRUE)) 548211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 548311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval_swvdec = swvdec_stop(m_swvdec_handle)) == 548411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS_SUCCESS) 548511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 548611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *p_cmd_ack = true; 548711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 548811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 548911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 549011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("failed to stop SwVdec"); 549111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 549211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = retval_swvdec2omx(retval_swvdec); 549311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 549411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 549511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 549611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 549711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_status_flags |= (1 << PENDING_STATE_IDLE_TO_LOADED); 549811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 549911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_LOW("'idle-to-loaded' pending"); 550011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 550111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 550211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 550311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 550411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("state transition '%s -> %s' illegal", 550511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_STATETYPE_STRING(m_state), 550611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_STATETYPE_STRING(state_new)); 550711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 550811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = ((state_new == m_state) ? 550911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ErrorSameState : 551011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ErrorIncorrectStateTransition); 551111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 551211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 551311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 551411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 551511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 551611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 551711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Process OMX_CommandFlush. 551811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 551911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] port_index: Index of port to flush. 552011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 552111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 552211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 552311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::async_process_event_cmd_flush(unsigned int port_index) 552411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 552511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 552611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 552711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("flush port index %d requested", port_index); 552811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 552911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (port_index == OMX_CORE_PORT_INDEX_IP) 553011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 553111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_status_flags |= (1 << PENDING_PORT_FLUSH_IP); 553211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 553311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_LOW("ip port flush pending"); 553411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 553511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (port_index == OMX_CORE_PORT_INDEX_OP) 553611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 553711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_status_flags |= (1 << PENDING_PORT_FLUSH_OP); 553811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 553911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_LOW("op port flush pending"); 554011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 554111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (port_index == OMX_ALL) 554211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 554311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_status_flags |= (1 << PENDING_PORT_FLUSH_IP); 554411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_status_flags |= (1 << PENDING_PORT_FLUSH_OP); 554511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 554611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_LOW("ip & op ports flush pending"); 554711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 554811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 554911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = flush(port_index); 555011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 555111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 555211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 555311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 555411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 555511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Process OMX_CommandPortDisable. 555611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 555711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in,out] p_cmd_ack: Pointer to 'command acknowledge' boolean variable. 555811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] port_index: Index of port to disable. 555911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 556011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 556111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 556211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::async_process_event_cmd_port_disable( 556311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool *p_cmd_ack, 556411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int port_index) 556511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 556611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 556711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 556811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("disable port index %d requested", port_index); 556911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 557011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (port_index == OMX_CORE_PORT_INDEX_IP) 557111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 557211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_port_ip.enabled == OMX_FALSE) 557311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 557411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("ip port already disabled"); 557511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 557611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadPortIndex; 557711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 557811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 557911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 558011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.enabled = OMX_FALSE; 558111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 558211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_port_ip.unpopulated) 558311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 558411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *p_cmd_ack = true; 558511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 558611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 558711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 558811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_status_flags |= (1 << PENDING_PORT_DISABLE_IP); 558911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 559011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_LOW("ip port disable pending"); 559111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 559211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_port_ip.num_pending_buffers) 559311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 559411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = flush(port_index); 559511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 559611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 559711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 559811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 559911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (port_index == OMX_CORE_PORT_INDEX_OP) 560011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 560111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_port_op.enabled == OMX_FALSE) 560211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 560311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("op port already disabled"); 560411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 560511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadPortIndex; 560611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 560711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 560811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 560911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.enabled = OMX_FALSE; 561011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 561111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_port_op.unpopulated) 561211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 561311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *p_cmd_ack = true; 561411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 561511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 561611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 561711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_status_flags |= (1 << PENDING_PORT_DISABLE_OP); 561811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 561911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_LOW("op port disable pending"); 562011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 562111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_port_op.num_pending_buffers) 562211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 562311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = flush(port_index); 562411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 562511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 562611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 562711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 562811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (port_index == OMX_ALL) 562911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 563011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_port_ip.enabled == OMX_FALSE) 563111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 563211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("ip port already disabled"); 563311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 563411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadPortIndex; 563511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 563611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_port_op.enabled == OMX_FALSE) 563711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 563811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("op port already disabled"); 563911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 564011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadPortIndex; 564111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 564211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 564311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 564411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_port_ip.unpopulated && m_port_op.unpopulated) 564511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 564611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *p_cmd_ack = true; 564711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 564811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 564911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 565011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.enabled = OMX_FALSE; 565111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.enabled = OMX_FALSE; 565211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 565311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_port_ip.unpopulated == OMX_FALSE) 565411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 565511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_status_flags |= (1 << PENDING_PORT_DISABLE_IP); 565611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 565711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_LOW("ip port disable pending"); 565811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 565911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_port_ip.num_pending_buffers) 566011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 566111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = flush(port_index); 566211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 566311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 566411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 566511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval == OMX_ErrorNone) && 566611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_port_op.unpopulated == OMX_FALSE)) 566711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 566811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_status_flags |= (1 << PENDING_PORT_DISABLE_OP); 566911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 567011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_LOW("op port disable pending"); 567111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 567211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_port_op.num_pending_buffers) 567311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 567411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = flush(port_index); 567511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 567611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 567711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 567811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 567911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 568011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 568111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 568211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", 568311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel port_index); 568411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 568511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadPortIndex; 568611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 568711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 568811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 568911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 569011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 569111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 569211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Process OMX_CommandPortEnable. 569311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 569411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in,out] p_cmd_ack: Pointer to 'command acknowledge' boolean variable. 569511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] port_index: Index of port to enable. 569611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 569711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 569811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 569911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::async_process_event_cmd_port_enable( 570011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool *p_cmd_ack, 570111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int port_index) 570211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 570311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 570411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 570511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("enable port index %d requested", port_index); 570611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 570711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (port_index == OMX_CORE_PORT_INDEX_IP) 570811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 570911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_port_ip.enabled) 571011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 571111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("ip port already enabled"); 571211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 571311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadPortIndex; 571411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 571511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 571611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 571711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.enabled = OMX_TRUE; 571811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 571911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_port_ip.populated) 572011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 572111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *p_cmd_ack = true; 572211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 572311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 572411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 572511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_status_flags |= (1 << PENDING_PORT_ENABLE_IP); 572611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 572711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_LOW("ip port enable pending"); 572811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 572911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 573011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 573111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (port_index == OMX_CORE_PORT_INDEX_OP) 573211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 573311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_port_op.enabled) 573411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 573511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("op port already enabled"); 573611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 573711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadPortIndex; 573811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 573911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 574011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 574111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.enabled = OMX_TRUE; 574211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 574311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_port_op.populated) 574411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 574511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *p_cmd_ack = true; 574611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 574711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 574811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 574911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_status_flags |= (1 << PENDING_PORT_ENABLE_OP); 575011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 575111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_LOW("op port enable pending"); 575211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 575311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 575411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 575511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (port_index == OMX_ALL) 575611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 575711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_port_ip.enabled) 575811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 575911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("ip port already enabled"); 576011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 576111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadPortIndex; 576211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 576311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_port_op.enabled) 576411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 576511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("op port already enabled"); 576611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 576711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadPortIndex; 576811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 576911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 577011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 577111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.enabled = OMX_TRUE; 577211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.enabled = OMX_TRUE; 577311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 577411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_port_ip.populated && m_port_op.populated) 577511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 577611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *p_cmd_ack = true; 577711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 577811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_port_ip.populated == false) 577911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 578011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_status_flags |= (1 << PENDING_PORT_ENABLE_IP); 578111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 578211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_LOW("ip port enable pending"); 578311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 578411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_port_op.populated == false) 578511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 578611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_status_flags |= (1 << PENDING_PORT_ENABLE_OP); 578711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 578811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_LOW("op port enable pending"); 578911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 579011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 579111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 579211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 579311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 579411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", 579511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel port_index); 579611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 579711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadPortIndex; 579811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 579911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 580011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 580111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 580211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 580311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 580411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Process ETB event. 580511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 580611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_buffer_hdr: Pointer to buffer header. 580711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] index: Index of buffer in input buffer info array. 580811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 580911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 581011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 581111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::async_process_event_etb( 581211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *p_buffer_hdr, 581311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int index) 581411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 581511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 581611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 581711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.num_pending_buffers++; 581811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 581911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((p_buffer_hdr->nFilledLen == 0) && 582011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((p_buffer_hdr->nFlags & OMX_BUFFERFLAG_EOS) == 0)) 582111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 582211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("returning %p, buffer %p; " 582311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "zero length & no EOS flag", 582411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr, 582511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->pBuffer); 582611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 582711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_post_event(OMX_SWVDEC_EVENT_EBD, 582811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned long) p_buffer_hdr, 582911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned long) index); 583011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 583111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_port_ip.flush_inprogress) 583211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 583311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("returning %p, buffer %p; " 583411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "ip port flush in progress", 583511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr, 583611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->pBuffer); 583711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 583811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_post_event(OMX_SWVDEC_EVENT_EBD, 583911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned long) p_buffer_hdr, 584011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned long) index); 584111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 584211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 584311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 584411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS retval_swvdec; 584511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 584611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_BUFFER *p_buffer_swvdec = 584711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &(m_buffer_array_ip[index].buffer_swvdec); 584811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 584911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_buffer_hdr->nFilledLen && 585011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((p_buffer_hdr->nFlags & OMX_BUFFERFLAG_CODECCONFIG) == 0)) 585111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 585211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_queue_timestamp.push(p_buffer_hdr->nTimeStamp); 585311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 585411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 585511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel assert(p_buffer_swvdec->p_buffer == p_buffer_hdr->pBuffer); 585611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 585711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_arbitrary_bytes_mode && 585811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->nFilledLen && 585911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((p_buffer_hdr->nFlags & OMX_BUFFERFLAG_CODECCONFIG) == 0)) 586011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 586111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int offset_array[OMX_SWVDEC_MAX_FRAMES_PER_ETB] = {0}; 586211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 586311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int num_frame_headers = 1; 586411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 586511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((m_omx_video_codingtype == 586611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((OMX_VIDEO_CODINGTYPE) QOMX_VIDEO_CodingDivx)) || 586711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_omx_video_codingtype == OMX_VIDEO_CodingMPEG4)) 586811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 586911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel num_frame_headers = split_buffer_mpeg4(offset_array, 587011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr); 587111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 587211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 587311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 587411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel assert(0); 587511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 587611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 587711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(num_frame_headers > 1) 587811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 587911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_ip[index].split_count = num_frame_headers - 1; 588011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 588111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (unsigned int ii = 0; ii < num_frame_headers; ii++) 588211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 588311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_swvdec->flags = p_buffer_hdr->nFlags; 588411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_swvdec->timestamp = p_buffer_hdr->nTimeStamp; 588511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 588611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ii == 0) 588711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 588811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_swvdec->offset = 0; 588911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_swvdec->filled_length = (offset_array[ii + 1] ? 589011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel offset_array[ii + 1] : 589111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->nFilledLen); 589211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 589311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 589411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 589511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_swvdec->offset = offset_array[ii]; 589611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_swvdec->filled_length = 589711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->nFilledLen - offset_array[ii]; 589811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 589911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 590011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_diag.dump_ip(p_buffer_swvdec->p_buffer + 590111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_swvdec->offset, 590211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_swvdec->filled_length); 590311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 590411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval_swvdec = swvdec_emptythisbuffer(m_swvdec_handle, 590511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_swvdec); 590611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 590711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (retval_swvdec != SWVDEC_STATUS_SUCCESS) 590811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 590911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = retval_swvdec2omx(retval_swvdec); 591011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 591111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 591211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 591311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 591411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 591511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 591611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("No frame detected for Buffer %p, with TS %lld", 591711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->pBuffer, p_buffer_hdr->nTimeStamp ); 591811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 591911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_swvdec->flags = p_buffer_hdr->nFlags; 592011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_swvdec->offset = 0; 592111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_swvdec->timestamp = p_buffer_hdr->nTimeStamp; 592211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_swvdec->filled_length = p_buffer_hdr->nFilledLen; 592311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 592411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_diag.dump_ip(p_buffer_swvdec->p_buffer + p_buffer_swvdec->offset, 592511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_swvdec->filled_length); 592611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 592711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval_swvdec = swvdec_emptythisbuffer(m_swvdec_handle, 592811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_swvdec); 592911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 593011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (retval_swvdec != SWVDEC_STATUS_SUCCESS) 593111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 593211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = retval_swvdec2omx(retval_swvdec); 593311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 593411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 593511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 593611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 593711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 593811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_swvdec->flags = p_buffer_hdr->nFlags; 593911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_swvdec->offset = 0; 594011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_swvdec->timestamp = p_buffer_hdr->nTimeStamp; 594111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_swvdec->filled_length = p_buffer_hdr->nFilledLen; 594211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 594311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_diag.dump_ip(p_buffer_swvdec->p_buffer + p_buffer_swvdec->offset, 594411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_swvdec->filled_length); 594511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 594611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval_swvdec = swvdec_emptythisbuffer(m_swvdec_handle, 594711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_swvdec); 594811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 594911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (retval_swvdec != SWVDEC_STATUS_SUCCESS) 595011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 595111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = retval_swvdec2omx(retval_swvdec); 595211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 595311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 595411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 595511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 595611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 595711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 595811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 595911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Process FTB event. 596011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 596111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_buffer_hdr: Pointer to buffer header. 596211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] index: Index of buffer in output buffer info array. 596311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 596411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 596511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 596611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::async_process_event_ftb( 596711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *p_buffer_hdr, 596811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int index) 596911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 597011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 597111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 597211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.num_pending_buffers++; 597311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 597411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_port_op.flush_inprogress) 597511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 597611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_HIGH("returning %p, buffer %p; " 597711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "op port flush in progress", 597811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr, 597911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_op[index].buffer_swvdec.p_buffer); 598011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 598111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_post_event(OMX_SWVDEC_EVENT_FBD, 598211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned long) p_buffer_hdr, 598311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned long) index); 598411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 598511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 598611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 598711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_STATUS retval_swvdec; 598811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 598911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel SWVDEC_BUFFER *p_buffer_swvdec = 599011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &(m_buffer_array_op[index].buffer_swvdec); 599111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 599211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval_swvdec = swvdec_fillthisbuffer(m_swvdec_handle, p_buffer_swvdec); 599311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 599411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (retval_swvdec != SWVDEC_STATUS_SUCCESS) 599511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 599611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = retval_swvdec2omx(retval_swvdec); 599711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 599811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 599911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 600011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 600111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 600211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 600311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 600411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Process EBD event. 600511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 600611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_buffer_hdr: Pointer to buffer header. 600711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] index: Index of buffer in output buffer info array. 600811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 600911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 601011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 601111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::async_process_event_ebd( 601211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *p_buffer_hdr, 601311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int index) 601411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 601511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 601611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 601711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (index < m_port_ip.def.nBufferCountActual) 601811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 601911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_arbitrary_bytes_mode && m_buffer_array_ip[index].split_count) 602011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 602111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_ip[index].split_count--; 602211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 602311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 602411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 602511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.num_pending_buffers--; 602611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 602711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_CALLBACK( 602811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "EmptyBufferDone(): %p, buffer %p", 602911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr, 603011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_buffer_array_ip[index].buffer_swvdec.p_buffer); 603111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 603211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_callback.EmptyBufferDone(&m_cmp, m_app_data, p_buffer_hdr); 603311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 603411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 603511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 603611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 603711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("buffer index '%d' invalid", index); 603811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 603911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 604011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 604111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 604211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 604311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 604411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 604511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 604611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Process FBD event. 604711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 604811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] p_buffer_hdr: Pointer to buffer header. 604911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @param[in] index: Index of buffer in output buffer info array. 605011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 605111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 605211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 605311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::async_process_event_fbd( 605411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *p_buffer_hdr, 605511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int index) 605611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 605711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 605811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 605911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel static long long timestamp_prev = 0; 606011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 606111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (index < m_port_op.def.nBufferCountActual) 606211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 606311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 *p_buffer; 606411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 606511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer = m_buffer_array_op[index].buffer_swvdec.p_buffer; 606611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 606711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.num_pending_buffers--; 606811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 606911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_port_op.flush_inprogress) 607011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 607111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->nFilledLen = 0; 607211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->nTimeStamp = 0; 607311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT; 607411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 607511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 607611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_buffer_hdr->nFilledLen) 607711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 607811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_sync_frame_decoding_mode) 607911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 608011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_LOW("sync frame decoding mode; " 608111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "setting timestamp to zero"); 608211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 608311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->nTimeStamp = 0; 608411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 608511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 608611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 608711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_queue_timestamp.empty()) 608811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 608911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("timestamp queue empty; " 609011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "re-using previous timestamp %lld", 609111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel timestamp_prev); 609211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 609311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->nTimeStamp = timestamp_prev; 609411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 609511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 609611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 609711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->nTimeStamp = m_queue_timestamp.top(); 609811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 609911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_queue_timestamp.pop(); 610011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 610111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel timestamp_prev = p_buffer_hdr->nTimeStamp; 610211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 610311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 610411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 610511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ion_flush_op(index); 610611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 610711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_meta_buffer_mode) 610811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 610911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&m_meta_buffer_array_mutex); 611011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 611111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 611211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_diag.dump_op(p_buffer, 611311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_dimensions.width, 611411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_dimensions.height, 611511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_attributes.stride, 611611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_frame_attributes.scanlines); 611711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 611811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_meta_buffer_mode) 611911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 612011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&m_meta_buffer_array_mutex); 612111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 612211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 612311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 612411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 612511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_LOW("filled length zero; " 612611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "setting timestamp to zero"); 612711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 612811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->nTimeStamp = 0; 612911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 613011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 613111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (p_buffer_hdr->nFlags & OMX_BUFFERFLAG_EOS) 613211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 613311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_post_event(OMX_SWVDEC_EVENT_EOS, 0, 0); 613411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 613511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_LOW("flushing %zu elements in timestamp queue", 613611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_queue_timestamp.size()); 613711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 613811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (m_queue_timestamp.empty() == false) 613911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 614011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_queue_timestamp.pop(); 614111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 614211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 614311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 614411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_meta_buffer_mode && 614511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((p_buffer_hdr->nFlags & OMX_BUFFERFLAG_READONLY)) == 0) 614611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 614711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel meta_buffer_ref_remove(index); 614811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 614911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 615011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_CALLBACK( 615111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "FillBufferDone(): %p, buffer %p, " 615211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "flags 0x%08x, filled length %d, timestamp %lld", 615311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr, 615411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer, 615511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->nFlags, 615611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->nFilledLen, 615711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr->nTimeStamp); 615811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 615911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_callback.FillBufferDone(&m_cmp, m_app_data, p_buffer_hdr); 616011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 616111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 616211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 616311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("buffer index '%d' invalid", index); 616411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 616511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorBadParameter; 616611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 616711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 616811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelasync_process_event_fbd_exit: 616911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 617011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 617111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 617211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 617311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Process EOS event. 617411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 617511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ErrorNone 617611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 617711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::async_process_event_eos() 617811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 617911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_CALLBACK("EventHandler(): " 618011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX_EventBufferFlag, port index %d, EOS", 618111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_PORT_INDEX_OP); 618211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 618311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_callback.EventHandler(&m_cmp, 618411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_app_data, 618511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventBufferFlag, 618611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_PORT_INDEX_OP, 618711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERFLAG_EOS, 618811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel NULL); 618911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 619011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 619111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 619211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 619311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 619411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Process input port flush event. 619511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 619611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 619711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 619811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::async_process_event_flush_port_ip() 619911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 620011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 620111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 620211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_EVENT_INFO event_info; 620311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 620411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *p_buffer_hdr; 620511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 620611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int index; 620711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 620811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (m_queue_port_ip.pop(&event_info)) 620911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 621011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (event_info.event_id) 621111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 621211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 621311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_SWVDEC_EVENT_ETB: 621411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 621511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr = (OMX_BUFFERHEADERTYPE *) event_info.event_param1; 621611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 621711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel index = event_info.event_param2; 621811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 621911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // compensate decrement in async_process_event_ebd() 622011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.num_pending_buffers++; 622111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 622211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = async_process_event_ebd(p_buffer_hdr, index); 622311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 622411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 622511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 622611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_SWVDEC_EVENT_EBD: 622711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 622811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr = (OMX_BUFFERHEADERTYPE *) event_info.event_param1; 622911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 623011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel index = event_info.event_param2; 623111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 623211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = async_process_event_ebd(p_buffer_hdr, index); 623311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 623411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 623511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 623611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 623711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 623811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel assert(0); 623911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 624011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 624111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 624211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 624311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 624411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 624511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel assert(m_port_ip.num_pending_buffers == 0); 624611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 624711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval == OMX_ErrorNone) && 624811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_status_flags & (1 << PENDING_PORT_FLUSH_IP))) 624911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 625011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_status_flags &= ~(1 << PENDING_PORT_FLUSH_IP); 625111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 625211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_post_event(OMX_SWVDEC_EVENT_CMD_ACK, 625311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CommandFlush, 625411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_PORT_INDEX_IP); 625511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 625611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 625711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_ip.flush_inprogress = OMX_FALSE; 625811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 625911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 626011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 626111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 626211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 626311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Process output port flush event. 626411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 626511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 626611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 626711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::async_process_event_flush_port_op() 626811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 626911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 627011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 627111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_EVENT_INFO event_info; 627211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 627311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *p_buffer_hdr; 627411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 627511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int index; 627611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 627711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (m_queue_port_op.pop(&event_info)) 627811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 627911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (event_info.event_id) 628011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 628111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 628211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_SWVDEC_EVENT_FTB: 628311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 628411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr = (OMX_BUFFERHEADERTYPE *) event_info.event_param1; 628511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 628611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel index = event_info.event_param2; 628711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 628811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // compensate decrement in async_process_event_fbd() 628911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.num_pending_buffers++; 629011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 629111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = async_process_event_fbd(p_buffer_hdr, index); 629211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 629311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 629411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 629511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_SWVDEC_EVENT_FBD: 629611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 629711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_buffer_hdr = (OMX_BUFFERHEADERTYPE *) event_info.event_param1; 629811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 629911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel index = event_info.event_param2; 630011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 630111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = async_process_event_fbd(p_buffer_hdr, index); 630211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 630311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 630411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 630511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 630611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 630711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel assert(0); 630811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 630911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 631011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 631111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 631211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 631311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 631411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel assert(m_port_op.num_pending_buffers == 0); 631511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 631611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval == OMX_ErrorNone) && 631711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_status_flags & (1 << PENDING_PORT_FLUSH_OP))) 631811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 631911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_status_flags &= ~(1 << PENDING_PORT_FLUSH_OP); 632011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 632111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_post_event(OMX_SWVDEC_EVENT_CMD_ACK, 632211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CommandFlush, 632311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_PORT_INDEX_OP); 632411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 632511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 632611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((retval == OMX_ErrorNone) && 632711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_status_flags & (1 << PENDING_STATE_EXECUTING_TO_IDLE))) 632811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 632911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_status_flags &= ~(1 << PENDING_STATE_EXECUTING_TO_IDLE); 633011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 633111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_post_event(OMX_SWVDEC_EVENT_CMD_ACK, 633211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CommandStateSet, 633311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_StateIdle); 633411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 633511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 633611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_port_reconfig_inprogress == false) 633711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 633811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_LOW("flushing %zu elements in timestamp queue", 633911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_queue_timestamp.size()); 634011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 634111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (m_queue_timestamp.empty() == false) 634211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 634311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_queue_timestamp.pop(); 634411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 634511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 634611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 634711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_op.flush_inprogress = OMX_FALSE; 634811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 634911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 635011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 635111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 635211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 635311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Process port reconfiguration event. 635411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 635511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 635611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 635711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::async_process_event_port_reconfig() 635811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 635911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 636011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 636111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_port_reconfig_inprogress) 636211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 636311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("port reconfiguration already in progress"); 636411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 636511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorIncorrectStateOperation; 636611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 636711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 636811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 636911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_port_reconfig_inprogress = true; 637011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 637111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_CALLBACK("EventHandler(): " 637211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX_EventPortSettingsChanged, port index %d", 637311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_PORT_INDEX_OP); 637411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 637511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_callback.EventHandler(&m_cmp, 637611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_app_data, 637711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventPortSettingsChanged, 637811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_PORT_INDEX_OP, 637911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 0, 638011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel NULL); 638111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 638211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 638311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 638411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 638511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 638611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/** 638711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @brief Process dimensions updated event. 638811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 638911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * @retval OMX_ERRORTYPE 639011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 639111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_swvdec::async_process_event_dimensions_updated() 639211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 639311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE retval = OMX_ErrorNone; 639411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 639511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_dimensions_update_inprogress) 639611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 639711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_ERROR("dimensions update already in progress"); 639811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 639911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel retval = OMX_ErrorIncorrectStateOperation; 640011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 640111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 640211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 640311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_dimensions_update_inprogress = true; 640411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 640511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SWVDEC_LOG_CALLBACK("EventHandler(): " 640611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX_EventPortSettingsChanged, port index %d, " 640711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX_IndexConfigCommonOutputCrop", 640811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_PORT_INDEX_OP); 640911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 641011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_callback.EventHandler(&m_cmp, 641111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_app_data, 641211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_EventPortSettingsChanged, 641311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CORE_PORT_INDEX_OP, 641411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_IndexConfigCommonOutputCrop, 641511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel NULL); 641611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 641711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 641811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return retval; 641911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 6420