111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*--------------------------------------------------------------------------
211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelCopyright (c) 2014-2016, The Linux Foundation. All rights reserved.
311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRedistribution and use in source and binary forms, with or without
511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelmodification, are permitted provided that the following conditions are met:
611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    * Redistributions of source code must retain the above copyright
711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      notice, this list of conditions and the following disclaimer.
811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    * Redistributions in binary form must reproduce the above copyright
911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      notice, this list of conditions and the following disclaimer in the
1011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      documentation and/or other materials provided with the distribution.
1111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    * Neither the name of The Linux Foundation nor
1211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      the names of its contributors may be used to endorse or promote
1311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      products derived from this software without specific prior written
1411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      permission.
1511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelIMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
1911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelNON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
2011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
2111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
2211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
2311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
2411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
2511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
2611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel--------------------------------------------------------------------------*/
2811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "omx_swvenc_mpeg4.h"
2911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
3011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* def: StoreMetaDataInBuffersParams */
3111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <media/hardware/HardwareAPI.h>
3211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
3311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* def: VENUS_BUFFER_SIZE, VENUS_Y_STRIDE etc */
3411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <media/msm_media_info.h>
3511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
3611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* def: private_handle_t*/
3711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <gralloc_priv.h>
3811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
3911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
4011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*----------------------------------------------------------------------------
4111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Preprocessor Definitions and Constants
4211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * -------------------------------------------------------------------------*/
4311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_SPEC_VERSION 0x00000101
4411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define OMX_INIT_STRUCT(_s_, _name_)             \
4511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset((_s_), 0x0, sizeof(_name_));          \
4611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (_s_)->nSize = sizeof(_name_);               \
4711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (_s_)->nVersion.nVersion = OMX_SPEC_VERSION
4811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
4911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define ENTER_FUNC() DEBUG_PRINT_HIGH("ENTERING: %s",__FUNCTION__)
5011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define EXIT_FUNC()  DEBUG_PRINT_HIGH("EXITING: %s",__FUNCTION__)
5111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define RETURN(x)    EXIT_FUNC(); return x;
5211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define ALIGN(value,alignment) (((value) + (alignment-1)) & (~(alignment-1)))
5311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
5411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define BUFFER_LOG_LOC "/data/misc/media"
5511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
5611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* factory function executed by the core to create instances */
5711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid *get_omx_component_factory_fn(void)
5811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
5911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    RETURN((new omx_venc));
6011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
6111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
6211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_venc::omx_venc()
6311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
6411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ENTER_FUNC();
6511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
6611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char property_value[PROPERTY_VALUE_MAX] = {0};
6711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
6811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&m_debug,0,sizeof(m_debug));
6911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
7011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
7111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.debug.level", property_value, "1");
7211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    debug_level = atoi(property_value);
7311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
7411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
7511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.enc.log.in", property_value, "0");
7611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_debug.in_buffer_log = atoi(property_value);
7711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
7811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
7911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.enc.log.out", property_value, "0");
8011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_debug.out_buffer_log = atoi(property_value);
8111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
8211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    snprintf(m_debug.log_loc, PROPERTY_VALUE_MAX, "%s", BUFFER_LOG_LOC);
8311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_value[0] = '\0';
8411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.log.loc", property_value, "");
8511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (*property_value)
8611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
8711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       strlcpy(m_debug.log_loc, property_value, PROPERTY_VALUE_MAX);
8811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
8911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
9011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(meta_buffer_hdr,0,sizeof(meta_buffer_hdr));
9111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    meta_mode_enable = false;
9211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(meta_buffer_hdr,0,sizeof(meta_buffer_hdr));
9311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(meta_buffers,0,sizeof(meta_buffers));
9411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(opaque_buffer_hdr,0,sizeof(opaque_buffer_hdr));
9511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    mUseProxyColorFormat = false;
9611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    get_syntaxhdr_enable = false;
9711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_bSeqHdrRequested = false;
98b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    set_format = false;
9911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
10011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    EXIT_FUNC();
10111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
10211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
10311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_venc::~omx_venc()
10411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
10511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ENTER_FUNC();
10611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    get_syntaxhdr_enable = false;
10711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    EXIT_FUNC();
10811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
10911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
11011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE omx_venc::component_init(OMX_STRING role)
11111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
11211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ENTER_FUNC();
11311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
11411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
11511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    SWVENC_STATUS Ret = SWVENC_S_SUCCESS;
11611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    SWVENC_CALLBACK callBackInfo;
11711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_VIDEO_CODINGTYPE codec_type;
11811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    SWVENC_PROPERTY Prop;
11911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int fds[2];
12011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
12111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    strlcpy((char *)m_nkind,role,OMX_MAX_STRINGNAME_SIZE);
12211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    secure_session = false;
12311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
12411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!strncmp( (char *)m_nkind,"OMX.qcom.video.encoder.mpeg4sw",
12511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                  OMX_MAX_STRINGNAME_SIZE))
12611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
12711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_encoder.mpeg4",\
12811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE);
12911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type = OMX_VIDEO_CodingMPEG4;
13011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_codec = SWVENC_CODEC_MPEG4;
13111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
13211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (!strncmp( (char *)m_nkind,"OMX.qcom.video.encoder.h263sw",
13311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                  OMX_MAX_STRINGNAME_SIZE))
13411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
13511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        strlcpy((char *)m_cRole, "video_encoder.h263",\
13611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_MAX_STRINGNAME_SIZE);
13711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_type = OMX_VIDEO_CodingH263;
13811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_codec = SWVENC_CODEC_H263;
13911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
14011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else
14111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
14211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR: Unknown Component");
14311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorInvalidComponentName;
14411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        RETURN(eRet);
14511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
14611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
14711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef ENABLE_GET_SYNTAX_HDR
14811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    get_syntaxhdr_enable = true;
14911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("Get syntax header enabled");
15011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
15111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
15211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    callBackInfo.pfn_empty_buffer_done    = swvenc_empty_buffer_done_cb;
15311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    callBackInfo.pfn_fill_buffer_done     = swvenc_fill_buffer_done_cb;
15411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    callBackInfo.pfn_event_notification   = swvenc_handle_event_cb;
15511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    callBackInfo.p_client                 = (void*)this;
15611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
15711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    SWVENC_STATUS sRet = swvenc_init(&m_hSwVenc, m_codec, &callBackInfo);
15811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (sRet != SWVENC_S_SUCCESS)
15911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
16011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("swvenc_init returned %d, ret insufficient resources",
16111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         sRet);
16211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        RETURN(OMX_ErrorInsufficientResources);
16311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
16411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
16511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_stopped = true;
16611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
16711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //Intialise the OMX layer variables
16811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&m_pCallbacks,0,sizeof(OMX_CALLBACKTYPE));
16911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
17011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_INIT_STRUCT(&m_sPortParam, OMX_PORT_PARAM_TYPE);
17111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sPortParam.nPorts = 0x2;
17211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sPortParam.nStartPortNumber = (OMX_U32) PORT_INDEX_IN;
17311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
17411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_INIT_STRUCT(&m_sPortParam_audio, OMX_PORT_PARAM_TYPE);
17511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sPortParam_audio.nPorts = 0;
17611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sPortParam_audio.nStartPortNumber = 0;
17711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
17811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_INIT_STRUCT(&m_sPortParam_img, OMX_PORT_PARAM_TYPE);
17911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sPortParam_img.nPorts = 0;
18011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sPortParam_img.nStartPortNumber = 0;
18111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
18211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_INIT_STRUCT(&m_sParamBitrate, OMX_VIDEO_PARAM_BITRATETYPE);
18311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sParamBitrate.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
18411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sParamBitrate.eControlRate = OMX_Video_ControlRateVariableSkipFrames;
18511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sParamBitrate.nTargetBitrate = 64000;
18611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
18711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_INIT_STRUCT(&m_sConfigBitrate, OMX_VIDEO_CONFIG_BITRATETYPE);
18811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sConfigBitrate.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
18911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sConfigBitrate.nEncodeBitrate = 64000;
19011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
19111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_INIT_STRUCT(&m_sConfigFramerate, OMX_CONFIG_FRAMERATETYPE);
19211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sConfigFramerate.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
19311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sConfigFramerate.xEncodeFramerate = 30 << 16;
19411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
19511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_INIT_STRUCT(&m_sConfigIntraRefreshVOP, OMX_CONFIG_INTRAREFRESHVOPTYPE);
19611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sConfigIntraRefreshVOP.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
19711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sConfigIntraRefreshVOP.IntraRefreshVOP = OMX_FALSE;
19811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
19911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_INIT_STRUCT(&m_sConfigFrameRotation, OMX_CONFIG_ROTATIONTYPE);
20011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sConfigFrameRotation.nPortIndex = (OMX_U32) PORT_INDEX_IN;
20111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sConfigFrameRotation.nRotation = 0;
20211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
20311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_INIT_STRUCT(&m_sSessionQuantization, OMX_VIDEO_PARAM_QUANTIZATIONTYPE);
20411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sSessionQuantization.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
20511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sSessionQuantization.nQpI = 9;
20611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sSessionQuantization.nQpP = 6;
20711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sSessionQuantization.nQpB = 2;
20811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
20911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_INIT_STRUCT(&m_sSessionQPRange, OMX_QCOM_VIDEO_PARAM_QPRANGETYPE);
21011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sSessionQPRange.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
21111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sSessionQPRange.minQP = 2;
21211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
21311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_INIT_STRUCT(&m_sParamProfileLevel, OMX_VIDEO_PARAM_PROFILELEVELTYPE);
21411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sParamProfileLevel.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
21511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
21611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_INIT_STRUCT(&m_sIntraperiod, QOMX_VIDEO_INTRAPERIODTYPE);
21711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sIntraperiod.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
21811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sIntraperiod.nPFrames = (m_sConfigFramerate.xEncodeFramerate * 2) - 1;
21911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
22011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_INIT_STRUCT(&m_sErrorCorrection, OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE);
22111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sErrorCorrection.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
22211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sErrorCorrection.bEnableDataPartitioning = OMX_FALSE;
22311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sErrorCorrection.bEnableHEC = OMX_FALSE;
22411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sErrorCorrection.bEnableResync = OMX_FALSE;
22511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sErrorCorrection.bEnableRVLC = OMX_FALSE;
22611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sErrorCorrection.nResynchMarkerSpacing = 0;
22711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
22811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_INIT_STRUCT(&m_sIntraRefresh, OMX_VIDEO_PARAM_INTRAREFRESHTYPE);
22911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sIntraRefresh.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
23011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sIntraRefresh.eRefreshMode = OMX_VIDEO_IntraRefreshMax;
23111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
23211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (codec_type == OMX_VIDEO_CodingMPEG4)
23311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
23411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_sParamProfileLevel.eProfile = (OMX_U32) OMX_VIDEO_MPEG4ProfileSimple;
23511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_sParamProfileLevel.eLevel = (OMX_U32) OMX_VIDEO_MPEG4Level0;
23611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (codec_type == OMX_VIDEO_CodingH263)
23711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
23811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_sParamProfileLevel.eProfile = (OMX_U32) OMX_VIDEO_H263ProfileBaseline;
23911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_sParamProfileLevel.eLevel = (OMX_U32) OMX_VIDEO_H263Level10;
24011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
24111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
24211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* set the profile and level */
24311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    Ret = swvenc_set_profile_level(m_sParamProfileLevel.eProfile,
24411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_sParamProfileLevel.eLevel);
24511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (Ret != SWVENC_S_SUCCESS)
24611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
24711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       DEBUG_PRINT_ERROR("%s, swvenc_set_rc_mode failed (%d)",
24811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         __FUNCTION__, Ret);
24911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       RETURN(OMX_ErrorUndefined);
25011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
25111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
25211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // Initialize the video parameters for input port
25311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_INIT_STRUCT(&m_sInPortDef, OMX_PARAM_PORTDEFINITIONTYPE);
25411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sInPortDef.nPortIndex= (OMX_U32) PORT_INDEX_IN;
25511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sInPortDef.bEnabled = OMX_TRUE;
25611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sInPortDef.bPopulated = OMX_FALSE;
25711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sInPortDef.eDomain = OMX_PortDomainVideo;
25811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sInPortDef.eDir = OMX_DirInput;
25911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sInPortDef.format.video.cMIMEType = (char *)"YUV420";
26011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sInPortDef.format.video.nFrameWidth = OMX_CORE_QCIF_WIDTH;
26111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sInPortDef.format.video.nFrameHeight = OMX_CORE_QCIF_HEIGHT;
26211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sInPortDef.format.video.nStride = OMX_CORE_QCIF_WIDTH;
26311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sInPortDef.format.video.nSliceHeight = OMX_CORE_QCIF_HEIGHT;
26411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sInPortDef.format.video.nBitrate = 64000;
26511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sInPortDef.format.video.xFramerate = 15 << 16;
26611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sInPortDef.format.video.eColorFormat = (OMX_COLOR_FORMATTYPE)
26711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
26811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sInPortDef.format.video.eCompressionFormat =  OMX_VIDEO_CodingUnused;
26911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
27011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* set the frame size */
27111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    Prop.id = SWVENC_PROPERTY_ID_FRAME_SIZE;
27211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    Prop.info.frame_size.height = m_sInPortDef.format.video.nFrameHeight;
27311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    Prop.info.frame_size.width  = m_sInPortDef.format.video.nFrameWidth;
27411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
27511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    Ret = swvenc_setproperty(m_hSwVenc, &Prop);
27611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (Ret != SWVENC_S_SUCCESS)
27711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
27811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       DEBUG_PRINT_ERROR("%s, swvenc_setproperty failed (%d)",
27911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         __FUNCTION__, Ret);
28011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       RETURN(OMX_ErrorUnsupportedSetting);
28111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
28211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
28311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* set the frame attributes */
28411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    Prop.id = SWVENC_PROPERTY_ID_FRAME_ATTRIBUTES;
28511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    Prop.info.frame_attributes.stride_luma = m_sInPortDef.format.video.nStride;
28611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    Prop.info.frame_attributes.stride_chroma = m_sInPortDef.format.video.nStride;
28711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    Prop.info.frame_attributes.offset_luma = 0;
28811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    Prop.info.frame_attributes.offset_chroma =
28911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      (m_sInPortDef.format.video.nSliceHeight * m_sInPortDef.format.video.nStride);
29011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    Prop.info.frame_attributes.size = (Prop.info.frame_attributes.offset_chroma * 3) >> 1;
29111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
29211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    Ret = swvenc_setproperty(m_hSwVenc, &Prop);
29311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (Ret != SWVENC_S_SUCCESS)
29411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
29511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       DEBUG_PRINT_ERROR("%s, swvenc_setproperty failed (%d)",
29611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         __FUNCTION__, Ret);
29711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       RETURN(OMX_ErrorUndefined);
29811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
29911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
30011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    Ret = swvenc_get_buffer_req(&m_sInPortDef.nBufferCountMin,
30111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel              &m_sInPortDef.nBufferCountActual,
30211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel              &m_sInPortDef.nBufferSize,
30311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel              &m_sInPortDef.nBufferAlignment,
30411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel              PORT_INDEX_IN);
30511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (Ret != SWVENC_S_SUCCESS)
30611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
30711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       DEBUG_PRINT_ERROR("ERROR: %s, swvenc_get_buffer_req failed (%d)", __FUNCTION__,
30811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          Ret);
30911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       RETURN(OMX_ErrorUndefined);
31011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
31111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
31211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // Initialize the video parameters for output port
31311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_INIT_STRUCT(&m_sOutPortDef, OMX_PARAM_PORTDEFINITIONTYPE);
31411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sOutPortDef.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
31511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sOutPortDef.bEnabled = OMX_TRUE;
31611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sOutPortDef.bPopulated = OMX_FALSE;
31711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sOutPortDef.eDomain = OMX_PortDomainVideo;
31811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sOutPortDef.eDir = OMX_DirOutput;
31911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sOutPortDef.format.video.nFrameWidth = OMX_CORE_QCIF_WIDTH;
32011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sOutPortDef.format.video.nFrameHeight = OMX_CORE_QCIF_HEIGHT;
32111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sOutPortDef.format.video.nBitrate = 64000;
32211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sOutPortDef.format.video.xFramerate = 15 << 16;
32311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sOutPortDef.format.video.eColorFormat =  OMX_COLOR_FormatUnused;
32411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (codec_type == OMX_VIDEO_CodingMPEG4)
32511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
32611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_sOutPortDef.format.video.eCompressionFormat =  OMX_VIDEO_CodingMPEG4;
32711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
32811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (codec_type == OMX_VIDEO_CodingH263)
32911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
33011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_sOutPortDef.format.video.eCompressionFormat =  OMX_VIDEO_CodingH263;
33111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
33211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
33311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    Ret = swvenc_get_buffer_req(&m_sOutPortDef.nBufferCountMin,
33411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel              &m_sOutPortDef.nBufferCountActual,
33511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel              &m_sOutPortDef.nBufferSize,
33611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel              &m_sOutPortDef.nBufferAlignment,
33711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel              PORT_INDEX_OUT);
33811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (Ret != SWVENC_S_SUCCESS)
33911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
34011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       DEBUG_PRINT_ERROR("ERROR: %s, swvenc_get_buffer_req failed (%d)", __FUNCTION__,
34111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          Ret);
34211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       RETURN(OMX_ErrorUndefined);
34311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
34411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
34511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // Initialize the video color format for input port
34611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_INIT_STRUCT(&m_sInPortFormat, OMX_VIDEO_PARAM_PORTFORMATTYPE);
34711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sInPortFormat.nPortIndex = (OMX_U32) PORT_INDEX_IN;
34811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sInPortFormat.nIndex = 0;
34911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sInPortFormat.eColorFormat = (OMX_COLOR_FORMATTYPE)
35011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
35111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sInPortFormat.eCompressionFormat = OMX_VIDEO_CodingUnused;
35211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
35311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // Initialize the compression format for output port
35411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_INIT_STRUCT(&m_sOutPortFormat, OMX_VIDEO_PARAM_PORTFORMATTYPE);
35511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sOutPortFormat.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
35611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sOutPortFormat.nIndex = 0;
35711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sOutPortFormat.eColorFormat = OMX_COLOR_FormatUnused;
35811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (codec_type == OMX_VIDEO_CodingMPEG4)
35911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
36011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_sOutPortFormat.eCompressionFormat =  OMX_VIDEO_CodingMPEG4;
36111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (codec_type == OMX_VIDEO_CodingH263)
36211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
36311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_sOutPortFormat.eCompressionFormat =  OMX_VIDEO_CodingH263;
36411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
36511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
36611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // mandatory Indices for kronos test suite
36711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_INIT_STRUCT(&m_sPriorityMgmt, OMX_PRIORITYMGMTTYPE);
36811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
36911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_INIT_STRUCT(&m_sInBufSupplier, OMX_PARAM_BUFFERSUPPLIERTYPE);
37011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sInBufSupplier.nPortIndex = (OMX_U32) PORT_INDEX_IN;
37111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
37211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_INIT_STRUCT(&m_sOutBufSupplier, OMX_PARAM_BUFFERSUPPLIERTYPE);
37311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sOutBufSupplier.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
37411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
37511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_INIT_STRUCT(&m_sParamInitqp, QOMX_EXTNINDEX_VIDEO_INITIALQP);
37611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sParamInitqp.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
37711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
37811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // mp4 specific init
37911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_INIT_STRUCT(&m_sParamMPEG4, OMX_VIDEO_PARAM_MPEG4TYPE);
38011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sParamMPEG4.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
38111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sParamMPEG4.eProfile = OMX_VIDEO_MPEG4ProfileSimple;
38211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sParamMPEG4.eLevel = OMX_VIDEO_MPEG4Level0;
38311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sParamMPEG4.nSliceHeaderSpacing = 0;
38411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sParamMPEG4.bSVH = OMX_FALSE;
38511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sParamMPEG4.bGov = OMX_FALSE;
38611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // 2 second intra period for default outport fps
38711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sParamMPEG4.nPFrames = (m_sOutPortFormat.xFramerate * 2 - 1);
38811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sParamMPEG4.bACPred = OMX_TRUE;
38911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // delta = 2 @ 15 fps
39011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sParamMPEG4.nTimeIncRes = 30;
39111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // pframe and iframe
39211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sParamMPEG4.nAllowedPictureTypes = 2;
39311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // number of video packet headers per vop
39411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sParamMPEG4.nHeaderExtension = 1;
39511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sParamMPEG4.bReversibleVLC = OMX_FALSE;
39611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
39711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // h263 specific init
39811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_INIT_STRUCT(&m_sParamH263, OMX_VIDEO_PARAM_H263TYPE);
39911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sParamH263.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
40011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // 2 second intra period for default outport fps
40111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sParamH263.nPFrames = (m_sOutPortFormat.xFramerate * 2 - 1);
40211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sParamH263.nBFrames = 0;
40311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sParamH263.eProfile = OMX_VIDEO_H263ProfileBaseline;
40411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sParamH263.eLevel = OMX_VIDEO_H263Level10;
40511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sParamH263.bPLUSPTYPEAllowed = OMX_FALSE;
40611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sParamH263.nAllowedPictureTypes = 2;
40711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sParamH263.bForceRoundingTypeToZero = OMX_TRUE;
40811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sParamH263.nPictureHeaderRepetition = 0;
40911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sParamH263.nGOBHeaderInterval = 1;
41011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
41111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_state                   = OMX_StateLoaded;
41211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sExtraData = 0;
41311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
414fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_capability.max_height = OMX_CORE_FWVGA_HEIGHT;
415fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_capability.max_width = OMX_CORE_FWVGA_WIDTH;
41611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_capability.min_height = 32;
41711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_capability.min_width = 32;
41811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
41911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eRet == OMX_ErrorNone)
42011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
42111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pipe(fds))
42211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
42311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR: pipe creation failed");
42411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorInsufficientResources;
42511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
42611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else
42711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
42811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if ((fds[0] == 0) || (fds[1] == 0))
42911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
43011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (pipe(fds))
43111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
43211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: pipe creation failed");
43311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    eRet = OMX_ErrorInsufficientResources;
43411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
43511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
43611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (eRet == OMX_ErrorNone)
43711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
43811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_pipe_in = fds[0];
43911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_pipe_out = fds[1];
44011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
441bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                if (pthread_create(&msg_thread_id,0, message_thread_enc, this) < 0) {
442bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                    eRet = OMX_ErrorInsufficientResources;
443bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                    msg_thread_created = false;
444bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                }
445bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                else {
446bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                    msg_thread_created = true;
447bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                }
448bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel            }
44911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
45011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
45111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
45211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("Component_init return value = 0x%x", eRet);
45311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
45411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    EXIT_FUNC();
45511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
45611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    RETURN(eRet);
45711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
45811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
45911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_venc::set_parameter
46011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(
46111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_IN OMX_HANDLETYPE hComp,
46211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_IN OMX_INDEXTYPE  paramIndex,
46311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_IN OMX_PTR        paramData
46411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel)
46511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
46611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ENTER_FUNC();
46711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
46811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
46911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    SWVENC_STATUS Ret  = SWVENC_S_SUCCESS;
47011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    SWVENC_PROPERTY Prop;
47111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool bResult;
47211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int stride, scanlines;
47311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
47411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void)hComp;
47511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
47611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state == OMX_StateInvalid)
47711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
47811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR: Set Param in Invalid State");
47911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        RETURN(OMX_ErrorInvalidState);
48011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
48111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (paramData == NULL)
48211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
48311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR: Get Param in Invalid paramData");
48411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        RETURN(OMX_ErrorBadParameter);
48511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
48611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
48711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* set_parameter can be called in loaded state or disabled port */
48811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ( (m_state == OMX_StateLoaded) ||
48911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         (m_sInPortDef.bEnabled == OMX_FALSE) ||
49011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         (m_sOutPortDef.bEnabled == OMX_FALSE)
49111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       )
49211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
49311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Set Parameter called in valid state");
49411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
49511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else
49611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
49711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR: Set Parameter called in Invalid State");
49811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        RETURN(OMX_ErrorIncorrectStateOperation);
49911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
50011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
50111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch ((int)paramIndex)
50211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
50311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamPortDefinition:
50411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
50511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
50611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
50711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d",
50811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (int)portDefn->format.video.nFrameHeight,
50911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (int)portDefn->format.video.nFrameWidth);
51011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
51111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (PORT_INDEX_IN == portDefn->nPortIndex)
51211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
51311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!dev_is_video_session_supported(portDefn->format.video.nFrameWidth,
51411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            portDefn->format.video.nFrameHeight))
51511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
51611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("video session not supported");
51711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    omx_report_unsupported_setting();
51811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    RETURN(OMX_ErrorUnsupportedSetting);
51911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
52011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("i/p actual cnt requested = %u", portDefn->nBufferCountActual);
52111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("i/p min cnt requested = %u", portDefn->nBufferCountMin);
52211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("i/p buffersize requested = %u", portDefn->nBufferSize);
52311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (portDefn->nBufferCountMin > portDefn->nBufferCountActual)
52411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
52511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: (In_PORT) Min buffers (%u) > actual count (%u)",
52611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            portDefn->nBufferCountMin, portDefn->nBufferCountActual);
52711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    RETURN(OMX_ErrorUnsupportedSetting);
52811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
52911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
53011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* set the frame size */
53111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                Prop.id = SWVENC_PROPERTY_ID_FRAME_SIZE;
53211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                Prop.info.frame_size.height = portDefn->format.video.nFrameHeight;
53311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                Prop.info.frame_size.width  = portDefn->format.video.nFrameWidth;
53411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
53511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                Ret = swvenc_setproperty(m_hSwVenc, &Prop);
53611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (Ret != SWVENC_S_SUCCESS)
53711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
53811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   DEBUG_PRINT_ERROR("%s, swvenc_setproperty failed (%d)",
53911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     __FUNCTION__, Ret);
54011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   RETURN(OMX_ErrorUnsupportedSetting);
54111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
54211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
54311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* set the input frame-rate */
54411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (portDefn->format.video.xFramerate != 0)
54511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
54611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   Ret = swvenc_set_frame_rate(portDefn->format.video.xFramerate >> 16);
54711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (Ret != SWVENC_S_SUCCESS)
54811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   {
54911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                      DEBUG_PRINT_ERROR("%s, swvenc_set_frame_rate failed (%d)",
55011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        __FUNCTION__, Ret);
55111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                      RETURN(OMX_ErrorUnsupportedSetting);
55211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
55311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
55411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
55511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* set the frame attributes */
55611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                stride = VENUS_Y_STRIDE(COLOR_FMT_NV12, portDefn->format.video.nFrameWidth);
55711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                scanlines = VENUS_Y_SCANLINES(COLOR_FMT_NV12, portDefn->format.video.nSliceHeight);
55811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                Prop.id = SWVENC_PROPERTY_ID_FRAME_ATTRIBUTES;
55911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                Prop.info.frame_attributes.stride_luma = stride;
56011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                Prop.info.frame_attributes.stride_chroma = stride;
56111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                Prop.info.frame_attributes.offset_luma = 0;
56211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                Prop.info.frame_attributes.offset_chroma = scanlines * stride;
56311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                Prop.info.frame_attributes.size =
56411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                  VENUS_BUFFER_SIZE(COLOR_FMT_NV12,
56511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     portDefn->format.video.nFrameWidth,
56611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     portDefn->format.video.nFrameHeight);
56711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
56811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                Ret = swvenc_setproperty(m_hSwVenc, &Prop);
56911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (Ret != SWVENC_S_SUCCESS)
57011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
57111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   DEBUG_PRINT_ERROR("%s, swvenc_setproperty failed (%d)",
57211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     __FUNCTION__, Ret);
57311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   RETURN(OMX_ErrorUnsupportedSetting);
57411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
57511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
57611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("i/p previous actual cnt = %u", m_sInPortDef.nBufferCountActual);
57711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("i/p previous min cnt = %u", m_sInPortDef.nBufferCountMin);
57811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("i/p previous buffersize = %u", m_sInPortDef.nBufferSize);
57911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
58011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                memcpy(&m_sInPortDef, portDefn,sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
58111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
58211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* update the input buffer requirement */
58311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                Ret = swvenc_get_buffer_req(&m_sInPortDef.nBufferCountMin,
58411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        &m_sInPortDef.nBufferCountActual,
58511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        &m_sInPortDef.nBufferSize,
58611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        &m_sInPortDef.nBufferAlignment,
58711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        portDefn->nPortIndex);
58811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (Ret != SWVENC_S_SUCCESS)
58911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
59011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   DEBUG_PRINT_ERROR("ERROR: %s, swvenc_get_buffer_req failed (%d)", __FUNCTION__,
59111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                      Ret);
59211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   RETURN(OMX_ErrorUndefined);
59311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
59411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
59511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (portDefn->nBufferCountActual > m_sInPortDef.nBufferCountActual)
59611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
59711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   m_sInPortDef.nBufferCountActual = portDefn->nBufferCountActual;
59811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
59911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (portDefn->nBufferSize > m_sInPortDef.nBufferSize)
60011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
60111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   m_sInPortDef.nBufferSize = portDefn->nBufferSize;
60211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
60311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
60411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("i/p new actual cnt = %u", m_sInPortDef.nBufferCountActual);
60511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("i/p new min cnt = %u", m_sInPortDef.nBufferCountMin);
60611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("i/p new buffersize = %u", m_sInPortDef.nBufferSize);
60711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
60811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (PORT_INDEX_OUT == portDefn->nPortIndex)
60911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
61011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("o/p actual cnt requested = %u", portDefn->nBufferCountActual);
61111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("o/p min cnt requested = %u", portDefn->nBufferCountMin);
61211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("o/p buffersize requested = %u", portDefn->nBufferSize);
61311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (portDefn->nBufferCountMin > portDefn->nBufferCountActual)
61411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
61511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: (Out_PORT) Min buffers (%u) > actual count (%u)",
61611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            portDefn->nBufferCountMin, portDefn->nBufferCountActual);
61711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    RETURN(OMX_ErrorUnsupportedSetting);
61811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
61911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
62011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* set the output bit-rate */
62111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                Ret = swvenc_set_bit_rate(portDefn->format.video.nBitrate);
62211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (Ret != SWVENC_S_SUCCESS)
62311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
62411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   DEBUG_PRINT_ERROR("%s, swvenc_set_bit_rate failed (%d)",
62511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     __FUNCTION__, Ret);
62611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   RETURN(OMX_ErrorUnsupportedSetting);
62711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
62811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
62911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("o/p previous actual cnt = %u", m_sOutPortDef.nBufferCountActual);
63011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("o/p previous min cnt = %u", m_sOutPortDef.nBufferCountMin);
63111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("o/p previous buffersize = %u", m_sOutPortDef.nBufferSize);
63211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
63311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* set the buffer requirement */
63411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bResult = dev_set_buf_req(&portDefn->nBufferCountMin,
63511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                  &portDefn->nBufferCountActual,
63611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                  &portDefn->nBufferSize,
63711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                  portDefn->nPortIndex);
63811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (bResult != true)
63911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
64011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   DEBUG_PRINT_ERROR("%s, dev_set_buf_req failed",
64111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     __FUNCTION__);
64211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   RETURN(OMX_ErrorUnsupportedSetting);
64311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
64411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                memcpy(&m_sOutPortDef, portDefn,sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
64511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
64611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* update the output buffer requirement */
64711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                Ret = swvenc_get_buffer_req(&m_sOutPortDef.nBufferCountMin,
64811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        &m_sOutPortDef.nBufferCountActual,
64911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        &m_sOutPortDef.nBufferSize,
65011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        &m_sOutPortDef.nBufferAlignment,
65111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        portDefn->nPortIndex);
65211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (Ret != SWVENC_S_SUCCESS)
65311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
65411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   DEBUG_PRINT_ERROR("ERROR: %s, swvenc_get_buffer_req failed (%d)", __FUNCTION__,
65511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                      Ret);
65611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   RETURN(OMX_ErrorUndefined);
65711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
65811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
65911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (portDefn->nBufferCountActual > m_sOutPortDef.nBufferCountActual)
66011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
66111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   m_sOutPortDef.nBufferCountActual = portDefn->nBufferCountActual;
66211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
66311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (portDefn->nBufferSize > m_sOutPortDef.nBufferSize)
66411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
66511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   m_sOutPortDef.nBufferSize = portDefn->nBufferSize;
66611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
66711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
66811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("o/p new actual cnt = %u", m_sOutPortDef.nBufferCountActual);
66911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("o/p new min cnt = %u", m_sOutPortDef.nBufferCountMin);
67011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("o/p new buffersize = %u", m_sOutPortDef.nBufferSize);
67111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
67211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else
67311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
67411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR: Set_parameter: Bad Port idx %d",
67511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (int)portDefn->nPortIndex);
67611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorBadPortIndex;
67711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
67811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_sConfigFramerate.xEncodeFramerate = portDefn->format.video.xFramerate;
67911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_sConfigBitrate.nEncodeBitrate = portDefn->format.video.nBitrate;
68011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_sParamBitrate.nTargetBitrate = portDefn->format.video.nBitrate;
68111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
68211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
68311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
68411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoPortFormat:
68511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
68611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
68711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
68811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d",
68911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    portFmt->eColorFormat);
69011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            SWVENC_COLOR_FORMAT color_format;
69111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
69211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* set the driver with the corresponding values */
69311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (PORT_INDEX_IN == portFmt->nPortIndex)
69411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
69511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (portFmt->eColorFormat ==
69611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    ((OMX_COLOR_FORMATTYPE) QOMX_COLOR_FormatAndroidOpaque))
69711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
69811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    /* meta_mode = 2 (kMetadataBufferTypeGrallocSource) */
69911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_sInPortFormat.eColorFormat =
70069b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel                        (OMX_COLOR_FORMATTYPE) QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
70169b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel                    color_format = SWVENC_COLOR_FORMAT_NV12;
70211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!mUseProxyColorFormat)
70311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    {
70411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       if (!c2d_conv.init())
70511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       {
70611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          DEBUG_PRINT_ERROR("C2D init failed");
70711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                          return OMX_ErrorUnsupportedSetting;
70811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       }
70911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       DEBUG_PRINT_ERROR("C2D init is successful");
71011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
71111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    mUseProxyColorFormat = true;
71211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_input_msg_id = OMX_COMPONENT_GENERATE_ETB_OPQ;
71311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
71411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                else
71511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
71611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_sInPortFormat.eColorFormat = portFmt->eColorFormat;
71711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if ((portFmt->eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar) ||
71811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (portFmt->eColorFormat ==
71911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                         ((OMX_COLOR_FORMATTYPE) QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m)))
72011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    {
72111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        color_format = SWVENC_COLOR_FORMAT_NV12;
72211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
72311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    else if (portFmt->eColorFormat ==
72411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             ((OMX_COLOR_FORMATTYPE) QOMX_COLOR_FormatYVU420SemiPlanar))
72511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    {
72611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        color_format = SWVENC_COLOR_FORMAT_NV21;
72711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
72811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    else
72911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    {
73011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("%s: OMX_IndexParamVideoPortFormat %d invalid",
73111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          __FUNCTION__,
73211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                          portFmt->eColorFormat);
73311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        RETURN(OMX_ErrorBadParameter);
73411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
73511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_input_msg_id = OMX_COMPONENT_GENERATE_ETB;
73611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    mUseProxyColorFormat = false;
73711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
73811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_sInPortDef.format.video.eColorFormat = m_sInPortFormat.eColorFormat;
73911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* set the input color format */
74011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                Prop.id = SWVENC_PROPERTY_ID_COLOR_FORMAT;
74111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                Prop.info.color_format = color_format;
74211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                Ret = swvenc_setproperty(m_hSwVenc, &Prop);
74311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (Ret != SWVENC_S_SUCCESS)
74411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
74511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   DEBUG_PRINT_ERROR("%s, swvenc_setproperty failed (%d)",
74611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     __FUNCTION__, Ret);
74711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   RETURN(OMX_ErrorUnsupportedSetting);
74811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
74911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
75011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* set the input frame-rate */
75111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (portFmt->xFramerate != 0)
75211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
75311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   Ret = swvenc_set_frame_rate(portFmt->xFramerate >> 16);
75411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   if (Ret != SWVENC_S_SUCCESS)
75511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   {
75611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                      DEBUG_PRINT_ERROR("%s, swvenc_set_frame_rate failed (%d)",
75711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        __FUNCTION__, Ret);
75811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                      //RETURN(OMX_ErrorUnsupportedSetting);
75911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   }
76011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   m_sInPortFormat.xFramerate = portFmt->xFramerate;
76111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
76211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
76311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
76411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
76511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
76611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoInit:
76711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
76811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_PORT_PARAM_TYPE* pParam = (OMX_PORT_PARAM_TYPE*)(paramData);
76911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Set OMX_IndexParamVideoInit called");
77011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
77111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
77211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
77311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoBitrate:
77411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
77511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_VIDEO_PARAM_BITRATETYPE* pParam = (OMX_VIDEO_PARAM_BITRATETYPE*)paramData;
77611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoBitrate");
77711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
77811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_max_allowed_bitrate_check)
77911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
78011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               //TBD: to add bitrate check
78111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
78211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
78311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* set the output bit-rate */
78411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            Ret = swvenc_set_bit_rate(pParam->nTargetBitrate);
78511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (Ret != SWVENC_S_SUCCESS)
78611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
78711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               DEBUG_PRINT_ERROR("%s, swvenc_set_bit_rate failed (%d)",
78811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 __FUNCTION__, Ret);
78911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               RETURN(OMX_ErrorUnsupportedSetting);
79011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
79111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
79211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* set the RC-mode */
79311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            Ret = swvenc_set_rc_mode(pParam->eControlRate);
79411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (Ret != SWVENC_S_SUCCESS)
79511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
79611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               DEBUG_PRINT_ERROR("%s, swvenc_set_rc_mode failed (%d)",
79711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 __FUNCTION__, Ret);
79811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               RETURN(OMX_ErrorUnsupportedSetting);
79911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
80011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
80111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_sParamBitrate.nTargetBitrate = pParam->nTargetBitrate;
80211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_sParamBitrate.eControlRate = pParam->eControlRate;
80311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_sConfigBitrate.nEncodeBitrate = pParam->nTargetBitrate;
80411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_sInPortDef.format.video.nBitrate = pParam->nTargetBitrate;
80511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_sOutPortDef.format.video.nBitrate = pParam->nTargetBitrate;
80611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("bitrate = %u", m_sOutPortDef.format.video.nBitrate);
80711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
80811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
80911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
81011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoMpeg4:
81111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
81211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_VIDEO_PARAM_MPEG4TYPE* pParam = (OMX_VIDEO_PARAM_MPEG4TYPE*)paramData;
81311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
81411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4");
81511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
81611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pParam->nBFrames)
81711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
81811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Warning: B frames not supported");
81911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
82011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
82111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* set the intra period */
82211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            Ret = swvenc_set_intra_period(pParam->nPFrames,pParam->nBFrames);
82311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (Ret != SWVENC_S_SUCCESS)
82411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
82511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               DEBUG_PRINT_ERROR("%s, swvenc_set_intra_period failed (%d)",
82611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 __FUNCTION__, Ret);
82711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               RETURN(OMX_ErrorUnsupportedSetting);
82811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
82911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
83011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memcpy(&m_sParamMPEG4,pParam, sizeof(struct OMX_VIDEO_PARAM_MPEG4TYPE));
83111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_sIntraperiod.nPFrames = m_sParamMPEG4.nPFrames;
83211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_sIntraperiod.nBFrames = m_sParamMPEG4.nBFrames;
83311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
83411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
83511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
83611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoH263:
83711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
83811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_VIDEO_PARAM_H263TYPE* pParam = (OMX_VIDEO_PARAM_H263TYPE*)paramData;
83911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
84011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263");
84111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
84211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* set the intra period */
84311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            Ret = swvenc_set_intra_period(pParam->nPFrames,pParam->nBFrames);
84411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (Ret != SWVENC_S_SUCCESS)
84511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
84611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               DEBUG_PRINT_ERROR("%s, swvenc_set_intra_period failed (%d)",
84711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 __FUNCTION__, Ret);
84811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               RETURN(OMX_ErrorUnsupportedSetting);
84911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
85011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
85111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memcpy(&m_sParamH263,pParam, sizeof(struct OMX_VIDEO_PARAM_H263TYPE));
85211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_sIntraperiod.nPFrames = m_sParamH263.nPFrames;
85311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_sIntraperiod.nBFrames = m_sParamH263.nBFrames;
85411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
85511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
85611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
85711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoProfileLevelCurrent:
85811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
85911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam = (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData;
86011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
86111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoProfileLevelCurrent");
86211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
86311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* set the profile and level */
86411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            Ret = swvenc_set_profile_level(pParam->eProfile,pParam->eLevel);
86511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (Ret != SWVENC_S_SUCCESS)
86611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
86711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               DEBUG_PRINT_ERROR("%s, swvenc_set_rc_mode failed (%d)",
86811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 __FUNCTION__, Ret);
86911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               RETURN(OMX_ErrorUnsupportedSetting);
87011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
87111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
87211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
87311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_sParamProfileLevel.eProfile = pParam->eProfile;
87411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_sParamProfileLevel.eLevel = pParam->eLevel;
87511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
87611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (SWVENC_CODEC_MPEG4 == m_codec)
87711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
87811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_sParamMPEG4.eProfile = (OMX_VIDEO_MPEG4PROFILETYPE)m_sParamProfileLevel.eProfile;
87911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_sParamMPEG4.eLevel = (OMX_VIDEO_MPEG4LEVELTYPE)m_sParamProfileLevel.eLevel;
88011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("MPEG4 profile = %d, level = %d", m_sParamMPEG4.eProfile,
88111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_sParamMPEG4.eLevel);
88211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
88311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (SWVENC_CODEC_H263 == m_codec)
88411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
88511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_sParamH263.eProfile = (OMX_VIDEO_H263PROFILETYPE)m_sParamProfileLevel.eProfile;
88611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_sParamH263.eLevel = (OMX_VIDEO_H263LEVELTYPE)m_sParamProfileLevel.eLevel;
88711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("H263 profile = %d, level = %d", m_sParamH263.eProfile,
88811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_sParamH263.eLevel);
88911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
89011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
89111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
89211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
89311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamStandardComponentRole:
89411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
89511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_PARAM_COMPONENTROLETYPE *comp_role;
89611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
89711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s",
89811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    comp_role->cRole);
89911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
90011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if ((m_state == OMX_StateLoaded)&&
90111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING))
90211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
90311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Set Parameter called in valid state");
90411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
90511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else
90611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
90711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Set Parameter called in Invalid State");
90811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                RETURN(OMX_ErrorIncorrectStateOperation);
90911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
91011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
91111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (SWVENC_CODEC_MPEG4 == m_codec)
91211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
91311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!strncmp((const char*)comp_role->cRole,"video_encoder.mpeg4",OMX_MAX_STRINGNAME_SIZE))
91411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
91511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    strlcpy((char*)m_cRole,"video_encoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
91611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
91711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                else
91811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
91911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown Index %s", comp_role->cRole);
92011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    eRet = OMX_ErrorUnsupportedSetting;
92111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
92211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
92311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (SWVENC_CODEC_H263 == m_codec)
92411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
92511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!strncmp((const char*)comp_role->cRole,"video_encoder.h263",OMX_MAX_STRINGNAME_SIZE))
92611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
92711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    strlcpy((char*)m_cRole,"video_encoder.h263",OMX_MAX_STRINGNAME_SIZE);
92811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
92911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                else
93011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
93111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown Index %s", comp_role->cRole);
93211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    eRet =OMX_ErrorUnsupportedSetting;
93311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
93411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
93511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else
93611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
93711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown param %s", m_nkind);
93811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorInvalidComponentName;
93911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
94011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
94111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
94211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
94311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamPriorityMgmt:
94411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
94511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt");
94611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_state != OMX_StateLoaded) {
94711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR: Set Parameter called in Invalid State");
94811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                RETURN(OMX_ErrorIncorrectStateOperation);
94911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
95011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData;
95111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %u",
95211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    priorityMgmtype->nGroupID);
95311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
95411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %u",
95511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    priorityMgmtype->nGroupPriority);
95611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
95711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_sPriorityMgmt.nGroupID = priorityMgmtype->nGroupID;
95811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_sPriorityMgmt.nGroupPriority = priorityMgmtype->nGroupPriority;
95911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
96011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
96111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
96211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
96311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamCompBufferSupplier:
96411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
96511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier");
96611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
96711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d",
96811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    bufferSupplierType->eBufferSupplier);
96911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if ( (bufferSupplierType->nPortIndex == 0) ||
97011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 (bufferSupplierType->nPortIndex ==1)
97111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               )
97211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
97311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_sInBufSupplier.eBufferSupplier = bufferSupplierType->eBufferSupplier;
97411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
97511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else
97611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
97711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorBadPortIndex;
97811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
97911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
98011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
98111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
98211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
98311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
98411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoQuantization:
98511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
98611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // this is applicable only for RC-off case
98711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoQuantization");
98811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_VIDEO_PARAM_QUANTIZATIONTYPE *session_qp = (OMX_VIDEO_PARAM_QUANTIZATIONTYPE*) paramData;
98911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (session_qp->nPortIndex == PORT_INDEX_OUT)
99011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
99111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                Prop.id = SWVENC_PROPERTY_ID_QP;
99211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                Prop.info.qp.qp_i = session_qp->nQpI;
99311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                Prop.info.qp.qp_p = session_qp->nQpP;
99411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                Prop.info.qp.qp_b = session_qp->nQpB;
99511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
99611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                Ret = swvenc_setproperty(m_hSwVenc, &Prop);
99711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (Ret != SWVENC_S_SUCCESS)
99811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
99911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   DEBUG_PRINT_ERROR("%s, swvenc_setproperty failed (%d)",
100011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     __FUNCTION__, Ret);
100111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   RETURN(OMX_ErrorUnsupportedSetting);
100211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
100311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
100411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_sSessionQuantization.nQpI = session_qp->nQpI;
100511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_sSessionQuantization.nQpP = session_qp->nQpP;
100611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_sSessionQuantization.nQpB = session_qp->nQpB;
100711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
100811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else
100911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
101011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR: Unsupported port Index for Session QP setting");
101111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorBadPortIndex;
101211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
101311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
101411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
101511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
101611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoQPRange:
101711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
101811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_QcomIndexParamVideoQPRange");
101911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_QCOM_VIDEO_PARAM_QPRANGETYPE *qp_range = (OMX_QCOM_VIDEO_PARAM_QPRANGETYPE*) paramData;
102011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (qp_range->nPortIndex == PORT_INDEX_OUT)
102111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
102211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if ( (qp_range->minQP > 255) ||
102311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     (qp_range->maxQP > 255)
102411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   )
102511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
102611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   DEBUG_PRINT_ERROR("ERROR: Out of range QP");
102711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   eRet = OMX_ErrorBadParameter;
102811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
102911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
103011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                Prop.id = SWVENC_PROPERTY_ID_QP_RANGE;
103111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                Prop.info.qp_range.min_qp_packed =
103211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 (qp_range->minQP << 16) | (qp_range->minQP) | (qp_range->minQP << 8);
103311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                Prop.info.qp_range.max_qp_packed =
103411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 (qp_range->maxQP << 16) | (qp_range->maxQP) | (qp_range->maxQP << 8);
103511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
103611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                Ret = swvenc_setproperty(m_hSwVenc, &Prop);
103711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (Ret != SWVENC_S_SUCCESS)
103811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
103911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   DEBUG_PRINT_ERROR("%s, swvenc_setproperty failed (%d)",
104011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     __FUNCTION__, Ret);
104111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   RETURN(OMX_ErrorUnsupportedSetting);
104211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
104311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
104411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_sSessionQPRange.minQP= qp_range->minQP;
104511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_sSessionQPRange.maxQP= qp_range->maxQP;
104611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
104711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else
104811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
104911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR: Unsupported port Index for QP range setting");
105011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorBadPortIndex;
105111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
105211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
105311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
105411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
105511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexPortDefn:
105611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
105711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_QCOM_PARAM_PORTDEFINITIONTYPE* pParam =
105811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (OMX_QCOM_PARAM_PORTDEFINITIONTYPE*)paramData;
105911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_parameter: OMX_QcomIndexPortDefn");
106011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pParam->nPortIndex == (OMX_U32)PORT_INDEX_IN)
106111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
106211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (pParam->nMemRegion > OMX_QCOM_MemRegionInvalid &&
106311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->nMemRegion < OMX_QCOM_MemRegionMax)
106411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
106511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_use_input_pmem = OMX_TRUE;
106611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
106711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                else
106811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
106911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_use_input_pmem = OMX_FALSE;
107011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
107111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
107211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (pParam->nPortIndex == (OMX_U32)PORT_INDEX_OUT)
107311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
107411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (pParam->nMemRegion > OMX_QCOM_MemRegionInvalid &&
107511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->nMemRegion < OMX_QCOM_MemRegionMax)
107611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
107711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_use_output_pmem = OMX_TRUE;
107811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
107911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                else
108011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
108111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_use_output_pmem = OMX_FALSE;
108211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
108311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
108411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else
108511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
108611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR: SetParameter called on unsupported Port Index for QcomPortDefn");
108711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                RETURN(OMX_ErrorBadPortIndex);
108811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
108911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
109011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
109111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
109211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoErrorCorrection:
109311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
109411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("OMX_IndexParamVideoErrorCorrection");
109511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* pParam =
109611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE*)paramData;
109711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
109811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* HEC */
109911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (m_codec == SWVENC_CODEC_MPEG4)
110011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
110111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               Prop.id = SWVENC_PROPERTY_ID_MPEG4_HEC;
110211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               Prop.info.mpeg4_hec = pParam->bEnableHEC;
110311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
110411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               Ret = swvenc_setproperty(m_hSwVenc, &Prop);
110511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               if (Ret != SWVENC_S_SUCCESS)
110611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               {
110711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                  DEBUG_PRINT_ERROR("%s, swvenc_setproperty failed (%d)",
110811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    __FUNCTION__, Ret);
110911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                  RETURN(OMX_ErrorUndefined);
111011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               }
111111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
111211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               /* Data partitioning */
111311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               Prop.id = SWVENC_PROPERTY_ID_MPEG4_DP;
111411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               Prop.info.mpeg4_dp = pParam->bEnableDataPartitioning;
111511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
111611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               Ret = swvenc_setproperty(m_hSwVenc, &Prop);
111711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               if (Ret != SWVENC_S_SUCCESS)
111811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               {
111911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                  DEBUG_PRINT_ERROR("%s, swvenc_setproperty failed (%d)",
112011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    __FUNCTION__, Ret);
112111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                  RETURN(OMX_ErrorUndefined);
112211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               }
112311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
112411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
112511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* RVLC */
112611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pParam->bEnableRVLC)
112711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
112811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               DEBUG_PRINT_ERROR("%s, RVLC not support", __FUNCTION__);
112911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
113011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
113111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Re-sync Marker */
113211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            Prop.id = SWVENC_PROPERTY_ID_SLICE_CONFIG;
113311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if ( (m_codec != SWVENC_CODEC_H263) && (pParam->bEnableDataPartitioning) )
113411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
113511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               DEBUG_PRINT_ERROR("DataPartioning are not Supported for this codec");
113611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               break;
113711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
113811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if ( (m_codec != SWVENC_CODEC_H263) && (pParam->nResynchMarkerSpacing) )
113911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
114011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               Prop.info.slice_config.mode = SWVENC_SLICE_MODE_BYTE;
114111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               Prop.info.slice_config.size = pParam->nResynchMarkerSpacing;
114211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
114311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if ( (SWVENC_CODEC_H263 == m_codec) && (pParam->bEnableResync) )
114411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
114511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               Prop.info.slice_config.mode = SWVENC_SLICE_MODE_GOB;
114611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               Prop.info.slice_config.size = 0;
114711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               Ret = swvenc_setproperty(m_hSwVenc, &Prop);
114811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               if (Ret != SWVENC_S_SUCCESS)
114911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               {
115011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                  DEBUG_PRINT_ERROR("%s, swvenc_setproperty failed (%d)",
115111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    __FUNCTION__, Ret);
115211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                  RETURN(OMX_ErrorUndefined);
115311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               }
115411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
115511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else
115611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
115711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               Prop.info.slice_config.mode = SWVENC_SLICE_MODE_OFF;
115811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               Prop.info.slice_config.size = 0;
115911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
116011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
116111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memcpy(&m_sErrorCorrection,pParam, sizeof(m_sErrorCorrection));
116211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
116311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
116411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
116511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoIntraRefresh:
116611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
116711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("set_param:OMX_IndexParamVideoIntraRefresh");
116811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_VIDEO_PARAM_INTRAREFRESHTYPE* pParam =
116911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (OMX_VIDEO_PARAM_INTRAREFRESHTYPE*)paramData;
117011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
117111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            Ret = swvenc_set_intra_refresh(pParam);
117211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (Ret != SWVENC_S_SUCCESS)
117311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
117411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               DEBUG_PRINT_ERROR("%s, swvenc_set_intra_refresh failed (%d)",
117511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 __FUNCTION__, Ret);
117611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               RETURN(OMX_ErrorUnsupportedSetting);
117711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
117811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
117911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memcpy(&m_sIntraRefresh, pParam, sizeof(m_sIntraRefresh));
118011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
118111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
118211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
118311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoMetaBufferMode:
118411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
118511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            StoreMetaDataInBuffersParams *pParam =
118611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (StoreMetaDataInBuffersParams*)paramData;
118711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("set_parameter:OMX_QcomIndexParamVideoMetaBufferMode: "
118811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    "port_index = %u, meta_mode = %d", pParam->nPortIndex, pParam->bStoreMetaData);
118911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
119011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pParam->nPortIndex == PORT_INDEX_IN)
119111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
119211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (pParam->bStoreMetaData != meta_mode_enable)
119311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
119411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    meta_mode_enable = pParam->bStoreMetaData;
119511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!meta_mode_enable)
119611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    {
119711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        Ret = swvenc_get_buffer_req(&m_sOutPortDef.nBufferCountMin,
119811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                 &m_sOutPortDef.nBufferCountActual,
119911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                 &m_sOutPortDef.nBufferSize,
120011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                 &m_sOutPortDef.nBufferAlignment,
120111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                 m_sOutPortDef.nPortIndex);
120211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (Ret != SWVENC_S_SUCCESS)
120311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        {
120411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           DEBUG_PRINT_ERROR("ERROR: %s, swvenc_get_buffer_req failed (%d)", __FUNCTION__,
120511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              Ret);
120611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           eRet = OMX_ErrorUndefined;
120711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           break;
120811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
120911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
121011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
121111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
121211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (pParam->nPortIndex == PORT_INDEX_OUT && secure_session)
121311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
121411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (pParam->bStoreMetaData != meta_mode_enable)
121511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
121611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    meta_mode_enable = pParam->bStoreMetaData;
121711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
121811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
121911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else
122011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
122111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (pParam->bStoreMetaData)
122211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
122311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("set_parameter: metamode is "
122411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            "valid for input port only");
122511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    eRet = OMX_ErrorUnsupportedIndex;
122611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
122711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
122811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
122911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        break;
123011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
123111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamIndexExtraDataType:
123211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
123311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamIndexExtraDataType");
123411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            QOMX_INDEXEXTRADATATYPE *pParam = (QOMX_INDEXEXTRADATATYPE *)paramData;
123511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_U32 mask = 0;
123611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
123711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pParam->nIndex == (OMX_INDEXTYPE)OMX_ExtraDataVideoEncoderSliceInfo)
123811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
123911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (pParam->nPortIndex == PORT_INDEX_OUT)
124011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
124111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    mask = VEN_EXTRADATA_SLICEINFO;
124211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
124311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("SliceInfo extradata %s",
124411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            ((pParam->bEnabled == OMX_TRUE) ? "enabled" : "disabled"));
124511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
124611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                else
124711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
124811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("set_parameter: Slice information is "
124911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            "valid for output port only");
125011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    eRet = OMX_ErrorUnsupportedIndex;
125111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
125211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
125311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
125411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else if (pParam->nIndex == (OMX_INDEXTYPE)OMX_ExtraDataVideoEncoderMBInfo)
125511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
125611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (pParam->nPortIndex == PORT_INDEX_OUT)
125711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
125811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    mask = VEN_EXTRADATA_MBINFO;
125911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
126011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("MBInfo extradata %s",
126111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            ((pParam->bEnabled == OMX_TRUE) ? "enabled" : "disabled"));
126211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
126311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                else
126411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
126511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("set_parameter: MB information is "
126611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            "valid for output port only");
126711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    eRet = OMX_ErrorUnsupportedIndex;
126811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
126911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
127011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
127111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else
127211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
127311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("set_parameter: unsupported extrdata index (%x)",
127411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->nIndex);
127511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                eRet = OMX_ErrorUnsupportedIndex;
127611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
127711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
127811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
127911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
128011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pParam->bEnabled == OMX_TRUE)
128111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
128211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_sExtraData |= mask;
128311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
128411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else
128511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
128611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_sExtraData &= ~mask;
128711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
128811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
128911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            #if 0
129011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // TBD: add setprop to swvenc once the support is added
129111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (handle->venc_set_param((OMX_PTR)!!(m_sExtraData & mask),
129211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (OMX_INDEXTYPE)pParam->nIndex) != true)
129311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
129411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR: Setting Extradata (%x) failed", pParam->nIndex);
129511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                RETURN(OMX_ErrorUnsupportedSetting);
129611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
129711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else
129811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            #endif
129911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
130011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_sOutPortDef.nPortIndex = PORT_INDEX_OUT;
130111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bResult = dev_get_buf_req(&m_sOutPortDef.nBufferCountMin,
130211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        &m_sOutPortDef.nBufferCountActual,
130311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        &m_sOutPortDef.nBufferSize,
130411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_sOutPortDef.nPortIndex);
130511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (false == bResult)
130611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
130711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   DEBUG_PRINT_ERROR("dev_get_buf_req failed");
130811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   eRet = OMX_ErrorUndefined;
130911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   break;
131011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
131111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
131211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("updated out_buf_req: buffer cnt=%u, "
131311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        "count min=%u, buffer size=%u",
131411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_sOutPortDef.nBufferCountActual,
131511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_sOutPortDef.nBufferCountMin,
131611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_sOutPortDef.nBufferSize);
131711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
131811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
131911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
132011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
132111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoMaxAllowedBitrateCheck:
132211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
132311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            QOMX_EXTNINDEX_PARAMTYPE* pParam =
132411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (QOMX_EXTNINDEX_PARAMTYPE*)paramData;
132511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pParam->nPortIndex == PORT_INDEX_OUT)
132611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
132711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_max_allowed_bitrate_check =
132811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    ((pParam->bEnable == OMX_TRUE) ? true : false);
132911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("set_parameter: max allowed bitrate check %s",
133011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        ((pParam->bEnable == OMX_TRUE) ? "enabled" : "disabled"));
133111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
133211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else
133311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
133411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR: OMX_QcomIndexParamVideoMaxAllowedBitrateCheck "
133511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        " called on wrong port(%u)", pParam->nPortIndex);
133611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                RETURN(OMX_ErrorBadPortIndex);
133711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
133811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
133911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
134011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
134111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexEnableSliceDeliveryMode:
134211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
134311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            QOMX_EXTNINDEX_PARAMTYPE* pParam =
134411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (QOMX_EXTNINDEX_PARAMTYPE*)paramData;
134511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pParam->nPortIndex == PORT_INDEX_OUT)
134611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
134711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                //TBD: add setprop to swvenc once the support is added
134811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                #if 0
134911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!handle->venc_set_param(paramData,
135011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            (OMX_INDEXTYPE)OMX_QcomIndexEnableSliceDeliveryMode)) {
135111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Request for setting slice delivery mode failed");
135211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    RETURN( OMX_ErrorUnsupportedSetting;
135311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
135411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                #endif
135511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
135611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Request for setting slice delivery mode failed");
135711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    RETURN(OMX_ErrorUnsupportedSetting);
135811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
135911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
136011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else
136111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
136211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR: OMX_QcomIndexEnableSliceDeliveryMode "
136311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        "called on wrong port(%u)", pParam->nPortIndex);
136411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                RETURN(OMX_ErrorBadPortIndex);
136511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
136611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
136711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
136811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
136911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexEnableH263PlusPType:
137011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
137111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            QOMX_EXTNINDEX_PARAMTYPE* pParam =
137211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (QOMX_EXTNINDEX_PARAMTYPE*)paramData;
137311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("OMX_QcomIndexEnableH263PlusPType");
137411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pParam->nPortIndex == PORT_INDEX_OUT)
137511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
137611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR: Request for setting PlusPType failed");
137711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                RETURN(OMX_ErrorUnsupportedSetting);
137811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
137911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else
138011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
138111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR: OMX_QcomIndexEnableH263PlusPType "
138211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        "called on wrong port(%u)", pParam->nPortIndex);
138311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                RETURN(OMX_ErrorBadPortIndex);
138411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
138511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
138611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
138711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
138811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamPeakBitrate:
138911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
139011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR: Setting peak bitrate");
139111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            RETURN(OMX_ErrorUnsupportedSetting);
139211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
139311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
139411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
139511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case QOMX_IndexParamVideoInitialQp:
139611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
139711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // TBD: applicable to RC-on case only
139811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR: Setting Initial QP for RC-on case");
139911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            RETURN(OMX_ErrorNone);
140011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
140111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
140211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
140311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
140411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamSetMVSearchrange:
140511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
140611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR: Setting Searchrange");
140711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            RETURN(OMX_ErrorUnsupportedSetting);
140811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
140911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
141011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
141111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        default:
141211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
141311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown param %d", paramIndex);
141411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            eRet = OMX_ErrorUnsupportedIndex;
141511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
141611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
141711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
141811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
141911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    RETURN(eRet);
142011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
142111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
142211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_venc::set_config
142311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(
142411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX_IN OMX_HANDLETYPE      hComp,
142511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX_IN OMX_INDEXTYPE configIndex,
142611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX_IN OMX_PTR        configData
142711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel)
142811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
142911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ENTER_FUNC();
143011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
143111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    SWVENC_STATUS SwStatus;
143211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
143311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void)hComp;
143411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
143511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (configData == NULL)
143611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
143711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR: param is null");
143811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        RETURN(OMX_ErrorBadParameter);
143911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
144011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
144111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_state == OMX_StateInvalid)
144211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
144311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR: config called in Invalid state");
144411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        RETURN(OMX_ErrorIncorrectStateOperation);
144511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
144611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
144711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch ((int)configIndex)
144811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
144911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexConfigVideoBitrate:
145011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
145111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_VIDEO_CONFIG_BITRATETYPE* pParam =
145211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                reinterpret_cast<OMX_VIDEO_CONFIG_BITRATETYPE*>(configData);
145311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("set_config(): OMX_IndexConfigVideoBitrate (%u)", pParam->nEncodeBitrate);
145411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
145511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pParam->nPortIndex == PORT_INDEX_OUT)
145611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
145711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                SwStatus = swvenc_set_bit_rate(pParam->nEncodeBitrate);
145811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (SwStatus != SWVENC_S_SUCCESS)
145911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
146011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   DEBUG_PRINT_ERROR("%s, swvenc_set_bit_rate failed (%d)",
146111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     __FUNCTION__, SwStatus);
146211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   RETURN(OMX_ErrorUnsupportedSetting);
146311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
146411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
146511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_sConfigBitrate.nEncodeBitrate = pParam->nEncodeBitrate;
146611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_sParamBitrate.nTargetBitrate = pParam->nEncodeBitrate;
146711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_sOutPortDef.format.video.nBitrate = pParam->nEncodeBitrate;
146811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
146911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else
147011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
147111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR: Unsupported port index: %u", pParam->nPortIndex);
147211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                RETURN(OMX_ErrorBadPortIndex);
147311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
147411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
147511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
147611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexConfigVideoFramerate:
147711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
147811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_CONFIG_FRAMERATETYPE* pParam =
147911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                reinterpret_cast<OMX_CONFIG_FRAMERATETYPE*>(configData);
148011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("set_config(): OMX_IndexConfigVideoFramerate (0x%x)", pParam->xEncodeFramerate);
148111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
148211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pParam->nPortIndex == PORT_INDEX_OUT)
148311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
148411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                SwStatus = swvenc_set_frame_rate(pParam->xEncodeFramerate >> 16);
148511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (SwStatus != SWVENC_S_SUCCESS)
148611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
148711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   DEBUG_PRINT_ERROR("%s, swvenc_set_frame_rate failed (%d)",
148811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     __FUNCTION__, SwStatus);
148911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   RETURN(OMX_ErrorUnsupportedSetting);
149011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
149111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
149211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_sConfigFramerate.xEncodeFramerate = pParam->xEncodeFramerate;
149311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_sOutPortDef.format.video.xFramerate = pParam->xEncodeFramerate;
149411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_sOutPortFormat.xFramerate = pParam->xEncodeFramerate;
149511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
149611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else
149711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
149811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR: Unsupported port index: %u", pParam->nPortIndex);
149911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                RETURN(OMX_ErrorBadPortIndex);
150011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
150111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
150211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
150311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case QOMX_IndexConfigVideoIntraperiod:
150411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
150511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            QOMX_VIDEO_INTRAPERIODTYPE* pParam =
150611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                reinterpret_cast<QOMX_VIDEO_INTRAPERIODTYPE*>(configData);
150711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("set_config(): QOMX_IndexConfigVideoIntraperiod");
150811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
150911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pParam->nPortIndex == PORT_INDEX_OUT)
151011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
151111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (pParam->nBFrames > 0)
151211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
151311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("B frames not supported");
151411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    RETURN(OMX_ErrorUnsupportedSetting);
151511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
151611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
151711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Old: P/B frames = %u/%u, New: P/B frames = %u/%u",
151811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_sIntraperiod.nPFrames, m_sIntraperiod.nBFrames,
151911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        pParam->nPFrames, pParam->nBFrames);
152011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (m_sIntraperiod.nBFrames != pParam->nBFrames)
152111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
152211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("Dynamically changing B-frames not supported");
152311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    RETURN(OMX_ErrorUnsupportedSetting);
152411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
152511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
152611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* set the intra period */
152711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                SwStatus = swvenc_set_intra_period(pParam->nPFrames,pParam->nBFrames);
152811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (SwStatus != SWVENC_S_SUCCESS)
152911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
153011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   DEBUG_PRINT_ERROR("%s, swvenc_set_intra_period failed (%d)",
153111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     __FUNCTION__, SwStatus);
153211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   RETURN(OMX_ErrorUnsupportedSetting);
153311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
153411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
153511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_sIntraperiod.nPFrames = pParam->nPFrames;
153611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_sIntraperiod.nBFrames = pParam->nBFrames;
153711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_sIntraperiod.nIDRPeriod = pParam->nIDRPeriod;
153811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
153911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (m_sOutPortFormat.eCompressionFormat == OMX_VIDEO_CodingMPEG4)
154011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
154111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_sParamMPEG4.nPFrames = pParam->nPFrames;
154211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (m_sParamMPEG4.eProfile != OMX_VIDEO_MPEG4ProfileSimple)
154311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    {
154411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_sParamMPEG4.nBFrames = pParam->nBFrames;
154511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
154611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    else
154711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    {
154811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_sParamMPEG4.nBFrames = 0;
154911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
155011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
155111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                else if (m_sOutPortFormat.eCompressionFormat == OMX_VIDEO_CodingH263)
155211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
155311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_sParamH263.nPFrames = pParam->nPFrames;
155411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
155511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
155611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else
155711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
155811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR: (QOMX_IndexConfigVideoIntraperiod) Unsupported port index: %u", pParam->nPortIndex);
155911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                RETURN(OMX_ErrorBadPortIndex);
156011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
156111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
156211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
156311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
156411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexConfigVideoIntraVOPRefresh:
156511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
156611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            OMX_CONFIG_INTRAREFRESHVOPTYPE* pParam =
156711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                reinterpret_cast<OMX_CONFIG_INTRAREFRESHVOPTYPE*>(configData);
156811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("set_config(): OMX_IndexConfigVideoIntraVOPRefresh");
156911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
157011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pParam->nPortIndex == PORT_INDEX_OUT)
157111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
157211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
157311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                SWVENC_PROPERTY Prop;
157411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
157511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                Prop.id = SWVENC_PROPERTY_ID_IFRAME_REQUEST;
157611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
157711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                SwStatus = swvenc_setproperty(m_hSwVenc, &Prop);
157811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (SwStatus != SWVENC_S_SUCCESS)
157911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                {
158011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   DEBUG_PRINT_ERROR("%s, swvenc_setproperty failed (%d)",
158111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     __FUNCTION__, SwStatus);
158211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   RETURN(OMX_ErrorUnsupportedSetting);
158311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
158411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
158511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_sConfigIntraRefreshVOP.IntraRefreshVOP = pParam->IntraRefreshVOP;
158611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
158711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            else
158811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
158911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR: Unsupported port index: %u", pParam->nPortIndex);
159011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                RETURN(OMX_ErrorBadPortIndex);
159111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
159211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
159311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
159411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexConfigCommonRotate:
159511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
159611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR: OMX_IndexConfigCommonRotate not supported");
159711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            RETURN(OMX_ErrorUnsupportedSetting);
159811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
159911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
160011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        default:
160111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR: unsupported index %d", (int) configIndex);
1602d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel            RETURN(OMX_ErrorUnsupportedSetting);
160311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
160411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
160511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
160611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    EXIT_FUNC();
160711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
160811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    RETURN(OMX_ErrorNone);
160911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
161011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
161111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE  omx_venc::component_deinit(OMX_IN OMX_HANDLETYPE hComp)
161211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
161311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ENTER_FUNC();
161411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
161511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 i = 0;
161611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("omx_venc(): Inside component_deinit()");
161711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
161811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void)hComp;
161911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
162011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (OMX_StateLoaded != m_state)
162111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
162211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d",
162311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                m_state);
162411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
162511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_out_mem_ptr)
162611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
162711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Freeing the Output Memory");
162811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (i=0; i< m_sOutPortDef.nBufferCountActual; i++ )
162911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
163011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            free_output_buffer (&m_out_mem_ptr[i]);
163111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
163211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(m_out_mem_ptr);
163311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_out_mem_ptr = NULL;
163411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
163511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
163611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* Check if the input buffers have to be cleaned up */
163711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ( m_inp_mem_ptr && !meta_mode_enable )
163811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
163911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Freeing the Input Memory");
164011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (i=0; i<m_sInPortDef.nBufferCountActual; i++)
164111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
164211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            free_input_buffer (&m_inp_mem_ptr[i]);
164311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
164411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
164511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        free(m_inp_mem_ptr);
164611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_inp_mem_ptr = NULL;
164711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
164811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
164911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* Reset counters in msg queues */
165011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_ftb_q.m_size=0;
165111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_cmd_q.m_size=0;
165211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_etb_q.m_size=0;
165311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_ftb_q.m_read = m_ftb_q.m_write =0;
165411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_cmd_q.m_read = m_cmd_q.m_write =0;
165511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_etb_q.m_read = m_etb_q.m_write =0;
165611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
165711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* Clear the strong reference */
165811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("Calling m_heap_ptr.clear()");
165911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_heap_ptr.clear();
166011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
166111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("Calling swvenc_deinit()");
166211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    swvenc_deinit(m_hSwVenc);
166311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
166411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("OMX_Venc:Component Deinit");
166511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
166611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    RETURN(OMX_ErrorNone);
166711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
166811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
166911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_U32 omx_venc::dev_stop(void)
167011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
167111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ENTER_FUNC();
167211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
167311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    SWVENC_STATUS Ret;
167411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
167511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (false == m_stopped)
167611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
167711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       Ret = swvenc_stop(m_hSwVenc);
167811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       if (Ret != SWVENC_S_SUCCESS)
167911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       {
168011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          DEBUG_PRINT_ERROR("%s, swvenc_stop failed (%d)",
168111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            __FUNCTION__, Ret);
168211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          RETURN(-1);
168311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       }
1684b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel       set_format = false;
168511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       m_stopped = true;
168611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
168711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       /* post STOP_DONE event as start is synchronus */
168811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       post_event (0, OMX_ErrorNone, OMX_COMPONENT_GENERATE_STOP_DONE);
168911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
169011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
169111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    RETURN(0);
169211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
169311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
169411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_U32 omx_venc::dev_pause(void)
169511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
169611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ENTER_FUNC();
169711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // nothing to be done for sw encoder
169811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
169911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    RETURN(true);
170011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
170111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
170211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_U32 omx_venc::dev_resume(void)
170311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
170411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ENTER_FUNC();
170511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // nothing to be done for sw encoder
170611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
170711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    RETURN(true);
170811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
170911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
171011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_U32 omx_venc::dev_start(void)
171111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
171211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ENTER_FUNC();
171311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   SWVENC_STATUS Ret;
171411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Ret = swvenc_start(m_hSwVenc);
171511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   if (Ret != SWVENC_S_SUCCESS)
171611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   {
171711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      DEBUG_PRINT_ERROR("%s, swvenc_start failed (%d)",
171811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        __FUNCTION__, Ret);
171911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      RETURN(-1);
172011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   }
172111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
172211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   m_stopped = false;
172311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
172411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN(0);
172511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
172611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
172711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_U32 omx_venc::dev_flush(unsigned port)
172811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
172911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ENTER_FUNC();
173011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   SWVENC_STATUS Ret;
173111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
173211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   (void)port;
173311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Ret = swvenc_flush(m_hSwVenc);
173411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   if (Ret != SWVENC_S_SUCCESS)
173511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   {
173611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      DEBUG_PRINT_ERROR("%s, swvenc_flush failed (%d)",
173711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        __FUNCTION__, Ret);
173811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      RETURN(-1);
173911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   }
174011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
174111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN(0);
174211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
174311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
174411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_U32 omx_venc::dev_start_done(void)
174511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
174611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ENTER_FUNC();
174711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
174811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   /* post START_DONE event as start is synchronus */
174911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   post_event (0, OMX_ErrorNone, OMX_COMPONENT_GENERATE_START_DONE);
175011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
175111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN(0);
175211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
175311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
175411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_U32 omx_venc::dev_set_message_thread_id(pthread_t tid)
175511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
175611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ENTER_FUNC();
175711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
175811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // nothing to be done for sw encoder
175911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void)tid;
176011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
176111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    RETURN(true);
176211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
176311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
176411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_venc::dev_use_buf(void *buf_addr,unsigned port,unsigned index)
176511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
176611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ENTER_FUNC();
176711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
176811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void)buf_addr;
176911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void)port;
177011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void)index;
177111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
177211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    RETURN(true);
177311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
177411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
177511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_venc::dev_free_buf(void *buf_addr,unsigned port)
177611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
177711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ENTER_FUNC();
177811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
177911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void)buf_addr;
178011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void)port;
178111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
178211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    RETURN(true);
178311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
178411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
178511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_venc::dev_empty_buf
178611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(
178711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    void *buffer,
178811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    void *pmem_data_buf,
178911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned index,
179011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned fd
179111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel)
179211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
179311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ENTER_FUNC();
179411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
179511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    SWVENC_STATUS Ret;
179611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    SWVENC_IPBUFFER ipbuffer;
179711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE *bufhdr = (OMX_BUFFERHEADERTYPE *)buffer;
179811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int size = 0, filled_length, offset = 0;
17992601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    SWVENC_COLOR_FORMAT color_format;
18002601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    SWVENC_PROPERTY prop;
180111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
180211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void)pmem_data_buf;
180311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void)index;
180411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
180511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (meta_mode_enable)
180611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
1807fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        LEGACY_CAM_METADATA_TYPE *meta_buf = NULL;
1808fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        meta_buf = (LEGACY_CAM_METADATA_TYPE *)bufhdr->pBuffer;
1809b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        if(m_sInPortDef.format.video.eColorFormat == ((OMX_COLOR_FORMATTYPE) QOMX_COLOR_FormatAndroidOpaque))
1810b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        {
1811b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            DEBUG_PRINT_LOW("dev_empty_buf: color_format is QOMX_COLOR_FormatAndroidOpaque");
1812b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            set_format = true;
1813b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        }
1814fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        if(!meta_buf)
1815fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        {
1816fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            if (!bufhdr->nFilledLen && (bufhdr->nFlags & OMX_BUFFERFLAG_EOS))
1817fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            {
1818fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                ipbuffer.p_buffer= bufhdr->pBuffer;
1819fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                ipbuffer.size = bufhdr->nAllocLen;
1820fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                ipbuffer.filled_length = bufhdr->nFilledLen;
1821fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                DEBUG_PRINT_LOW("dev_empty_buf: empty EOS buffer");
1822fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
1823fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            else
1824fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            {
1825fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                return false;
1826fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
1827fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        }
1828fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        else
1829fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        {
1830fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            if (meta_buf->buffer_type == LEGACY_CAM_SOURCE)
1831fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            {
1832fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                offset = meta_buf->meta_handle->data[1];
1833fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                size = meta_buf->meta_handle->data[2];
1834b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                if (set_format && (meta_buf->meta_handle->numFds + meta_buf->meta_handle->numInts > 5))
18352601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                {
183669b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel                    m_sInPortFormat.eColorFormat = (OMX_COLOR_FORMATTYPE)meta_buf->meta_handle->data[5];
1837fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                }
1838fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                ipbuffer.p_buffer = (unsigned char *)mmap(NULL, size, PROT_READ|PROT_WRITE,MAP_SHARED, fd, offset);
1839fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                if (ipbuffer.p_buffer == MAP_FAILED)
1840fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                {
1841fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    DEBUG_PRINT_ERROR("mmap() failed for fd %d of size %d",fd,size);
1842fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    RETURN(OMX_ErrorBadParameter);
1843fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                }
1844fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                ipbuffer.size = size;
1845fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                ipbuffer.filled_length = size;
1846fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
1847fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            else if (meta_buf->buffer_type == kMetadataBufferTypeGrallocSource)
1848fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            {
1849fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                VideoGrallocMetadata *meta_buf = (VideoGrallocMetadata *)bufhdr->pBuffer;
1850fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                private_handle_t *handle = (private_handle_t *)meta_buf->pHandle;
1851fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                size = handle->size;
1852b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                if(set_format)
1853fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                {
1854fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    DEBUG_PRINT_LOW("color format = 0x%x",handle->format);
1855fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    if (((OMX_COLOR_FORMATTYPE)handle->format) != m_sInPortFormat.eColorFormat)
18562601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                    {
1857fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        if(handle->format == HAL_PIXEL_FORMAT_NV12_ENCODEABLE)
1858fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        {
1859fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            m_sInPortFormat.eColorFormat = (OMX_COLOR_FORMATTYPE)
1860fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
1861fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        }
1862fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        else
1863fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        {
1864fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            DEBUG_PRINT_ERROR("%s: OMX_IndexParamVideoPortFormat 0x%x invalid",
1865fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                              __FUNCTION__,handle->format);
1866fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            RETURN(OMX_ErrorBadParameter);
1867fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        }
18682601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                    }
18692601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                }
1870fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                ipbuffer.p_buffer = (unsigned char *)mmap(NULL, size, PROT_READ|PROT_WRITE,MAP_SHARED, fd, offset);
1871fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                if (ipbuffer.p_buffer == MAP_FAILED)
1872fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                {
1873fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    DEBUG_PRINT_ERROR("mmap() failed for fd %d of size %d",fd,size);
1874fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    RETURN(OMX_ErrorBadParameter);
1875fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                }
1876fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                ipbuffer.size = size;
1877fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                ipbuffer.filled_length = size;
1878fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
1879fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            else
1880fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            {
1881fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                //handles the use case for surface encode
1882fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                ipbuffer.p_buffer = bufhdr->pBuffer;
1883fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                ipbuffer.size = bufhdr->nAllocLen;
1884fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                ipbuffer.filled_length = bufhdr->nFilledLen;
1885fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
1886b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            if (set_format)
188769b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel            {
1888b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                set_format = false;
1889b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                m_sInPortDef.format.video.eColorFormat = m_sInPortFormat.eColorFormat;
1890b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                Ret = swvenc_set_color_format(m_sInPortFormat.eColorFormat);
1891b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                if (Ret != SWVENC_S_SUCCESS)
1892b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                {
1893b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                    DEBUG_PRINT_ERROR("%s, swvenc_setproperty failed (%d)",
1894b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                        __FUNCTION__, Ret);
1895b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                    RETURN(OMX_ErrorUnsupportedSetting);
1896b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                }
189769b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel            }
18982601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        }
189911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
190011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else
190111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
1902b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        ipbuffer.p_buffer = bufhdr->pBuffer;
1903b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        ipbuffer.size = bufhdr->nAllocLen;
1904b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        ipbuffer.filled_length = bufhdr->nFilledLen;
190511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
190611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ipbuffer.flags = 0;
190711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (bufhdr->nFlags & OMX_BUFFERFLAG_EOS)
190811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
190911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      ipbuffer.flags |= SWVENC_FLAG_EOS;
191011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
191111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ipbuffer.timestamp = bufhdr->nTimeStamp;
191211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ipbuffer.p_client_data = (unsigned char *)bufhdr;
191311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
191411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("ETB: p_buffer (%p) size (%d) filled_len (%d) flags (0x%X) timestamp (%lld) clientData (%p)",
191511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      ipbuffer.p_buffer,
191611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      ipbuffer.size,
191711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      ipbuffer.filled_length,
191811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      (unsigned int)ipbuffer.flags,
191911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      ipbuffer.timestamp,
192011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      ipbuffer.p_client_data);
192111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
192211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    Ret = swvenc_emptythisbuffer(m_hSwVenc, &ipbuffer);
192311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (Ret != SWVENC_S_SUCCESS)
192411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
192511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       DEBUG_PRINT_ERROR("%s, swvenc_emptythisbuffer failed (%d)",
192611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         __FUNCTION__, Ret);
192711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       RETURN(false);
192811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
192911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
193011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug.in_buffer_log)
193111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
193211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       swvenc_input_log_buffers((const char*)ipbuffer.p_buffer, ipbuffer.filled_length);
193311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
193411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
193511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    RETURN(true);
193611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
193711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
193811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_venc::dev_fill_buf
193911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(
194011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    void *buffer,
194111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    void *pmem_data_buf,
194211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned index,
194311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned fd
194411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel)
194511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
194611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ENTER_FUNC();
194711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
194811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    SWVENC_STATUS Ret;
194911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
195011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    SWVENC_OPBUFFER opbuffer;
195111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE *bufhdr = (OMX_BUFFERHEADERTYPE *)buffer;
195211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
195311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void)pmem_data_buf;
195411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void)index;
195511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void)fd;
195611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
195711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    opbuffer.p_buffer = bufhdr->pBuffer;
195811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    opbuffer.size = bufhdr->nAllocLen;
195911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    opbuffer.filled_length = bufhdr->nFilledLen;
196011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    opbuffer.flags = bufhdr->nFlags;
196111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    opbuffer.p_client_data = (unsigned char *)bufhdr;
196211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
196311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("FTB: p_buffer (%p) size (%d) filled_len (%d) flags (0x%X) timestamp (%lld) clientData (%p)",
196411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      opbuffer.p_buffer,
196511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      opbuffer.size,
196611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      opbuffer.filled_length,
196711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      opbuffer.flags,
196811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      opbuffer.timestamp,
196911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      opbuffer.p_client_data);
197011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
197111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ( false == m_bSeqHdrRequested)
197211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
197311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      if (dev_get_seq_hdr(opbuffer.p_buffer, opbuffer.size, &opbuffer.filled_length) == 0)
197411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      {
197511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         bufhdr->nFilledLen = opbuffer.filled_length;
197611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         bufhdr->nOffset = 0;
197711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         bufhdr->nTimeStamp = 0;
197811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         bufhdr->nFlags = OMX_BUFFERFLAG_CODECCONFIG;
197911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
198011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         DEBUG_PRINT_LOW("sending FBD with codec config");
198111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         m_bSeqHdrRequested = true;
198211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         post_event ((unsigned long)bufhdr,0,OMX_COMPONENT_GENERATE_FBD);
198311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      }
198411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      else
198511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      {
198611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         DEBUG_PRINT_ERROR("ERROR: couldn't get sequence header");
198711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         post_event(OMX_EventError,OMX_ErrorUndefined,OMX_COMPONENT_GENERATE_EVENT);
198811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      }
198911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
199011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else
199111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
199211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       Ret = swvenc_fillthisbuffer(m_hSwVenc, &opbuffer);
199311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       if (Ret != SWVENC_S_SUCCESS)
199411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       {
199511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          DEBUG_PRINT_ERROR("%s, swvenc_fillthisbuffer failed (%d)",
199611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            __FUNCTION__, Ret);
199711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          RETURN(false);
199811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       }
199911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
200011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
200111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    RETURN(true);
200211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
200311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
200411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_venc::dev_get_seq_hdr
200511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(
200611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   void *buffer,
200711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   unsigned size,
200811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   unsigned *hdrlen
200911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel)
201011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
201111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ENTER_FUNC();
201211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
201311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   SWVENC_STATUS Ret;
201411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   SWVENC_OPBUFFER Buffer;
201511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
201611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Buffer.p_buffer = (unsigned char*) buffer;
201711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Buffer.size = size;
201811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
201911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Ret = swvenc_getsequenceheader(m_hSwVenc, &Buffer);
202011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   if (Ret != SWVENC_S_SUCCESS)
202111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   {
202211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      DEBUG_PRINT_ERROR("%s, swvenc_flush failed (%d)",
202311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        __FUNCTION__, Ret);
202411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      RETURN(-1);
202511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   }
202611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
202711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   *hdrlen = Buffer.filled_length;
202811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
202911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN(0);
203011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
203111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
203211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_venc::dev_get_capability_ltrcount
203311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(
203411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX_U32 *min,
203511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX_U32 *max,
203611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX_U32 *step_size
203711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel)
203811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
203911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ENTER_FUNC();
204011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
204111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void)min;
204211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void)max;
204311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void)step_size;
204411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
204511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_ERROR("Get Capability LTR Count is not supported");
204611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
204711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    RETURN(false);
204811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
204911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
205011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_venc::dev_get_performance_level(OMX_U32 *perflevel)
205111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
205211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ENTER_FUNC();
205311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
205411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void)perflevel;
205511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_ERROR("Get performance level is not supported");
205611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
205711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    RETURN(false);
205811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
205911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
206011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_venc::dev_get_vui_timing_info(OMX_U32 *enabled)
206111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
206211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ENTER_FUNC();
206311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
206411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void)enabled;
206511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_ERROR("Get vui timing information is not supported");
206611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
206711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    RETURN(false);
206811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
206911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
207011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_venc::dev_get_vqzip_sei_info(OMX_U32 *enabled)
207111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
207211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ENTER_FUNC();
207311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
207411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void)enabled;
207511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_ERROR("Get vqzip sei info is not supported");
207611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
207711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    RETURN(false);
207811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
207911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
208011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_venc::dev_get_peak_bitrate(OMX_U32 *peakbitrate)
208111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
208211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //TBD: store the peak bitrate in class and return here;
208311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ENTER_FUNC();
208411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
208511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void)peakbitrate;
208611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_ERROR("Get peak bitrate is not supported");
208711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
208811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    RETURN(false);
208911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
209011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
209111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_venc::dev_get_batch_size(OMX_U32 *size)
209211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
209311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ENTER_FUNC();
209411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
209511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void)size;
209611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
209711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_ERROR("Get batch size is not supported");
209811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
209911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    RETURN(false);
210011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
210111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
210211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_venc::dev_loaded_start()
210311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
210411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ENTER_FUNC();
210511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN(true);
210611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
210711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
210811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_venc::dev_loaded_stop()
210911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
211011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ENTER_FUNC();
211111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN(true);
211211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
211311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
211411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_venc::dev_loaded_start_done()
211511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
211611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ENTER_FUNC();
211711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN(true);
211811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
211911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
212011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_venc::dev_loaded_stop_done()
212111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
212211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ENTER_FUNC();
212311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN(true);
212411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
212511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
212611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_venc::dev_get_buf_req(OMX_U32 *min_buff_count,
212711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 *actual_buff_count,
212811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 *buff_size,
212911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 port)
213011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
213111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ENTER_FUNC();
213211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
213311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   bool bRet = true;
213411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX_PARAM_PORTDEFINITIONTYPE *PortDef;
213511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
213611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   if (PORT_INDEX_IN == port)
213711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   {
213811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     PortDef = &m_sInPortDef;
213911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   }
214011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   else if (PORT_INDEX_OUT == port)
214111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   {
214211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     PortDef = &m_sOutPortDef;
214311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   }
214411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   else
214511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   {
214611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     DEBUG_PRINT_ERROR("ERROR: %s, Unsupported parameter", __FUNCTION__);
214711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     bRet = false;
214811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   }
214911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
215011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   if (true == bRet)
215111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   {
215211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      *min_buff_count = PortDef->nBufferCountMin;
215311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      *actual_buff_count = PortDef->nBufferCountActual;
215411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      *buff_size = PortDef->nBufferSize;
215511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   }
215611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
215711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN(true);
215811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
215911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
216011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_venc::dev_set_buf_req
216111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(
216211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX_U32 const *min_buff_count,
216311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX_U32 const *actual_buff_count,
216411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX_U32 const *buff_size,
216511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX_U32 port
216611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel)
216711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
216811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ENTER_FUNC();
216911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
217011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   SWVENC_STATUS Ret;
217111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX_PARAM_PORTDEFINITIONTYPE *PortDef;
217211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
217311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   (void)min_buff_count;
217411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   if (PORT_INDEX_IN == port)
217511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   {
217611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     PortDef = &m_sInPortDef;
217711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   }
217811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   else if (PORT_INDEX_OUT == port)
217911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   {
218011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     PortDef = &m_sOutPortDef;
218111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   }
218211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   else
218311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   {
218411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     DEBUG_PRINT_ERROR("ERROR: %s, Unsupported parameter", __FUNCTION__);
218511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     RETURN(false);
218611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   }
218711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
218811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   if (*actual_buff_count < PortDef->nBufferCountMin)
218911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   {
219011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      DEBUG_PRINT_ERROR("ERROR: %s, (actual,min) buffer count (%d, %d)",
219111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         __FUNCTION__, *actual_buff_count, PortDef->nBufferCountMin);
219211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      RETURN(false);
219311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   }
219411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   if (false == meta_mode_enable)
219511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   {
219611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      if (*buff_size < PortDef->nBufferSize)
219711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      {
219811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          DEBUG_PRINT_ERROR("ERROR: %s, (new,old) buffer count (%d, %d)",
219911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             __FUNCTION__, *actual_buff_count, PortDef->nBufferCountMin);
220011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          RETURN(false);
220111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      }
220211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   }
220311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
220411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN(true);
220511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
220611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
220711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_venc::dev_is_video_session_supported(OMX_U32 width, OMX_U32 height)
220811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
220911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ENTER_FUNC();
221011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
221111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   if ( (width * height < m_capability.min_width *  m_capability.min_height) ||
221211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (width * height > m_capability.max_width *  m_capability.max_height)
221311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      )
221411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   {
221511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       DEBUG_PRINT_ERROR(
221611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         "Unsupported Resolution WxH = (%u)x(%u) Supported Range = min (%d)x(%d) - max (%d)x(%d)",
221711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         width, height,
221811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         m_capability.min_width, m_capability.min_height,
221911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         m_capability.max_width, m_capability.max_height);
222011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       RETURN(false);
222111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   }
222211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
222311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN(true);
222411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
222511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
222611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_venc::dev_buffer_ready_to_queue(OMX_BUFFERHEADERTYPE *buffer)
222711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
222811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ENTER_FUNC();
222911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
223011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   (void)buffer;
223111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN(true);
223211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
223311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_venc::dev_handle_output_extradata(void *buffer, int fd)
223411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
223511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ENTER_FUNC();
223611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
223711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   (void)buffer;
223811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   (void)fd;
223911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
224011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN(true);
224111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
224211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
224311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_venc::dev_handle_input_extradata(void *buffer, int fd, int index)
224411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
224511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ENTER_FUNC();
224611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
224711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   (void)buffer;
224811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   (void)fd;
224911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   (void)index;
225011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
225111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN(true);
225211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
225311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
225411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_venc::dev_set_extradata_cookie(void *buffer)
225511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
225611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ENTER_FUNC();
225711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
225811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   (void)buffer;
225911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
226011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
226111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_venc::dev_set_format(int color)
226211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
226311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ENTER_FUNC();
226411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
226511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   (void)color;
226611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
226711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN(true);
226811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //return handle->venc_set_format(color);
226911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
227011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
227111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_venc::dev_color_align(OMX_BUFFERHEADERTYPE *buffer,
227211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 width, OMX_U32 height)
227311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
227411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ENTER_FUNC();
227511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
227611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if(secure_session) {
227711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Cannot align colors in secure session.");
227811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        RETURN(OMX_FALSE);
227911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
228069b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel    return swvenc_color_align(buffer, width,height);
228111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
228211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
228311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_venc::is_secure_session()
228411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
228511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ENTER_FUNC();
228611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
228711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    RETURN(secure_session);
228811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
228911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
229011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_venc::dev_get_output_log_flag()
229111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
229211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ENTER_FUNC();
229311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
229411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    RETURN(m_debug.out_buffer_log == 1);
229511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
229611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
229711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_venc::dev_output_log_buffers(const char *buffer, int bufferlen)
229811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
229911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ENTER_FUNC();
230011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
230111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug.out_buffer_log && !m_debug.outfile)
230211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
230311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int size = 0;
230411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int width = m_sInPortDef.format.video.nFrameWidth;
230511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int height = m_sInPortDef.format.video.nFrameHeight;
230611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if(SWVENC_CODEC_MPEG4 == m_codec)
230711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
230811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           size = snprintf(m_debug.outfile_name, PROPERTY_VALUE_MAX,
230911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel              "%s/output_enc_%d_%d_%p.m4v",
231011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel              m_debug.log_loc, width, height, this);
231111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
231211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else if(SWVENC_CODEC_H263 == m_codec)
231311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
231411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           size = snprintf(m_debug.outfile_name, PROPERTY_VALUE_MAX,
231511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel              "%s/output_enc_%d_%d_%p.263",
231611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel              m_debug.log_loc, width, height, this);
231711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
231811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((size > PROPERTY_VALUE_MAX) || (size < 0))
231911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
232011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           DEBUG_PRINT_ERROR("Failed to open output file: %s for logging as size:%d",
232111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              m_debug.outfile_name, size);
232211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           RETURN(-1);
232311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
232411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("output filename = %s", m_debug.outfile_name);
232511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_debug.outfile = fopen(m_debug.outfile_name, "ab");
232611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!m_debug.outfile)
232711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
232811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           DEBUG_PRINT_ERROR("Failed to open output file: %s for logging errno:%d",
232911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                             m_debug.outfile_name, errno);
233011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           m_debug.outfile_name[0] = '\0';
233111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           RETURN(-1);
233211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
233311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
233411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug.outfile && buffer && bufferlen)
233511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
233611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("%s buffer length: %d", __func__, bufferlen);
233711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fwrite(buffer, bufferlen, 1, m_debug.outfile);
233811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
233911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
234011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    RETURN(0);
234111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
234211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
234311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_venc::swvenc_input_log_buffers(const char *buffer, int bufferlen)
234411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
234511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   int width = m_sInPortDef.format.video.nFrameWidth;
234611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   int height = m_sInPortDef.format.video.nFrameHeight;
234711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   int stride = VENUS_Y_STRIDE(COLOR_FMT_NV12, width);
234811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   int scanlines = VENUS_Y_SCANLINES(COLOR_FMT_NV12, height);
234911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   char *temp = (char*)buffer;
235011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
235111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   if (!m_debug.infile)
235211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   {
235311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       int size = snprintf(m_debug.infile_name, PROPERTY_VALUE_MAX,
235411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                      "%s/input_enc_%d_%d_%p.yuv",
235511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                      m_debug.log_loc, width, height, this);
235611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       if ((size > PROPERTY_VALUE_MAX) || (size < 0))
235711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       {
235811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           DEBUG_PRINT_ERROR("Failed to open input file: %s for logging size:%d",
235911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                              m_debug.infile_name, size);
236011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           RETURN(-1);
236111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       }
236211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       DEBUG_PRINT_LOW("input filename = %s", m_debug.infile_name);
236311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       m_debug.infile = fopen (m_debug.infile_name, "ab");
236411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       if (!m_debug.infile)
236511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       {
236611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           DEBUG_PRINT_HIGH("Failed to open input file: %s for logging",
236711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel              m_debug.infile_name);
236811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           m_debug.infile_name[0] = '\0';
236911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           RETURN(-1);
237011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       }
237111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   }
237211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   if (m_debug.infile && buffer && bufferlen)
237311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   {
237411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       DEBUG_PRINT_LOW("%s buffer length: %d", __func__, bufferlen);
237511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       for (int i = 0; i < height; i++)
237611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       {
237711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          fwrite(temp, width, 1, m_debug.infile);
237811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          temp += stride;
237911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       }
2380af7f1cd76eaafee0d9838e6c40af9c494e884e36Thierry Strudel       temp = (char*)(buffer + (stride * scanlines));
238111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       for(int i = 0; i < height/2; i++)
238211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       {
238311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          fwrite(temp, width, 1, m_debug.infile);
238411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          temp += stride;
238511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      }
238611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   }
238711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
238811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN(0);
238911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
239011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
239111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_venc::dev_extradata_log_buffers(char *buffer)
239211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
239311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ENTER_FUNC();
239411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
239511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   (void)buffer;
239611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
239711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN(true);
239811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //return handle->venc_extradata_log_buffers(buffer);
239911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
240011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
240111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelSWVENC_STATUS omx_venc::swvenc_get_buffer_req
240211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(
240311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX_U32 *min_buff_count,
240411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX_U32 *actual_buff_count,
240511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX_U32 *buff_size,
240611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX_U32 *buff_alignment,
240711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   OMX_U32 port
240811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel)
240911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
241011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ENTER_FUNC();
241111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
241211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    SWVENC_PROPERTY Prop;
241311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    SWVENC_STATUS Ret;
241411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_PARAM_PORTDEFINITIONTYPE *PortDef;
241511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
241611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    Prop.id = SWVENC_PROPERTY_ID_BUFFER_REQ;
241711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (PORT_INDEX_IN == port)
241811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
241911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      Prop.info.buffer_req.type = SWVENC_BUFFER_INPUT;
242011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
242111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (PORT_INDEX_OUT == port)
242211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
242311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      Prop.info.buffer_req.type = SWVENC_BUFFER_OUTPUT;
242411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
242511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else
242611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
242711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      DEBUG_PRINT_ERROR("ERROR: %s, Unsupported parameter", __FUNCTION__);
242811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      RETURN(SWVENC_S_INVALID_PARAMETERS);
242911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
243011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
243111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    Ret = swvenc_getproperty(m_hSwVenc, &Prop);
243211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (Ret != SWVENC_S_SUCCESS)
243311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
243411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       DEBUG_PRINT_ERROR("ERROR: %s, swvenc_setproperty failed (%d)", __FUNCTION__,
243511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          Ret);
243611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       RETURN(SWVENC_S_INVALID_PARAMETERS);
243711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
243811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
243911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    *buff_size = Prop.info.buffer_req.size;
244011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    *min_buff_count = Prop.info.buffer_req.mincount;
244111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    *actual_buff_count = Prop.info.buffer_req.mincount;
244211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    *buff_alignment = Prop.info.buffer_req.alignment;
244311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
244411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    RETURN(Ret);
244511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
244611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
244711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelSWVENC_STATUS omx_venc::swvenc_empty_buffer_done_cb
244811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(
244911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    SWVENC_HANDLE    swvenc,
245011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    SWVENC_IPBUFFER *p_ipbuffer,
245111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    void            *p_client
245211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel)
245311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
245411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ENTER_FUNC();
245511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
245611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void)swvenc;
245711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    SWVENC_STATUS eRet = SWVENC_S_SUCCESS;
245811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx_venc *omx = reinterpret_cast<omx_venc*>(p_client);
245911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
246011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (p_ipbuffer == NULL)
246111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
246211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = SWVENC_S_FAILURE;
246311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
246411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else
246511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
246611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        omx->swvenc_empty_buffer_done(p_ipbuffer);
246711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
246811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
246911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
247011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
247111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelSWVENC_STATUS omx_venc::swvenc_empty_buffer_done
247211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(
247311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    SWVENC_IPBUFFER *p_ipbuffer
247411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel)
247511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
247611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    SWVENC_STATUS eRet = SWVENC_S_SUCCESS;
247711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE error = OMX_ErrorNone;
247811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE* omxhdr = NULL;
247911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
248011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //omx_video *omx = reinterpret_cast<omx_video*>(p_client);
248111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omxhdr = (OMX_BUFFERHEADERTYPE*)p_ipbuffer->p_client_data;
248211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
248311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("EBD: clientData (%p)", p_ipbuffer->p_client_data);
248411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
248511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ( (omxhdr == NULL) ||
248611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         ( ((OMX_U32)(omxhdr - m_inp_mem_ptr) >m_sInPortDef.nBufferCountActual) &&
248711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           ((OMX_U32)(omxhdr - meta_buffer_hdr) >m_sInPortDef.nBufferCountActual)
248811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         )
248911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       )
249011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
249111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        omxhdr = NULL;
249211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        error = OMX_ErrorUndefined;
249311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
249411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
249511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (omxhdr != NULL)
249611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
249711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // unmap the input buffer->pBuffer
249811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        omx_release_meta_buffer(omxhdr);
249911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ICS_
250011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (meta_mode_enable)
250111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
250211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           LEGACY_CAM_METADATA_TYPE *meta_buf = NULL;
250311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           unsigned int size = 0;
250411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           meta_buf = (LEGACY_CAM_METADATA_TYPE *)omxhdr->pBuffer;
250511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           if (meta_buf)
250611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           {
250711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel              if (meta_buf->buffer_type == LEGACY_CAM_SOURCE)
250811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel              {
250911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                  size = meta_buf->meta_handle->data[2];
251011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel              }
251111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel              else if (meta_buf->buffer_type == kMetadataBufferTypeGrallocSource)
251211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel              {
251311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                  VideoGrallocMetadata *meta_buf = (VideoGrallocMetadata *)omxhdr->pBuffer;
251411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                  private_handle_t *handle = (private_handle_t *)meta_buf->pHandle;
251511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                  size = handle->size;
251611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel              }
251711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           }
251811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           int status = munmap(p_ipbuffer->p_buffer, size);
251911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           DEBUG_PRINT_HIGH("Unmapped pBuffer <%p> size <%d> status <%d>", p_ipbuffer->p_buffer, size, status);
252011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
252111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
252211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        post_event ((unsigned long)omxhdr,error,OMX_COMPONENT_GENERATE_EBD);
252311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
252411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
252511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    RETURN(eRet);
252611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
252711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
252811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelSWVENC_STATUS omx_venc::swvenc_fill_buffer_done_cb
252911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(
253011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    SWVENC_HANDLE    swvenc,
253111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    SWVENC_OPBUFFER *p_opbuffer,
253211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    void            *p_client
253311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel)
253411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
253511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ENTER_FUNC();
253611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
253711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    SWVENC_STATUS eRet = SWVENC_S_SUCCESS;
253811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE error = OMX_ErrorNone;
253911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE* omxhdr = NULL;
254011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx_video *omx = reinterpret_cast<omx_video*>(p_client);
254111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
254211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void)swvenc;
254311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
254411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (p_opbuffer != NULL)
254511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
254611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        omxhdr = (OMX_BUFFERHEADERTYPE*)p_opbuffer->p_client_data;
254711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
254811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
254911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ( (p_opbuffer != NULL) &&
255011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         ((OMX_U32)(omxhdr - omx->m_out_mem_ptr)  < omx->m_sOutPortDef.nBufferCountActual)
255111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       )
255211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
255311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("FBD: clientData (%p) buffer (%p) filled_lengh (%d) flags (0x%x) ts (%lld)",
255411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          p_opbuffer->p_client_data,
255511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          p_opbuffer->p_buffer,
255611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          p_opbuffer->filled_length,
255711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          p_opbuffer->flags,
255811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          p_opbuffer->timestamp);
255911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
256011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (p_opbuffer->filled_length <=  omxhdr->nAllocLen)
256111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
256211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omxhdr->pBuffer = p_opbuffer->p_buffer;
256311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omxhdr->nFilledLen = p_opbuffer->filled_length;
256411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omxhdr->nOffset = 0;
256511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omxhdr->nTimeStamp = p_opbuffer->timestamp;
256611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omxhdr->nFlags = 0;
256711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (SWVENC_FRAME_TYPE_I == p_opbuffer->frame_type)
256811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
256911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               omxhdr->nFlags |= OMX_BUFFERFLAG_SYNCFRAME;
257011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
257111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (SWVENC_FLAG_EOS & p_opbuffer->flags)
257211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
257311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               omxhdr->nFlags |= OMX_BUFFERFLAG_EOS;
257411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
257511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if(omxhdr->nFilledLen)
257611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
257711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               omxhdr->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME;
257811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
257911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("o/p flag = 0x%x", omxhdr->nFlags);
258011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
258111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Use buffer case */
258211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (omx->output_use_buffer && !omx->m_use_output_pmem)
258311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
258411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("memcpy() for o/p Heap UseBuffer");
258511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                memcpy( omxhdr->pBuffer,
258611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (p_opbuffer->p_buffer),
258711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        p_opbuffer->filled_length );
258811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
258911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
259011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else
259111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
259211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omxhdr->nFilledLen = 0;
259311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
259411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
259511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
259611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else
259711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
259811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        omxhdr = NULL;
259911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        error = OMX_ErrorUndefined;
260011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
260111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
260211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx->post_event ((unsigned long)omxhdr,error,OMX_COMPONENT_GENERATE_FBD);
260311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
260411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    RETURN(eRet);
260511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
260611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
260711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelSWVENC_STATUS omx_venc::swvenc_handle_event_cb
260811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(
260911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    SWVENC_HANDLE swvenc,
261011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    SWVENC_EVENT  event,
261111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    void         *p_client
261211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel)
261311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
261411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ENTER_FUNC();
261511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
261611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    SWVENC_STATUS eRet = SWVENC_S_SUCCESS;
261711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx_video *omx = reinterpret_cast<omx_video*>(p_client);
261811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
261911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE* omxhdr = NULL;
262011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
262111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void)swvenc;
262211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
262311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (omx == NULL || p_client == NULL)
262411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
262511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR: %s invalid i/p params", __FUNCTION__);
262611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        RETURN(SWVENC_S_NULL_POINTER);
262711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
262811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
262911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("swvenc_handle_event_cb - event = %d", event);
263011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
263111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch (event)
263211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
263311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case SWVENC_EVENT_FLUSH_DONE:
263411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
263511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           DEBUG_PRINT_ERROR("SWVENC_EVENT_FLUSH_DONE input_flush_progress %d output_flush_progress %d",
263611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            omx->input_flush_progress, omx->output_flush_progress);
263711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           if (omx->input_flush_progress)
263811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           {
263911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               omx->post_event ((unsigned)NULL, SWVENC_S_SUCCESS,
264011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                  OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH);
264111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           }
264211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           if (omx->output_flush_progress)
264311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           {
264411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               omx->post_event ((unsigned)NULL, SWVENC_S_SUCCESS,
264511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                  OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH);
264611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           }
264711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           break;
264811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
264911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
265011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case SWVENC_EVENT_FATAL_ERROR:
265111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
265211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           DEBUG_PRINT_ERROR("ERROR: SWVENC_EVENT_FATAL_ERROR");
265311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           omx->omx_report_error();
265411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           break;
265511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
265611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
265711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        default:
265811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("Unknown event received : %d", event);
265911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
266011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
266111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
266211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    RETURN(eRet);
266311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
266411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
266511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelSWVENC_STATUS omx_venc::swvenc_set_rc_mode
266611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(
266711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_VIDEO_CONTROLRATETYPE eControlRate
266811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel)
266911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
267011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ENTER_FUNC();
267111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
267211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    SWVENC_STATUS Ret = SWVENC_S_SUCCESS;
267311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    SWVENC_RC_MODE rc_mode;
267411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    SWVENC_PROPERTY Prop;
267511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
267611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch (eControlRate)
267711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
267811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_Video_ControlRateDisable:
267911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            rc_mode = SWVENC_RC_MODE_NONE;
268011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
268111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_Video_ControlRateVariableSkipFrames:
268211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            rc_mode = SWVENC_RC_MODE_VBR_VFR;
268311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
268411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_Video_ControlRateVariable:
268511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            rc_mode = SWVENC_RC_MODE_VBR_CFR;
268611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
268711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_Video_ControlRateConstantSkipFrames:
268811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            rc_mode = SWVENC_RC_MODE_CBR_VFR;
268911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
269011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_Video_ControlRateConstant:
269111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            rc_mode = SWVENC_RC_MODE_CBR_CFR;
269211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
269311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        default:
269411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR: UNKNOWN RC MODE");
269511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            Ret = SWVENC_S_FAILURE;
269611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
269711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
269811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
269911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (SWVENC_S_SUCCESS == Ret)
270011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
270111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        Prop.id = SWVENC_PROPERTY_ID_RC_MODE;
270211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        Prop.info.rc_mode = rc_mode;
270311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        Ret = swvenc_setproperty(m_hSwVenc, &Prop);
270411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (Ret != SWVENC_S_SUCCESS)
270511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
270611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           DEBUG_PRINT_ERROR("%s, swvenc_setproperty failed (%d)",
270711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             __FUNCTION__, Ret);
270811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           RETURN(SWVENC_S_FAILURE);
270911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
271011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
271111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
271211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    RETURN(Ret);
271311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
271411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
271511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelSWVENC_STATUS omx_venc::swvenc_set_profile_level
271611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(
271711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 eProfile,
271811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 eLevel
271911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel)
272011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
272111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ENTER_FUNC();
272211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
272311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    SWVENC_STATUS Ret = SWVENC_S_SUCCESS;
272411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    SWVENC_PROPERTY Prop;
272511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    SWVENC_PROFILE Profile;
272611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    SWVENC_LEVEL Level;
272711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
272811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* set the profile */
272911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (SWVENC_CODEC_MPEG4 == m_codec)
273011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
273111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       switch (eProfile)
273211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       {
273311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          case OMX_VIDEO_MPEG4ProfileSimple:
273411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             Profile.mpeg4 = SWVENC_PROFILE_MPEG4_SIMPLE;
273511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             break;
273611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          case OMX_VIDEO_MPEG4ProfileAdvancedSimple:
273711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             Profile.mpeg4 = SWVENC_PROFILE_MPEG4_ADVANCED_SIMPLE;
273811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             break;
273911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          default:
274011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             DEBUG_PRINT_ERROR("ERROR: UNKNOWN PROFILE");
274111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             Ret = SWVENC_S_FAILURE;
274211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             break;
274311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       }
274411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       switch (eLevel)
274511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       {
274611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          case OMX_VIDEO_MPEG4Level0:
274711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             Level.mpeg4 = SWVENC_LEVEL_MPEG4_0;
274811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             break;
274911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          case OMX_VIDEO_MPEG4Level0b:
275011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             Level.mpeg4 = SWVENC_LEVEL_MPEG4_0B;
275111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             break;
275211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          case OMX_VIDEO_MPEG4Level1:
275311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             Level.mpeg4 = SWVENC_LEVEL_MPEG4_1;
275411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             break;
275511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          case OMX_VIDEO_MPEG4Level2:
275611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             Level.mpeg4 = SWVENC_LEVEL_MPEG4_2;
275711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             break;
275811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          case OMX_VIDEO_MPEG4Level3:
275911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             Level.mpeg4 = SWVENC_LEVEL_MPEG4_3;
276011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             break;
276111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          case OMX_VIDEO_MPEG4Level4:
276211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             Level.mpeg4 = SWVENC_LEVEL_MPEG4_4;
276311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             break;
276411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          case OMX_VIDEO_MPEG4Level4a:
276511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             Level.mpeg4 = SWVENC_LEVEL_MPEG4_4A;
276611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             break;
276711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          case OMX_VIDEO_MPEG4Level5:
276811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             Level.mpeg4 = SWVENC_LEVEL_MPEG4_5;
276911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             break;
277011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          default:
277111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             DEBUG_PRINT_ERROR("ERROR: UNKNOWN LEVEL");
277211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             Ret = SWVENC_S_FAILURE;
277311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             break;
277411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       }
277511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
277611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (SWVENC_CODEC_H263 == m_codec)
277711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
277811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       switch (eProfile)
277911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       {
278011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          case OMX_VIDEO_H263ProfileBaseline:
278111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             Profile.h263 = SWVENC_PROFILE_H263_BASELINE;
278211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             break;
278311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          default:
278411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             DEBUG_PRINT_ERROR("ERROR: UNKNOWN PROFILE");
278511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             Ret = SWVENC_S_FAILURE;
278611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             break;
278711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       }
278811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       switch (eLevel)
278911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       {
279011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          case OMX_VIDEO_H263Level10:
279111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             Level.h263 = SWVENC_LEVEL_H263_10;
279211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             break;
279311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          case OMX_VIDEO_H263Level20:
279411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             Level.h263 = SWVENC_LEVEL_H263_20;
279511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             break;
279611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          case OMX_VIDEO_H263Level30:
279711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             Level.h263 = SWVENC_LEVEL_H263_30;
279811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             break;
279911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          case OMX_VIDEO_H263Level40:
280011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             Level.h263 = SWVENC_LEVEL_H263_40;
280111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             break;
280211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          case OMX_VIDEO_H263Level50:
280311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             Level.h263 = SWVENC_LEVEL_H263_50;
280411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             break;
280511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          case OMX_VIDEO_H263Level60:
280611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             Level.h263 = SWVENC_LEVEL_H263_60;
280711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             break;
280811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          case OMX_VIDEO_H263Level70:
280911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             Level.h263 = SWVENC_LEVEL_H263_70;
281011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             break;
281111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          default:
281211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             DEBUG_PRINT_ERROR("ERROR: UNKNOWN LEVEL");
281311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             Ret = SWVENC_S_FAILURE;
281411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             break;
281511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       }
281611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
281711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else
281811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
281911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      DEBUG_PRINT_ERROR("ERROR: UNSUPPORTED CODEC");
282011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      Ret = SWVENC_S_FAILURE;
282111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
282211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
282311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (SWVENC_S_SUCCESS == Ret)
282411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
282511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       Prop.id = SWVENC_PROPERTY_ID_PROFILE;
282611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       Prop.info.profile = Profile;
282711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
282811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       /* set the profile */
282911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       Ret = swvenc_setproperty(m_hSwVenc, &Prop);
283011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       if (Ret != SWVENC_S_SUCCESS)
283111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       {
283211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          DEBUG_PRINT_ERROR("%s, swvenc_setproperty failed (%d)",
283311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            __FUNCTION__, Ret);
283411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          RETURN(SWVENC_S_FAILURE);
283511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       }
283611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
283711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       /* set the level */
283811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       Prop.id = SWVENC_PROPERTY_ID_LEVEL;
283911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       Prop.info.level = Level;
284011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
284111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       Ret = swvenc_setproperty(m_hSwVenc, &Prop);
284211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       if (Ret != SWVENC_S_SUCCESS)
284311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       {
284411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          DEBUG_PRINT_ERROR("%s, swvenc_setproperty failed (%d)",
284511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            __FUNCTION__, Ret);
284611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          RETURN(SWVENC_S_FAILURE);
284711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       }
284811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
284911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
285011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    RETURN(Ret);
285111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
285211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
285311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelSWVENC_STATUS omx_venc::swvenc_set_intra_refresh
285411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(
285511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_VIDEO_PARAM_INTRAREFRESHTYPE *IntraRefresh
285611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel)
285711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
285811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ENTER_FUNC();
285911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
286011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   SWVENC_STATUS Ret = SWVENC_S_SUCCESS;
286111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   SWVENC_IR_CONFIG ir_config;
286211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   SWVENC_PROPERTY Prop;
286311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
286411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   switch (IntraRefresh->eRefreshMode)
286511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   {
286611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      case OMX_VIDEO_IntraRefreshCyclic:
286711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        Prop.info.ir_config.mode = SWVENC_IR_MODE_CYCLIC;
286811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        break;
286911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      case OMX_VIDEO_IntraRefreshAdaptive:
287011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         Prop.info.ir_config.mode = SWVENC_IR_MODE_ADAPTIVE;
287111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        break;
287211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      case OMX_VIDEO_IntraRefreshBoth:
287311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         Prop.info.ir_config.mode = SWVENC_IR_MODE_CYCLIC_ADAPTIVE;
287411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        break;
287511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      case OMX_VIDEO_IntraRefreshRandom:
287611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         Prop.info.ir_config.mode = SWVENC_IR_MODE_RANDOM;
287711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        break;
287811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      default:
287911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         DEBUG_PRINT_ERROR("ERROR: UNKNOWN INTRA REFRESH MODE");
288011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         Ret = SWVENC_S_FAILURE;
288111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         break;
288211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   }
288311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
288411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   if (SWVENC_S_SUCCESS == Ret)
288511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   {
288611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       Prop.id = SWVENC_PROPERTY_ID_IR_CONFIG;
288711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       Prop.info.ir_config.cir_mbs = IntraRefresh->nCirMBs;
288811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
288911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       Ret = swvenc_setproperty(m_hSwVenc, &Prop);
289011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       if (Ret != SWVENC_S_SUCCESS)
289111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       {
289211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          DEBUG_PRINT_ERROR("%s, swvenc_setproperty failed (%d)",
289311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            __FUNCTION__, Ret);
289411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          Ret = SWVENC_S_FAILURE;
289511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       }
289611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   }
289711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
289811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN(Ret);
289911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
290011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
290111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelSWVENC_STATUS omx_venc::swvenc_set_frame_rate
290211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(
290311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 nFrameRate
290411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel)
290511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
290611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ENTER_FUNC();
290711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
290811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   SWVENC_STATUS Ret = SWVENC_S_SUCCESS;
290911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   SWVENC_PROPERTY Prop;
291011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
291111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Prop.id = SWVENC_PROPERTY_ID_FRAME_RATE;
291211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Prop.info.frame_rate = nFrameRate;
291311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
291411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Ret = swvenc_setproperty(m_hSwVenc, &Prop);
291511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   if (Ret != SWVENC_S_SUCCESS)
291611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   {
291711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      DEBUG_PRINT_ERROR("%s, swvenc_setproperty failed (%d)",
291811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        __FUNCTION__, Ret);
291911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      Ret = SWVENC_S_FAILURE;
292011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   }
292111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
292211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN(Ret);
292311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
292411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
292511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelSWVENC_STATUS omx_venc::swvenc_set_bit_rate
292611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(
292711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 nTargetBitrate
292811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel)
292911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
293011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ENTER_FUNC();
293111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
293211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   SWVENC_STATUS Ret = SWVENC_S_SUCCESS;
293311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   SWVENC_PROPERTY Prop;
293411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
293511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Prop.id = SWVENC_PROPERTY_ID_TARGET_BITRATE;
293611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Prop.info.target_bitrate = nTargetBitrate;
293711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
293811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Ret = swvenc_setproperty(m_hSwVenc, &Prop);
293911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   if (Ret != SWVENC_S_SUCCESS)
294011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   {
294111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      DEBUG_PRINT_ERROR("%s, swvenc_setproperty failed (%d)",
294211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        __FUNCTION__, Ret);
294311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      Ret = SWVENC_S_FAILURE;
294411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   }
294511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
294611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN(Ret);
294711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
294811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
294911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelSWVENC_STATUS omx_venc::swvenc_set_intra_period
295011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel(
295111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 nPFrame,
295211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 nBFrame
295311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel)
295411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
295511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   ENTER_FUNC();
295611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
295711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   SWVENC_STATUS Ret = SWVENC_S_SUCCESS;
295811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   SWVENC_PROPERTY Prop;
295911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
296011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Prop.id = SWVENC_PROPERTY_ID_INTRA_PERIOD;
296111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Prop.info.intra_period.pframes = nPFrame;
296211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Prop.info.intra_period.bframes = nBFrame;
296311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
296411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   Ret = swvenc_setproperty(m_hSwVenc, &Prop);
296511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   if (Ret != SWVENC_S_SUCCESS)
296611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   {
296711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      DEBUG_PRINT_ERROR("%s, swvenc_setproperty failed (%d)",
296811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        __FUNCTION__, Ret);
296911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      Ret = SWVENC_S_FAILURE;
297011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   }
297111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
297211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   RETURN(Ret);
297311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
297469b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel
297569b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudelbool omx_venc::swvenc_color_align(OMX_BUFFERHEADERTYPE *buffer, OMX_U32 width,
297669b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel                        OMX_U32 height)
297769b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel{
297869b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel     OMX_U32 y_stride = VENUS_Y_STRIDE(COLOR_FMT_NV12, width),
297969b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel            y_scanlines = VENUS_Y_SCANLINES(COLOR_FMT_NV12, height),
298069b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel            uv_stride = VENUS_UV_STRIDE(COLOR_FMT_NV12, width),
298169b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel            uv_scanlines = VENUS_UV_SCANLINES(COLOR_FMT_NV12, height),
298269b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel            src_chroma_offset = width * height;
298369b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel
298469b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel    if (buffer->nAllocLen >= VENUS_BUFFER_SIZE(COLOR_FMT_NV12, width, height)) {
298569b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel        OMX_U8* src_buf = buffer->pBuffer, *dst_buf = buffer->pBuffer;
298669b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel        //Do chroma first, so that we can convert it in-place
298769b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel        src_buf += width * height;
298869b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel        dst_buf += y_stride * y_scanlines;
298969b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel        for (int line = height / 2 - 1; line >= 0; --line) {
299069b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel            memmove(dst_buf + line * uv_stride,
299169b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel                    src_buf + line * width,
299269b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel                    width);
299369b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel        }
299469b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel
299569b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel        dst_buf = src_buf = buffer->pBuffer;
299669b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel        //Copy the Y next
299769b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel        for (int line = height - 1; line > 0; --line) {
299869b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel            memmove(dst_buf + line * y_stride,
299969b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel                    src_buf + line * width,
300069b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel                    width);
300169b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel        }
300269b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel    } else {
300369b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel        DEBUG_PRINT_ERROR("Failed to align Chroma. from %u to %u : \
300469b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel                Insufficient bufferLen=%u v/s Required=%u",
300569b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel                (unsigned int)(width*height), (unsigned int)src_chroma_offset, (unsigned int)buffer->nAllocLen,
300669b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel                VENUS_BUFFER_SIZE(COLOR_FMT_NV12, width, height));
300769b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel        return false;
300869b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel    }
300969b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel
301069b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel    return true;
301169b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel}
301269b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel
301369b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry StrudelSWVENC_STATUS omx_venc::swvenc_set_color_format
301469b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel(
301569b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel   OMX_COLOR_FORMATTYPE color_format
301669b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel)
301769b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel{
301869b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel    ENTER_FUNC();
301969b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel    SWVENC_STATUS Ret = SWVENC_S_SUCCESS;
302069b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel    SWVENC_COLOR_FORMAT swvenc_color_format;
302169b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel    SWVENC_PROPERTY Prop;
302269b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel    if ((color_format == OMX_COLOR_FormatYUV420SemiPlanar) ||
302369b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel         (color_format == ((OMX_COLOR_FORMATTYPE) QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m)))
302469b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel    {
302569b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel        swvenc_color_format = SWVENC_COLOR_FORMAT_NV12;
302669b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel    }
3027b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    else if (color_format == ((OMX_COLOR_FORMATTYPE) QOMX_COLOR_FormatYVU420SemiPlanar))
302869b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel    {
302969b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel        swvenc_color_format = SWVENC_COLOR_FORMAT_NV21;
303069b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel    }
3031b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    else
3032b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    {
3033b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        DEBUG_PRINT_ERROR("%s: color_format %d invalid",__FUNCTION__,color_format);
3034b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        RETURN(SWVENC_S_FAILURE);
3035b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    }
303669b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel    /* set the input color format */
303769b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel    Prop.id = SWVENC_PROPERTY_ID_COLOR_FORMAT;
303869b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel    Prop.info.color_format = swvenc_color_format;
303969b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel    Ret = swvenc_setproperty(m_hSwVenc, &Prop);
304069b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel    if (Ret != SWVENC_S_SUCCESS)
304169b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel    {
304269b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel        DEBUG_PRINT_ERROR("%s, swvenc_setproperty failed (%d)",
304369b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel            __FUNCTION__, Ret);
304469b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel        Ret = SWVENC_S_FAILURE;
304569b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel    }
304669b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel    RETURN(Ret);
304769b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel}
3048