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