147e37c4428509524ee576920a98381f3e4872493Nick Pelly/*--------------------------------------------------------------------------
261a2c6a19dbd06a317a419623020e02056661876Praveen ChavanCopyright (c) 2010-2013, The Linux Foundation. All rights reserved.
347e37c4428509524ee576920a98381f3e4872493Nick Pelly
447e37c4428509524ee576920a98381f3e4872493Nick PellyRedistribution and use in source and binary forms, with or without
547e37c4428509524ee576920a98381f3e4872493Nick Pellymodification, are permitted provided that the following conditions are met:
647e37c4428509524ee576920a98381f3e4872493Nick Pelly    * Redistributions of source code must retain the above copyright
747e37c4428509524ee576920a98381f3e4872493Nick Pelly      notice, this list of conditions and the following disclaimer.
847e37c4428509524ee576920a98381f3e4872493Nick Pelly    * Redistributions in binary form must reproduce the above copyright
947e37c4428509524ee576920a98381f3e4872493Nick Pelly      notice, this list of conditions and the following disclaimer in the
1047e37c4428509524ee576920a98381f3e4872493Nick Pelly      documentation and/or other materials provided with the distribution.
116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    * Neither the name of The Linux Foundation nor
1247e37c4428509524ee576920a98381f3e4872493Nick Pelly      the names of its contributors may be used to endorse or promote
1347e37c4428509524ee576920a98381f3e4872493Nick Pelly      products derived from this software without specific prior written
1447e37c4428509524ee576920a98381f3e4872493Nick Pelly      permission.
1547e37c4428509524ee576920a98381f3e4872493Nick Pelly
1647e37c4428509524ee576920a98381f3e4872493Nick PellyTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1747e37c4428509524ee576920a98381f3e4872493Nick PellyAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1847e37c4428509524ee576920a98381f3e4872493Nick PellyIMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
1947e37c4428509524ee576920a98381f3e4872493Nick PellyNON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
2047e37c4428509524ee576920a98381f3e4872493Nick PellyCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
2147e37c4428509524ee576920a98381f3e4872493Nick PellyEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
2247e37c4428509524ee576920a98381f3e4872493Nick PellyPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
2347e37c4428509524ee576920a98381f3e4872493Nick PellyOR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
2447e37c4428509524ee576920a98381f3e4872493Nick PellyWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
2547e37c4428509524ee576920a98381f3e4872493Nick PellyOTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
2647e37c4428509524ee576920a98381f3e4872493Nick PellyADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2747e37c4428509524ee576920a98381f3e4872493Nick Pelly--------------------------------------------------------------------------*/
2847e37c4428509524ee576920a98381f3e4872493Nick Pelly#include<string.h>
2947e37c4428509524ee576920a98381f3e4872493Nick Pelly#include <sys/ioctl.h>
30826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/prctl.h>
3147e37c4428509524ee576920a98381f3e4872493Nick Pelly#include<unistd.h>
3247e37c4428509524ee576920a98381f3e4872493Nick Pelly#include <fcntl.h>
3347e37c4428509524ee576920a98381f3e4872493Nick Pelly#include "video_encoder_device.h"
3447e37c4428509524ee576920a98381f3e4872493Nick Pelly#include "omx_video_encoder.h"
35826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
36278952ff92fab2da0c47b912daeb662130676be1Haynes Mathew George#include <linux/msm_ion.h>
37826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3847e37c4428509524ee576920a98381f3e4872493Nick Pelly
3947e37c4428509524ee576920a98381f3e4872493Nick Pelly#define MPEG4_SP_START 0
4047e37c4428509524ee576920a98381f3e4872493Nick Pelly#define MPEG4_ASP_START (MPEG4_SP_START + 8)
4147e37c4428509524ee576920a98381f3e4872493Nick Pelly#define MPEG4_720P_LEVEL 6
4247e37c4428509524ee576920a98381f3e4872493Nick Pelly#define H263_BP_START 0
4347e37c4428509524ee576920a98381f3e4872493Nick Pelly#define H264_BP_START 0
44826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define H264_HP_START (H264_BP_START + 13)
45826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define H264_MP_START (H264_BP_START + 26)
4647e37c4428509524ee576920a98381f3e4872493Nick Pelly
4747e37c4428509524ee576920a98381f3e4872493Nick Pelly/* MPEG4 profile and level table*/
4861a2c6a19dbd06a317a419623020e02056661876Praveen Chavanstatic const unsigned int mpeg4_profile_level_table[][5]= {
4947e37c4428509524ee576920a98381f3e4872493Nick Pelly    /*max mb per frame, max mb per sec, max bitrate, level, profile*/
5047e37c4428509524ee576920a98381f3e4872493Nick Pelly    {99,1485,64000,OMX_VIDEO_MPEG4Level0,OMX_VIDEO_MPEG4ProfileSimple},
51826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,64000,OMX_VIDEO_MPEG4Level1,OMX_VIDEO_MPEG4ProfileSimple},
5247e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,5940,128000,OMX_VIDEO_MPEG4Level2,OMX_VIDEO_MPEG4ProfileSimple},
5347e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,11880,384000,OMX_VIDEO_MPEG4Level3,OMX_VIDEO_MPEG4ProfileSimple},
5447e37c4428509524ee576920a98381f3e4872493Nick Pelly    {1200,36000,4000000,OMX_VIDEO_MPEG4Level4a,OMX_VIDEO_MPEG4ProfileSimple},
5547e37c4428509524ee576920a98381f3e4872493Nick Pelly    {1620,40500,8000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple},
56826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {3600,108000,12000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple},
5747e37c4428509524ee576920a98381f3e4872493Nick Pelly    {0,0,0,0,0},
5847e37c4428509524ee576920a98381f3e4872493Nick Pelly
59826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,128000,OMX_VIDEO_MPEG4Level0,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
60826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,128000,OMX_VIDEO_MPEG4Level1,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
6147e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,5940,384000,OMX_VIDEO_MPEG4Level2,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
6247e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,11880,768000,OMX_VIDEO_MPEG4Level3,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
6347e37c4428509524ee576920a98381f3e4872493Nick Pelly    {792,23760,3000000,OMX_VIDEO_MPEG4Level4,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
6447e37c4428509524ee576920a98381f3e4872493Nick Pelly    {1620,48600,8000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
65826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {0,0,0,0,0},
6647e37c4428509524ee576920a98381f3e4872493Nick Pelly};
6747e37c4428509524ee576920a98381f3e4872493Nick Pelly
6847e37c4428509524ee576920a98381f3e4872493Nick Pelly/* H264 profile and level table*/
6961a2c6a19dbd06a317a419623020e02056661876Praveen Chavanstatic const unsigned int h264_profile_level_table[][5]= {
7061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*max mb per frame, max mb per sec, max bitrate, level, profile*/
7147e37c4428509524ee576920a98381f3e4872493Nick Pelly    {99,1485,64000,OMX_VIDEO_AVCLevel1,OMX_VIDEO_AVCProfileBaseline},
7247e37c4428509524ee576920a98381f3e4872493Nick Pelly    {99,1485,128000,OMX_VIDEO_AVCLevel1b,OMX_VIDEO_AVCProfileBaseline},
7347e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,3000,192000,OMX_VIDEO_AVCLevel11,OMX_VIDEO_AVCProfileBaseline},
7447e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,6000,384000,OMX_VIDEO_AVCLevel12,OMX_VIDEO_AVCProfileBaseline},
7547e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,11880,768000,OMX_VIDEO_AVCLevel13,OMX_VIDEO_AVCProfileBaseline},
7647e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,11880,2000000,OMX_VIDEO_AVCLevel2,OMX_VIDEO_AVCProfileBaseline},
7747e37c4428509524ee576920a98381f3e4872493Nick Pelly    {792,19800,4000000,OMX_VIDEO_AVCLevel21,OMX_VIDEO_AVCProfileBaseline},
7847e37c4428509524ee576920a98381f3e4872493Nick Pelly    {1620,20250,4000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileBaseline},
7947e37c4428509524ee576920a98381f3e4872493Nick Pelly    {1620,40500,10000000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileBaseline},
8047e37c4428509524ee576920a98381f3e4872493Nick Pelly    {3600,108000,14000000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileBaseline},
81826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {5120,216000,20000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileBaseline},
82826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {8192,245760,20000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileBaseline},
8347e37c4428509524ee576920a98381f3e4872493Nick Pelly    {0,0,0,0,0},
8447e37c4428509524ee576920a98381f3e4872493Nick Pelly
8547e37c4428509524ee576920a98381f3e4872493Nick Pelly    {99,1485,64000,OMX_VIDEO_AVCLevel1,OMX_VIDEO_AVCProfileHigh},
8647e37c4428509524ee576920a98381f3e4872493Nick Pelly    {99,1485,160000,OMX_VIDEO_AVCLevel1b,OMX_VIDEO_AVCProfileHigh},
8747e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,3000,240000,OMX_VIDEO_AVCLevel11,OMX_VIDEO_AVCProfileHigh},
8847e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,6000,480000,OMX_VIDEO_AVCLevel12,OMX_VIDEO_AVCProfileHigh},
8947e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,11880,960000,OMX_VIDEO_AVCLevel13,OMX_VIDEO_AVCProfileHigh},
9047e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,11880,2500000,OMX_VIDEO_AVCLevel2,OMX_VIDEO_AVCProfileHigh},
9147e37c4428509524ee576920a98381f3e4872493Nick Pelly    {792,19800,5000000,OMX_VIDEO_AVCLevel21,OMX_VIDEO_AVCProfileHigh},
9247e37c4428509524ee576920a98381f3e4872493Nick Pelly    {1620,20250,5000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileHigh},
9347e37c4428509524ee576920a98381f3e4872493Nick Pelly    {1620,40500,12500000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileHigh},
9447e37c4428509524ee576920a98381f3e4872493Nick Pelly    {3600,108000,17500000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileHigh},
95826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {5120,216000,25000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileHigh},
96826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {8192,245760,25000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileHigh},
9747e37c4428509524ee576920a98381f3e4872493Nick Pelly    {0,0,0,0,0},
9847e37c4428509524ee576920a98381f3e4872493Nick Pelly
9947e37c4428509524ee576920a98381f3e4872493Nick Pelly    {99,1485,64000,OMX_VIDEO_AVCLevel1,OMX_VIDEO_AVCProfileMain},
100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,128000,OMX_VIDEO_AVCLevel1b,OMX_VIDEO_AVCProfileMain},
101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,3000,192000,OMX_VIDEO_AVCLevel11,OMX_VIDEO_AVCProfileMain},
102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,6000,384000,OMX_VIDEO_AVCLevel12,OMX_VIDEO_AVCProfileMain},
103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,768000,OMX_VIDEO_AVCLevel13,OMX_VIDEO_AVCProfileMain},
104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,2000000,OMX_VIDEO_AVCLevel2,OMX_VIDEO_AVCProfileMain},
105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {792,19800,4000000,OMX_VIDEO_AVCLevel21,OMX_VIDEO_AVCProfileMain},
106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1620,20250,4000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileMain},
107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1620,40500,10000000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileMain},
108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {3600,108000,14000000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileMain},
109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {5120,216000,20000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileMain},
110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {8192,245760,20000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileMain},
11147e37c4428509524ee576920a98381f3e4872493Nick Pelly    {0,0,0,0,0}
112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
11347e37c4428509524ee576920a98381f3e4872493Nick Pelly};
11447e37c4428509524ee576920a98381f3e4872493Nick Pelly
11547e37c4428509524ee576920a98381f3e4872493Nick Pelly/* H263 profile and level table*/
11661a2c6a19dbd06a317a419623020e02056661876Praveen Chavanstatic const unsigned int h263_profile_level_table[][5]= {
11747e37c4428509524ee576920a98381f3e4872493Nick Pelly    /*max mb per frame, max mb per sec, max bitrate, level, profile*/
11847e37c4428509524ee576920a98381f3e4872493Nick Pelly    {99,1485,64000,OMX_VIDEO_H263Level10,OMX_VIDEO_H263ProfileBaseline},
11947e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,5940,128000,OMX_VIDEO_H263Level20,OMX_VIDEO_H263ProfileBaseline},
12047e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,11880,384000,OMX_VIDEO_H263Level30,OMX_VIDEO_H263ProfileBaseline},
12147e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,11880,2048000,OMX_VIDEO_H263Level40,OMX_VIDEO_H263ProfileBaseline},
12247e37c4428509524ee576920a98381f3e4872493Nick Pelly    {99,1485,128000,OMX_VIDEO_H263Level45,OMX_VIDEO_H263ProfileBaseline},
12347e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,19800,4096000,OMX_VIDEO_H263Level50,OMX_VIDEO_H263ProfileBaseline},
12447e37c4428509524ee576920a98381f3e4872493Nick Pelly    {810,40500,8192000,OMX_VIDEO_H263Level60,OMX_VIDEO_H263ProfileBaseline},
12547e37c4428509524ee576920a98381f3e4872493Nick Pelly    {1620,81000,16384000,OMX_VIDEO_H263Level70,OMX_VIDEO_H263ProfileBaseline},
12647e37c4428509524ee576920a98381f3e4872493Nick Pelly    {0,0,0,0,0}
12747e37c4428509524ee576920a98381f3e4872493Nick Pelly};
12847e37c4428509524ee576920a98381f3e4872493Nick Pelly
129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Log2(number, power)  { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) &&  power < 16) { temp >>=0x1; power++; } }
130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power);  num = q >> power; den = 0x1 << (16 - power); }
131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define BUFFER_LOG_LOC "/data/misc/media"
1338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
13447e37c4428509524ee576920a98381f3e4872493Nick Pelly//constructor
135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvenc_dev::venc_dev(class omx_venc *venc_class)
13647e37c4428509524ee576920a98381f3e4872493Nick Pelly{
13761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_max_allowed_bitrate_check = false;
13861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_eLevel = 0;
13961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_eProfile = 0;
14061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_init(&loaded_start_stop_mlock, NULL);
14161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_cond_init (&loaded_start_stop_cond, NULL);
1428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    memset(&m_debug,0,sizeof(m_debug));
1438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
1448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    char property_value[PROPERTY_VALUE_MAX] = {0};
1458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_value[0] = '\0';
1468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_get("vidc.enc.log.in", property_value, "0");
1478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_debug.in_buffer_log = atoi(property_value);
1488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
1498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_value[0] = '\0';
1508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_get("vidc.enc.log.out", property_value, "0");
1518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_debug.out_buffer_log = atoi(property_value);
1528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    snprintf(m_debug.log_loc, PROPERTY_VAL_MAX,
1538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan             "%s", BUFFER_LOG_LOC);
1548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
15561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("venc_dev constructor");
15647e37c4428509524ee576920a98381f3e4872493Nick Pelly}
15747e37c4428509524ee576920a98381f3e4872493Nick Pelly
15847e37c4428509524ee576920a98381f3e4872493Nick Pellyvenc_dev::~venc_dev()
15947e37c4428509524ee576920a98381f3e4872493Nick Pelly{
16061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_cond_destroy(&loaded_start_stop_cond);
16161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_destroy(&loaded_start_stop_mlock);
16261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("venc_dev distructor");
16347e37c4428509524ee576920a98381f3e4872493Nick Pelly}
16447e37c4428509524ee576920a98381f3e4872493Nick Pelly
16547e37c4428509524ee576920a98381f3e4872493Nick Pellyvoid* async_venc_message_thread (void *input)
16647e37c4428509524ee576920a98381f3e4872493Nick Pelly{
16761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_ioctl_msg ioctl_msg ={NULL,NULL};
16861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_timeout timeout;
16961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_msg venc_msg;
17061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int error_code = 0;
17161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx_venc *omx = reinterpret_cast<omx_venc*>(input);
17261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
17361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    prctl(PR_SET_NAME, (unsigned long)"VideoEncCallBackThread", 0, 0, 0);
17461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    timeout.millisec = VEN_TIMEOUT_INFINITE;
17561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
17661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (1) {
17761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.in = NULL;
17861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.out = (void*)&venc_msg;
17961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
18061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Wait for a message from the video decoder driver*/
18161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        error_code = ioctl(omx->handle->m_nDriver_fd,VEN_IOCTL_CMD_READ_NEXT_MSG,(void *)&ioctl_msg);
18261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
18361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (error_code == -512) { // ERESTARTSYS
1848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERESTARTSYS received in ioctl read next msg!");
18561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (error_code <0) {
1868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("ioctl VEN_IOCTL_CMD_READ_NEXT_MSG failed");
18761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
18861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (omx->async_message_process(input,&venc_msg) < 0) {
1898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: Wrong ioctl message");
19061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
19161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
19261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("omx_venc: Async Thread exit");
194073c5e91be587a9f90fe39719e1e9fa7cd2a3525Vineeta Srivastava    return NULL;
195a66301743224ed885fc1b5275acd16f4843a03f5Vineeta Srivastava}
196a66301743224ed885fc1b5275acd16f4843a03f5Vineeta Srivastava
1978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanint venc_dev::venc_extradata_log_buffers(char *buffer_addr)
1988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
1998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return OMX_ErrorUnsupportedSetting;
2008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
2018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
2028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanint venc_dev::venc_output_log_buffers(const char *buffer_addr, int buffer_len)
2038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
2048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_debug.out_buffer_log && !m_debug.outfile) {
2058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int size = 0;
2068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(m_sVenc_cfg.codectype == VEN_CODEC_MPEG4) {
2078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           size = snprintf(m_debug.outfile_name, PROPERTY_VALUE_MAX, "%s/output_enc_%d_%d_%p.m4v",
2088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                           m_debug.log_loc, m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, this);
2098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        } else if(m_sVenc_cfg.codectype == VEN_CODEC_H264) {
2108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           size = snprintf(m_debug.outfile_name, PROPERTY_VALUE_MAX, "%s/output_enc_%d_%d_%p.264",
2118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                           m_debug.log_loc, m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, this);
2128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        } else if(m_sVenc_cfg.codectype == VENC_CODEC_H263) {
2138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           size = snprintf(m_debug.outfile_name, PROPERTY_VALUE_MAX, "%s/output_enc_%d_%d_%p.263",
2148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                           m_debug.log_loc, m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, this);
2158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        } else if(m_sVenc_cfg.codectype == VENC_CODEC_VP8) {
2168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           size = snprintf(m_debug.outfile_name, PROPERTY_VALUE_MAX, "%s/output_enc_%d_%d_%p.ivf",
2178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                           m_debug.log_loc, m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, this);
2188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
2198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if ((size > PROPERTY_VALUE_MAX) || (size < 0)) {
2208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to open output file: %s for logging as size:%d",
2218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                               m_debug.outfile_name, size);
2228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return -1;
2238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
2248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_debug.outfile = fopen(m_debug.outfile_name, "ab");
2258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!m_debug.outfile) {
2268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to open output file: %s for logging errno:%d",
2278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                              m_debug.outfile_name, errno);
2288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_debug.outfile_name[0] = '\0';
2298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return -1;
2308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
2318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
2328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_debug.outfile && buffer_len) {
2338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("%s buffer_len:%d", __func__, buffer_len);
2348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fwrite(buffer_addr, buffer_len, 1, m_debug.outfile);
2358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
2368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return 0;
2378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
2388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
2398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanbool venc_dev::venc_get_output_log_flag()
2408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
2418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return (m_debug.out_buffer_log == 1);
2428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
2438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
2448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanint venc_dev::venc_input_log_buffers(OMX_BUFFERHEADERTYPE *pbuffer, void *pmem_data_buf, int framelen) {
2458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!m_debug.infile) {
2468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int size = snprintf(m_debug.infile_name, PROPERTY_VALUE_MAX, "%s/input_enc_%d_%d_%p.yuv",
2478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                           m_debug.log_loc, m_sVenc_cfg.input_width,
2488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                           m_sVenc_cfg.input_height, this);
2498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if ((size > PROPERTY_VALUE_MAX) || (size < 0)) {
2508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to open input file: %s for logging size:%d",
2518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                               m_debug.infile_name, size);
2528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return -1;
2538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
2548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_debug.infile = fopen (m_debug.infile_name, "ab");
2558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!m_debug.infile) {
2568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("Failed to open input file: %s for logging", m_debug.infile);
2578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_debug.infile_name[0] = '\0';
2588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return -1;
2598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
2608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
2618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_debug.infile && pbuffer && pbuffer->nFilledLen) {
2628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef MAX_RES_1080P
2638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       int y_size = 0;
2648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       int c_offset = 0;
2658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       unsigned char *buf_addr = NULL;
2668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
2678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       y_size = m_sVenc_cfg.input_width * m_sVenc_cfg.input_height;
2688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       //chroma offset is y_size aligned to the 2k boundary
2698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       c_offset= (y_size + 2047) & (~(2047));
2708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
2718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       if (pmem_data_buf) {
2728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           DEBUG_PRINT_LOW("Internal PMEM addr for i/p Heap UseBuf: %p", pmem_data_buf);
2738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           buf_addr = (OMX_U8 *)pmem_data_buf;
2748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       } else {
2758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           DEBUG_PRINT_LOW("Shared PMEM addr for i/p PMEM UseBuf/AllocateBuf: %p", bufhdr->pBuffer);
2768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           buf_addr = (unsigned char *)mmap(NULL,
2778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                      ((encoder_media_buffer_type *)pbuffer->pBuffer)->meta_handle->data[2],
2788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                      PROT_READ|PROT_WRITE, MAP_SHARED,
2798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                      ((encoder_media_buffer_type *)pbuffer->pBuffer)->meta_handle->data[0], 0);
2808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       }
2818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
2828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       if (m_debug.infile) {
2838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           fwrite((const char *)buf_addr, y_size, 1, m_debug.infile);
2848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           fwrite((const char *)(buf_addr + c_offset), (y_size>>1), 1, m_debug.infile);
2858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       }
2868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
2878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       if (!pmem_data_buf) {
2888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           munmap (buf_addr, ((encoder_media_buffer_type *)pbuffer->pBuffer)->meta_handle->data[2]);
2898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       }
2908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#else
2918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       if (m_debug.infile) {
2928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           OMX_U8* ptrbuffer = NULL;
2938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           if (pmem_data_buf) {
2948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan               DEBUG_PRINT_LOW("Internal PMEM addr for i/p Heap UseBuf: %p", pmem_data_buf);
2958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan               ptrbuffer = (OMX_U8 *)pmem_data_buf;
2968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           } else {
2978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan               DEBUG_PRINT_LOW("Shared PMEM addr for i/p PMEM UseBuf/AllocateBuf: %p", bufhdr->pBuffer);
2988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan               ptrbuffer = (OMX_U8 *)bufhdr->pBuffer;
2998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           }
3008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           fwrite((const char *)ptrbuffer, framelen, 1, m_debug.infile);
3018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       }
3028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
3038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
3048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
3058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return 0;
3068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
3078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
30847e37c4428509524ee576920a98381f3e4872493Nick Pellybool venc_dev::venc_open(OMX_U32 codec)
30947e37c4428509524ee576920a98381f3e4872493Nick Pelly{
31061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
31161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int r;
31261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int   alignment = 0,buffer_size = 0, temp =0;
31361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
3146eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    m_nDriver_fd = open ("/dev/msm_vidc_enc",O_RDWR|O_NONBLOCK);
31547e37c4428509524ee576920a98381f3e4872493Nick Pelly
31661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_nDriver_fd == 0) {
3178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Got fd as 0 for msm_vidc_enc, Opening again");
31861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_nDriver_fd = open ("/dev/msm_vidc_enc",O_RDWR|O_NONBLOCK);
31961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
32061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
32161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((int)m_nDriver_fd < 0) {
3228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Omx_venc::Comp Init Returning failure");
32361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
32461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
32547e37c4428509524ee576920a98381f3e4872493Nick Pelly
3268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("m_nDriver_fd = %d", m_nDriver_fd);
327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef SINGLE_ENCODER_INSTANCE
32861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 num_instances = 0;
32961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = NULL;
33061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = &num_instances;
33161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
33261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd, VEN_IOCTL_GET_NUMBER_INSTANCES, (void*)&ioctl_msg) < 0 ) {
3338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request number of encoder instances failed");
33461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (num_instances > 1) {
3358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Second encoder instance rejected!");
33661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        venc_close();
33761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
33861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
33961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
34161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // set the basic configuration of the video encoder driver
34261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.input_width = OMX_CORE_QCIF_WIDTH;
34361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.input_height= OMX_CORE_QCIF_HEIGHT;
34461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.dvs_width = OMX_CORE_QCIF_WIDTH;
34561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.dvs_height = OMX_CORE_QCIF_HEIGHT;
34661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.fps_num = 30;
34761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.fps_den = 1;
34861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.targetbitrate = 64000;
349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
35061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.inputformat= VEN_INPUTFMT_NV12_16M2KA;
351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
35261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.inputformat= VEN_INPUTFMT_NV12;
353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
35461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // initializing QP range parameters
35561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    qp_range.minqp = 2;
35661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
35761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (codec == OMX_VIDEO_CodingAVC)
35861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        qp_range.maxqp = 51;
35961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else
36061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        qp_range.maxqp = 31;
36161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
36261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (codec == OMX_VIDEO_CodingMPEG4) {
36361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sVenc_cfg.codectype = VEN_CODEC_MPEG4;
36461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_profile.profile = VEN_PROFILE_MPEG4_SP;
36561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        profile_level.level = VEN_LEVEL_MPEG4_2;
36661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (codec == OMX_VIDEO_CodingH263) {
36761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sVenc_cfg.codectype = VEN_CODEC_H263;
36861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_profile.profile = VEN_PROFILE_H263_BASELINE;
36961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        profile_level.level = VEN_LEVEL_H263_20;
37061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
37161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
37261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (codec == OMX_VIDEO_CodingAVC) {
37361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sVenc_cfg.codectype = VEN_CODEC_H264;
37461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_profile.profile = VEN_PROFILE_H264_BASELINE;
37561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        profile_level.level = VEN_LEVEL_H264_1p1;
37661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
37761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
37861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&m_sVenc_cfg;
37961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
38061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
38161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_BASE_CFG,(void*)&ioctl_msg) < 0 ) {
3828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for setting base configuration failed");
38361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
38461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
38561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
38661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // Get the I/P and O/P buffer requirements
38761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = NULL;
38861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = (void*)&m_sInput_buff_property;
38961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
39061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_GET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
3918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for getting i/p buffer requirement failed");
39261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
39361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
39461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
39561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = NULL;
39661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = (void*)&m_sOutput_buff_property;
39761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
39861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_GET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
3998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for getting o/p buffer requirement failed");
40061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
40161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
40261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
40361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_profile_set = false;
40461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_level_set = false;
40561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
40661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (venc_set_profile_level(0, 0)) {
4078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("%s(): Init Profile/Level setting success",
40861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                __func__);
40961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
41061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
41161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    recon_buffers_count = MAX_RECON_BUFFERS;
41261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ltrmode.ltr_mode = 0;
41361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ltrcount.ltr_count = 0;
41461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ltrperiod.ltr_period = 0;
41561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
41661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
41747e37c4428509524ee576920a98381f3e4872493Nick Pelly}
41847e37c4428509524ee576920a98381f3e4872493Nick Pelly
41947e37c4428509524ee576920a98381f3e4872493Nick Pellyvoid venc_dev::venc_close()
42047e37c4428509524ee576920a98381f3e4872493Nick Pelly{
4218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("venc_close: fd = %d", m_nDriver_fd);
42261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
42361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((int)m_nDriver_fd >= 0) {
4248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("venc_close(): Calling VEN_IOCTL_CMD_STOP_READ_MSG");
42561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        (void)ioctl(m_nDriver_fd, VEN_IOCTL_CMD_STOP_READ_MSG,
42661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                NULL);
4278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Calling close()");
42861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close(m_nDriver_fd);
42961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_nDriver_fd = -1;
43061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
43161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
4328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_debug.infile) {
4338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fclose(m_debug.infile);
4348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_debug.infile = NULL;
4358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
4368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_debug.outfile) {
4378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fclose(m_debug.outfile);
4388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_debug.outfile = NULL;
4398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
4408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
44147e37c4428509524ee576920a98381f3e4872493Nick Pelly}
44247e37c4428509524ee576920a98381f3e4872493Nick Pelly
44347e37c4428509524ee576920a98381f3e4872493Nick Pellybool venc_dev::venc_set_buf_req(unsigned long *min_buff_count,
44461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned long *actual_buff_count,
44561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned long *buff_size,
44661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned long port)
44747e37c4428509524ee576920a98381f3e4872493Nick Pelly{
44861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
44961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned long temp_count = 0;
45061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
45161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == 0) {
45261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*actual_buff_count > m_sInput_buff_property.mincount) {
45361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            temp_count = m_sInput_buff_property.actualcount;
45461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_sInput_buff_property.actualcount = *actual_buff_count;
45561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ioctl_msg.in = (void*)&m_sInput_buff_property;
45661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ioctl_msg.out = NULL;
45761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
45861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
4598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR: Request for setting i/p buffer requirement failed");
46061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_sInput_buff_property.actualcount = temp_count;
46161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return false;
46261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
46361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
4648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("I/P Count set to %lu", *actual_buff_count);
46561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
46661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
46761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*actual_buff_count > m_sOutput_buff_property.mincount) {
46861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            temp_count = m_sOutput_buff_property.actualcount;
46961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_sOutput_buff_property.actualcount = *actual_buff_count;
47061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ioctl_msg.in = (void*)&m_sOutput_buff_property;
47161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ioctl_msg.out = NULL;
47261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
47361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
4748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR: Request for setting o/p buffer requirement failed");
47561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_sOutput_buff_property.actualcount = temp_count;
47661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return false;
47761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
47861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
4798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("O/P Count set to %lu", *actual_buff_count);
48061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
48147e37c4428509524ee576920a98381f3e4872493Nick Pelly    }
48247e37c4428509524ee576920a98381f3e4872493Nick Pelly
48361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
48447e37c4428509524ee576920a98381f3e4872493Nick Pelly
48547e37c4428509524ee576920a98381f3e4872493Nick Pelly}
48647e37c4428509524ee576920a98381f3e4872493Nick Pelly
487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_loaded_start()
488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
48961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct timespec ts;
49061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int status = 0;
49161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
49261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_CMD_START, NULL) < 0) {
49361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: VEN_IOCTL_CMD_START failed");
49461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
49561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
49661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
49761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (clock_gettime(CLOCK_REALTIME, &ts) < 0) {
49861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("%s: clock_gettime failed", __func__);
49961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
50061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
50161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
50261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ts.tv_sec += 1;
50361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&loaded_start_stop_mlock);
50461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("%s: wait on start done", __func__);
50561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    status = pthread_cond_timedwait(&loaded_start_stop_cond,
50661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            &loaded_start_stop_mlock, &ts);
50761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
50861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (status != 0) {
50961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("%s: error status = %d, %s", __func__,
51061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                status, strerror(status));
51161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_unlock(&loaded_start_stop_mlock);
51261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
51361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
51461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
51561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("%s: wait over on start done", __func__);
516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pthread_mutex_unlock(&loaded_start_stop_mlock);
51761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("%s: venc_loaded_start success", __func__);
51861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_loaded_stop()
522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
52361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct timespec ts;
52461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int status = 0;
52561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
52661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_CMD_STOP, NULL) < 0) {
52761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: VEN_IOCTL_CMD_STOP failed");
52861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
52961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
53061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
53161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (clock_gettime(CLOCK_REALTIME, &ts) < 0) {
53261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("%s: clock_gettime failed", __func__);
53361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
53461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
53561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
53661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ts.tv_sec += 1;
53761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&loaded_start_stop_mlock);
53861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("%s: wait on stop done", __func__);
53961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    status = pthread_cond_timedwait(&loaded_start_stop_cond,
54061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            &loaded_start_stop_mlock, &ts);
54161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
54261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (status != 0) {
54361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("%s: error status = %d, %s", __func__,
54461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                status, strerror(status));
54561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_unlock(&loaded_start_stop_mlock);
54661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
54761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
54861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
54961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("%s: wait over on stop done", __func__);
550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pthread_mutex_unlock(&loaded_start_stop_mlock);
55161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("%s: venc_loaded_stop success", __func__);
55261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_loaded_start_done()
556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
55761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&loaded_start_stop_mlock);
55861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("%s: signal start done", __func__);
55961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_cond_signal(&loaded_start_stop_cond);
56061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&loaded_start_stop_mlock);
56161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_loaded_stop_done()
565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
56661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&loaded_start_stop_mlock);
56761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("%s: signal stop done", __func__);
56861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_cond_signal(&loaded_start_stop_cond);
56961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&loaded_start_stop_mlock);
57061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_get_seq_hdr(void *buffer,
5748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        unsigned buffer_size, OMX_U32 *header_len)
575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
57661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
57761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int i = 0;
57861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("venc_dev::venc_get_seq_hdr");
57961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_seqheader seq_in, seq_out;
58061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    seq_in.hdrlen = 0;
58161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    seq_in.bufsize = buffer_size;
58261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    seq_in.hdrbufptr = (unsigned char*)buffer;
58361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
58461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (seq_in.hdrbufptr == NULL) {
58561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: malloc for sequence header failed");
58661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
58761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
58961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("seq_in: buf=%x, sz=%d, hdrlen=%d", seq_in.hdrbufptr,
59061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            seq_in.bufsize, seq_in.hdrlen);
5916eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
59261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&seq_in;
59361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = (void*)&seq_out;
59447e37c4428509524ee576920a98381f3e4872493Nick Pelly
59561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_GET_SEQUENCE_HDR,(void*)&ioctl_msg) < 0) {
59661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for getting sequence header failed");
59761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
59847e37c4428509524ee576920a98381f3e4872493Nick Pelly    }
59961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
60061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (seq_out.hdrlen == 0) {
60161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Seq header returned zero length header");
60261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("seq_out: buf=%x, sz=%d, hdrlen=%d", seq_out.hdrbufptr,
60361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                seq_out.bufsize, seq_out.hdrlen);
60461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
60547e37c4428509524ee576920a98381f3e4872493Nick Pelly    }
60647e37c4428509524ee576920a98381f3e4872493Nick Pelly
60761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    *header_len = seq_out.hdrlen;
60861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("seq_out: buf=%x, sz=%d, hdrlen=%d", seq_out.hdrbufptr,
60961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            seq_out.bufsize, seq_out.hdrlen);
61047e37c4428509524ee576920a98381f3e4872493Nick Pelly
61161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
61247e37c4428509524ee576920a98381f3e4872493Nick Pelly}
61347e37c4428509524ee576920a98381f3e4872493Nick Pelly
61461a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_get_capability_ltrcount(unsigned long *min,
61561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned long *max, unsigned long *step_size)
61647e37c4428509524ee576920a98381f3e4872493Nick Pelly{
61761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
61861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_range  cap_ltr_count;
61961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = NULL;
62061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = (void*)&cap_ltr_count;
621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
62261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd, VEN_IOCTL_GET_CAPABILITY_LTRCOUNT,
62361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (void*)&ioctl_msg) < 0) {
62461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Get LTR Capability failed");
62561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
62661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
62761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *min = cap_ltr_count.min;
62861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *max = cap_ltr_count.max;
62961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *step_size = cap_ltr_count.step_size;
63061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("LTR Capability: min=%x, max=%d, step_size=%d",
63161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *min, *max, *step_size);
63261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
633058dcdbfe54a3294a2713ba9993e6024f3f3a6a0Haynes Mathew George
63461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
63561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
636058dcdbfe54a3294a2713ba9993e6024f3f3a6a0Haynes Mathew George
63761a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_get_buf_req(unsigned long *min_buff_count,
63861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned long *actual_buff_count,
63961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned long *buff_size,
64061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned long port)
64161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
64261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
64347e37c4428509524ee576920a98381f3e4872493Nick Pelly
64461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == 0) {
645058dcdbfe54a3294a2713ba9993e6024f3f3a6a0Haynes Mathew George        ioctl_msg.in = NULL;
646058dcdbfe54a3294a2713ba9993e6024f3f3a6a0Haynes Mathew George        ioctl_msg.out = (void*)&m_sInput_buff_property;
64761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
64861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ioctl (m_nDriver_fd,VEN_IOCTL_GET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
6498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: Request for getting i/p buffer requirement failed");
65047e37c4428509524ee576920a98381f3e4872493Nick Pelly            return false;
651058dcdbfe54a3294a2713ba9993e6024f3f3a6a0Haynes Mathew George        }
652058dcdbfe54a3294a2713ba9993e6024f3f3a6a0Haynes Mathew George
65361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *min_buff_count = m_sInput_buff_property.mincount;
65461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *actual_buff_count = m_sInput_buff_property.actualcount;
65561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef USE_ION
65661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // For ION memory allocations of the allocated buffer size
65761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // must be 4k aligned, hence aligning the input buffer
65861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // size to 4k.
65961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sInput_buff_property.datasize = (m_sInput_buff_property.datasize + 4095)
66061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            & (~4095);
66161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
66261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *buff_size = m_sInput_buff_property.datasize;
66361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
664058dcdbfe54a3294a2713ba9993e6024f3f3a6a0Haynes Mathew George        ioctl_msg.in = NULL;
665058dcdbfe54a3294a2713ba9993e6024f3f3a6a0Haynes Mathew George        ioctl_msg.out = (void*)&m_sOutput_buff_property;
66661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
66761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ioctl (m_nDriver_fd,VEN_IOCTL_GET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
6688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: Request for getting o/p buffer requirement failed");
66947e37c4428509524ee576920a98381f3e4872493Nick Pelly            return false;
670058dcdbfe54a3294a2713ba9993e6024f3f3a6a0Haynes Mathew George        }
671058dcdbfe54a3294a2713ba9993e6024f3f3a6a0Haynes Mathew George
67261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *min_buff_count = m_sOutput_buff_property.mincount;
67361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *actual_buff_count = m_sOutput_buff_property.actualcount;
67461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *buff_size = m_sOutput_buff_property.datasize;
67561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
676058dcdbfe54a3294a2713ba9993e6024f3f3a6a0Haynes Mathew George
67761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
67847e37c4428509524ee576920a98381f3e4872493Nick Pelly
67961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
68047e37c4428509524ee576920a98381f3e4872493Nick Pelly
68161a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_set_param(void *paramData,OMX_INDEXTYPE index )
68261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
68361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
6848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("venc_set_param:: venc-720p");
68561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
68661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch (index) {
68761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamPortDefinition:
688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
68961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
69061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
69161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("venc_set_param: OMX_IndexParamPortDefinition");
69261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
69361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (portDefn->nPortIndex == PORT_INDEX_IN) {
69461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
69561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_encode_framerate(portDefn->format.video.xFramerate, 0)) {
69661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
69761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
69861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
69961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_color_format(portDefn->format.video.eColorFormat)) {
70061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
70161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
70261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
70361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_LOW("Basic parameter has changed");
70461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_sVenc_cfg.input_height = portDefn->format.video.nFrameHeight;
70561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_sVenc_cfg.input_width = portDefn->format.video.nFrameWidth;
70661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
70761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ioctl_msg.in = (void*)&m_sVenc_cfg;
70861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ioctl_msg.out = NULL;
70961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
71061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_BASE_CFG,(void*)&ioctl_msg) < 0) {
7118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Request for setting base config failed");
71261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
71361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
71461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
71561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH("WxH (%dx%d), codec (%d), fps(nr/dr) (%d/%d), bitrate (%d), "
71661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            "color_format (%d)", m_sVenc_cfg.input_width, m_sVenc_cfg.input_height,
71761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            m_sVenc_cfg.codectype, m_sVenc_cfg.fps_num, m_sVenc_cfg.fps_den,
71861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            m_sVenc_cfg.targetbitrate, m_sVenc_cfg.inputformat);
71961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
72061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_LOW("Updating the buffer count/size for the new resolution");
72161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ioctl_msg.in = NULL;
72261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ioctl_msg.out = (void*)&m_sInput_buff_property;
72361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
72461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (ioctl (m_nDriver_fd, VEN_IOCTL_GET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
7258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Request for getting i/p bufreq failed");
72661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
72761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
72861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
72961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH("Got updated m_sInput_buff_property values: "
73061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            "datasize = %u, maxcount = %u, actualcnt = %u, "
73161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            "mincount = %u", m_sInput_buff_property.datasize,
73261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            m_sInput_buff_property.maxcount, m_sInput_buff_property.actualcount,
73361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            m_sInput_buff_property.mincount);
73461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
73561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ioctl_msg.in = NULL;
73661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ioctl_msg.out = (void*)&m_sOutput_buff_property;
73761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
73861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (ioctl (m_nDriver_fd, VEN_IOCTL_GET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
7398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Request for getting o/p bufreq failed");
74061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
74161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
74261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
74361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH("Got updated m_sOutput_buff_property values: "
74461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            "datasize = %u, maxcount = %u, actualcnt = %u, "
74561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            "mincount = %u", m_sOutput_buff_property.datasize,
74661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            m_sOutput_buff_property.maxcount, m_sOutput_buff_property.actualcount,
74761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            m_sOutput_buff_property.mincount);
74861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ioctl_msg.in = (void*)&m_sOutput_buff_property;
74961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ioctl_msg.out = NULL;
75061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
75161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (ioctl (m_nDriver_fd, VEN_IOCTL_SET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
7528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Request for setting o/p bufreq failed");
75361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
75461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
75561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
75661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ((portDefn->nBufferCountActual >= m_sInput_buff_property.mincount) &&
75761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (portDefn->nBufferCountActual <= m_sInput_buff_property.maxcount)) {
75861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_sInput_buff_property.actualcount = portDefn->nBufferCountActual;
75961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ioctl_msg.in = (void*)&m_sInput_buff_property;
76061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ioctl_msg.out = NULL;
76161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
76261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (ioctl(m_nDriver_fd,VEN_IOCTL_SET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
7638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_ERROR("ERROR: Request for setting i/p buffer requirements failed");
76461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            return false;
76561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
76661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
76761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
76861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (m_sInput_buff_property.datasize != portDefn->nBufferSize) {
7698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("WARNING: Requested i/p bufsize[%u],"
77061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                "Driver's updated i/p bufsize = %u", portDefn->nBufferSize,
77161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                m_sInput_buff_property.datasize);
77261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
77361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
77461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_level_set = false;
77561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
77661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_profile_level(0, 0)) {
77761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_LOW("%s(): Profile/Level setting success", __func__);
77861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
77961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (portDefn->nPortIndex == PORT_INDEX_OUT) {
78061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_target_bitrate(portDefn->format.video.nBitrate, 0)) {
78161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
78261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
78361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
78461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ( (portDefn->nBufferCountActual >= m_sOutput_buff_property.mincount)
78561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            &&
78661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (m_sOutput_buff_property.maxcount >= portDefn->nBufferCountActual)
78761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            &&
78861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (m_sOutput_buff_property.datasize == portDefn->nBufferSize)
78961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                       ) {
79061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_sOutput_buff_property.actualcount = portDefn->nBufferCountActual;
79161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ioctl_msg.in = (void*)&m_sOutput_buff_property;
79261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ioctl_msg.out = NULL;
79361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
79461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
7958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_ERROR("ERROR: ioctl VEN_IOCTL_SET_OUTPUT_BUFFER_REQ failed");
79661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            return false;
79761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
79861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
7998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Setting Output buffer requirements failed");
80061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
80161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
80261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
8038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamPortDefinition");
80461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
80561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
80661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
80861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoPortFormat:
809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
81061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt;
81161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portFmt =(OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
8128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoPortFormat");
81361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
81461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (portFmt->nPortIndex == (OMX_U32) PORT_INDEX_IN) {
81561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_color_format(portFmt->eColorFormat)) {
81661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
81761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
81861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (portFmt->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
81961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_encode_framerate(portFmt->xFramerate, 0)) {
82061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
82161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
82261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
8238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoPortFormat");
82461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
82561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
82661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
82861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoBitrate:
829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
83061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_BITRATETYPE* pParam;
83161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pParam = (OMX_VIDEO_PARAM_BITRATETYPE*)paramData;
8328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoBitrate");
83361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
83461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
83561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_target_bitrate(pParam->nTargetBitrate, 0)) {
8368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Target Bit Rate setting failed");
83761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
83861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
83961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
84061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_ratectrl_cfg(pParam->eControlRate)) {
8418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Rate Control setting failed");
84261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
84361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
84461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
8458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoBitrate");
84661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
84761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
84861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
85061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoMpeg4:
851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
85261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_MPEG4TYPE* pParam;
85361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_U32 bFrames = 0;
85447e37c4428509524ee576920a98381f3e4872493Nick Pelly
85561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pParam = (OMX_VIDEO_PARAM_MPEG4TYPE*)paramData;
8568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoMpeg4");
85761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
85861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
85961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_voptiming_cfg(pParam->nTimeIncRes)) {
8608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Request for setting vop_timing failed");
86161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
86261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
86361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
86461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_profile_set = false;
86561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_level_set = false;
86661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
86761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_profile_level (pParam->eProfile, pParam->eLevel)) {
8688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Unsuccessful in updating Profile and level");
86961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
87061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
87147e37c4428509524ee576920a98381f3e4872493Nick Pelly
872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
87361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    else {
87461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (pParam->eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple) {
87561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (pParam->nBFrames) {
87661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
87761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                bFrames = 1;
87861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
87961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
88061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (pParam->nBFrames) {
8818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_ERROR("Warning: B frames not supported");
88261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                bFrames = 0;
88361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
88461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
88561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
88661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
88847e37c4428509524ee576920a98381f3e4872493Nick Pelly
88961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_intra_period (pParam->nPFrames,bFrames)) {
8908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Request for setting intra period failed");
89161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
89261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
89347e37c4428509524ee576920a98381f3e4872493Nick Pelly
89461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_multislice_cfg(OMX_IndexParamVideoMpeg4,pParam->nSliceHeaderSpacing)) {
8958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Unsuccessful in updating slice_config");
89661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
89761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
89861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
8998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoMpeg4");
90061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
90161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
90261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
90361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
90461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoH263:
90561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
90661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_H263TYPE* pParam = (OMX_VIDEO_PARAM_H263TYPE*)paramData;
9078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoH263");
90861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_U32 bFrames = 0;
90961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
91061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
91161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_profile_set = false;
91261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_level_set = false;
91361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
91461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_profile_level (pParam->eProfile, pParam->eLevel)) {
9158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Unsuccessful in updating Profile and level");
91661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
91761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
91861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
91961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pParam->nBFrames)
9208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("WARNING: B frame not supported for H.263");
92161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
92261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_intra_period (pParam->nPFrames, bFrames) == false) {
9238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Request for setting intra period failed");
92461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
92561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
92661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
9278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoH263");
92861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
92961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
93061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
93161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
93261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoAvc:
93361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
9348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoAvc");
93561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_AVCTYPE* pParam = (OMX_VIDEO_PARAM_AVCTYPE*)paramData;
93661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_U32 bFrames = 0;
93761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
93861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
9398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("pParam->eProfile :%d ,pParam->eLevel %d",
94061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pParam->eProfile,pParam->eLevel);
94161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
94261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_profile_set = false;
94361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_level_set = false;
94461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
94561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_profile_level (pParam->eProfile,pParam->eLevel)) {
9468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Unsuccessful in updating Profile and level %d, %d",
94761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pParam->eProfile, pParam->eLevel);
94861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
94961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
95061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
95161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef MAX_RES_1080P
95261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    else {
95361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (pParam->eProfile != OMX_VIDEO_AVCProfileBaseline) {
95461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (pParam->nBFrames) {
95561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
95661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                bFrames = 1;
95761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
95861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
95961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (pParam->nBFrames) {
9608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_ERROR("Warning: B frames not supported");
96161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                bFrames = 0;
96261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
96361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
96461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
96561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
96661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
96761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
96861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_intra_period (pParam->nPFrames, bFrames)) {
9698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Request for setting intra period failed");
97061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
97161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
97261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
97361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_entropy_config (pParam->bEntropyCodingCABAC, pParam->nCabacInitIdc)) {
9748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Request for setting Entropy failed");
97561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
97661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
97761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
97861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_inloop_filter (pParam->eLoopFilterMode)) {
9798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Request for setting Inloop filter failed");
98061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
98161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
98261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
98361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_multislice_cfg(OMX_IndexParamVideoAvc, pParam->nSliceHeaderSpacing)) {
9848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("WARNING: Unsuccessful in updating slice_config");
98561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
98661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
98761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
9888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoAvc");
98961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
99061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
99161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //TBD, lot of other variables to be updated, yet to decide
99261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
99361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
99461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoIntraRefresh:
99561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
9968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoIntraRefresh");
99761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_INTRAREFRESHTYPE *intra_refresh =
99861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_VIDEO_PARAM_INTRAREFRESHTYPE *)paramData;
99961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
100061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (intra_refresh->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
100161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_intra_refresh(intra_refresh->eRefreshMode, intra_refresh->nCirMBs) == false) {
10028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Setting Intra refresh failed");
100361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
100461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
100561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
10068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoIntraRefresh");
100761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
100861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
100961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
101061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
101161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoErrorCorrection:
101261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
10138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoErrorCorrection");
101461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *error_resilience =
101561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)paramData;
101661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
101761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (error_resilience->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
101861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_error_resilience(error_resilience) == false) {
10198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Setting Intra refresh failed");
102061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
102161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
102261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
10238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoErrorCorrection");
102461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
102561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
102661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
102761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
102861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoProfileLevelCurrent:
102961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
10308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoProfileLevelCurrent");
103161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_PROFILELEVELTYPE *profile_level =
103261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData;
103361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
103461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (profile_level->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
103561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_profile_set = false;
103661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_level_set = false;
103761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
103861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_profile_level (profile_level->eProfile,
103961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                profile_level->eLevel)) {
10408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("WARNING: Unsuccessful in updating Profile and level");
104161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
104261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
104361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
10448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoProfileLevelCurrent");
104561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
104661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
104761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
104861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
104961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoQuantization:
105061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
10518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoQuantization");
105261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_QUANTIZATIONTYPE *session_qp =
105361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_VIDEO_PARAM_QUANTIZATIONTYPE *)paramData;
105461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
105561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (session_qp->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
105661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_session_qp (session_qp->nQpI,
105761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                session_qp->nQpP) == false) {
10588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Setting Session QP failed");
105961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
106061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
106161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
10628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoQuantization");
106361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
106461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
106561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
106661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
106761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
106861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamVideoQPRange:
106961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
10708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param:OMX_QcomIndexParamVideoQPRange");
107161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_QCOM_VIDEO_PARAM_QPRANGETYPE *qp_range =
107261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_QCOM_VIDEO_PARAM_QPRANGETYPE *)paramData;
107361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
107461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (qp_range->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
107561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_qp_range (qp_range->minQP,
107661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                qp_range->maxQP) == false) {
10778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Setting QP Range failed");
107861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
107961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
108061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
10818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_QcomIndexParamVideoQPRange");
108261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
108361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
108461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
108561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
108661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
108761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_ExtraDataVideoEncoderSliceInfo:
108861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
108961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param: OMX_ExtraDataVideoEncoderSliceInfo");
109061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_U32 extra_data = *(OMX_U32 *)paramData;
109161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
109261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (venc_set_extradata(extra_data) == false) {
109361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Setting "
109461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            "OMX_ExtraDataVideoEncoderSliceInfo failed");
109561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return false;
109661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
109761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
109861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
109961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
110061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_ExtraDataVideoLTRInfo:
110161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
110261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param: OMX_ExtraDataVideoLTRInfo");
110361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_U32 extra_data = *(OMX_U32 *)paramData;
110461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
110561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (venc_set_extradata(extra_data) == false) {
110661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Setting "
110761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            "OMX_ExtraDataVideoLTRInfo failed");
110861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return false;
110961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
111061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
111161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
111261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
111361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexEnableSliceDeliveryMode:
111461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
111561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_EXTNINDEX_PARAMTYPE* pParam =
111661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (QOMX_EXTNINDEX_PARAMTYPE*)paramData;
111761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
111861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pParam->nPortIndex == PORT_INDEX_OUT) {
111961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_slice_delivery_mode(pParam->bEnable) == false) {
112061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("Setting slice delivery mode failed");
112161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorUnsupportedSetting;
112261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
112361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
112461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("OMX_QcomIndexEnableSliceDeliveryMode "
112561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            "called on wrong port(%d)", pParam->nPortIndex);
112661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadPortIndex;
112761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
112861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
112961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
113061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
113161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexEnableH263PlusPType:
113261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
113361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_EXTNINDEX_PARAMTYPE* pParam =
113461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (QOMX_EXTNINDEX_PARAMTYPE*)paramData;
113561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("OMX_QcomIndexEnableH263PlusPType");
113661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
113761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pParam->nPortIndex == PORT_INDEX_OUT) {
113861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_plusptype(pParam->bEnable) == false) {
113961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("Setting PlusPType failed for H263");
114061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorUnsupportedSetting;
114161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
114261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
114361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("OMX_QcomIndexEnableH263PlusPType "
114461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            "called on wrong port(%d)", pParam->nPortIndex);
114561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadPortIndex;
114661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
114761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
114861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
114961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
115061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case QOMX_IndexParamVideoLTRMode:
115161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
115261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_VIDEO_PARAM_LTRMODE_TYPE* pParam =
115361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (QOMX_VIDEO_PARAM_LTRMODE_TYPE*)paramData;
115461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
115561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pParam->nPortIndex == PORT_INDEX_OUT) {
115661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_ltrmode(pParam->eLTRMode)) {
115761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("Setting ltr mode failed");
115861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorUnsupportedSetting;
115961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
116061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
116161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("QOMX_IndexParamVideoLTRMode "
116261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            "called on wrong port(%d)", pParam->nPortIndex);
116361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadPortIndex;
116461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
116561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
116661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
116761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
116861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case QOMX_IndexParamVideoLTRCount:
116961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
117061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_VIDEO_PARAM_LTRCOUNT_TYPE* pParam =
117161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (QOMX_VIDEO_PARAM_LTRCOUNT_TYPE*)paramData;
117261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
117361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pParam->nPortIndex == PORT_INDEX_OUT) {
117461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_ltrcount(pParam->nCount)) {
117561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("Setting ltr count failed");
117661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorUnsupportedSetting;
117761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
117861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
117961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("QOMX_IndexParamVideoLTRCount "
118061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            "called on wrong port(%d)", pParam->nPortIndex);
118161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadPortIndex;
118261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
118361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
118461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
118561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
118661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoSliceFMO:
118761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
118861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("venc_set_param: Unsupported index 0x%x", index);
118961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
119061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
119161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
119261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
119361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
119461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
119561a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_set_config(void *configData, OMX_INDEXTYPE index)
119661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
119761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
11988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Inside venc_set_config");
119961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
120061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch (index) {
120161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexConfigVideoBitrate:
120261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
120361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_CONFIG_BITRATETYPE *bit_rate = (OMX_VIDEO_CONFIG_BITRATETYPE *)
120461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    configData;
120561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
120661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_max_allowed_bitrate_check &&
120761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        !venc_max_allowed_bitrate_check(bit_rate->nEncodeBitrate)) {
120861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("Max Allowed Bitrate Check failed");
120961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return false;
121061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
121161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
12128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("venc_set_config: OMX_IndexConfigVideoBitrate");
121361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
121461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (bit_rate->nPortIndex == (OMX_U32)PORT_INDEX_OUT) {
121561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_target_bitrate(bit_rate->nEncodeBitrate, 1) == false) {
12168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Setting Target Bit rate failed");
121761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
121861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
121961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
12208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexConfigVideoBitrate");
122161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
122261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
122361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
122461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
122561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexConfigVideoFramerate:
122661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
122761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_CONFIG_FRAMERATETYPE *frame_rate = (OMX_CONFIG_FRAMERATETYPE *)
122861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    configData;
12298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("venc_set_config: OMX_IndexConfigVideoFramerate");
123061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
123161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (frame_rate->nPortIndex == (OMX_U32)PORT_INDEX_OUT) {
123261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_encode_framerate(frame_rate->xEncodeFramerate, 1) == false) {
12338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Setting Encode Framerate failed");
123461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
123561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
123661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
12378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexConfigVideoFramerate");
123861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
123961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
124061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
124161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
124261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case QOMX_IndexConfigVideoIntraperiod:
124361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
12448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param:QOMX_IndexConfigVideoIntraperiod");
124561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_VIDEO_INTRAPERIODTYPE *intraperiod =
124661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (QOMX_VIDEO_INTRAPERIODTYPE *)configData;
124761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
124861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (intraperiod->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
124961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_intra_period(intraperiod->nPFrames, intraperiod->nBFrames) == false) {
12508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Request for setting intra period failed");
125161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
125261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
125361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
125461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
125561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
125661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
125761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexConfigVideoIntraVOPRefresh:
125861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
125961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_CONFIG_INTRAREFRESHVOPTYPE *intra_vop_refresh = (OMX_CONFIG_INTRAREFRESHVOPTYPE *)
126061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    configData;
12618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("venc_set_config: OMX_IndexConfigVideoIntraVOPRefresh");
126261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
126361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (intra_vop_refresh->nPortIndex == (OMX_U32)PORT_INDEX_OUT) {
126461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_intra_vop_refresh(intra_vop_refresh->IntraRefreshVOP) == false) {
12658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Setting Encode Framerate failed");
126661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
126761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
126861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
12698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexConfigVideoFramerate");
127061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
127161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
127261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
127361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
127461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexConfigCommonRotate:
127561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
127661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_CONFIG_ROTATIONTYPE *config_rotation =
127761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    reinterpret_cast<OMX_CONFIG_ROTATIONTYPE*>(configData);
127861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                venc_ioctl_msg ioctl_msg = {NULL,NULL};
127961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_U32 nFrameWidth;
128061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
12818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("venc_set_config: updating the new Dims");
128261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nFrameWidth = m_sVenc_cfg.input_width;
128361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_sVenc_cfg.input_width  = m_sVenc_cfg.input_height;
128461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_sVenc_cfg.input_height = nFrameWidth;
128561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ioctl_msg.in = (void*)&m_sVenc_cfg;
128661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ioctl_msg.out = NULL;
128761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
128861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_BASE_CFG,(void*)&ioctl_msg) < 0) {
12898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Dimension Change for Rotation failed");
129061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return false;
129161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
129261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
129361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
129461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
129561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case QOMX_IndexConfigVideoLTRPeriod:
129661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
129761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE* pParam =
129861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE*)configData;
129961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
130061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pParam->nPortIndex == PORT_INDEX_OUT) {
130161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_ltrperiod(pParam->nFrames)) {
130261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("Setting ltr period failed");
130361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorUnsupportedSetting;
130461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
130561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
130661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("QOMX_IndexConfigVideoLTRPeriod "
130761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            "called on wrong port(%d)", pParam->nPortIndex);
130861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadPortIndex;
130961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
131061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
131161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
131261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
131361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case QOMX_IndexConfigVideoLTRUse:
131461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
131561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_VIDEO_CONFIG_LTRUSE_TYPE* pParam =
131661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (QOMX_VIDEO_CONFIG_LTRUSE_TYPE*)configData;
131761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
131861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pParam->nPortIndex == PORT_INDEX_OUT) {
131961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_ltruse(pParam->nID, pParam->nFrames)) {
132061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("Setting ltr use failed");
132161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorUnsupportedSetting;
132261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
132361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
132461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("QOMX_IndexConfigVideoLTRUse "
132561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            "called on wrong port(%d)", pParam->nPortIndex);
132661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadPortIndex;
132761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
132861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
132961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
133061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
133161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
133261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("venc_set_config: Unsupported index = 0x%x", index);
133361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
133461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
133561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
133661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
133761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
133861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
133961a2c6a19dbd06a317a419623020e02056661876Praveen Chavanunsigned venc_dev::venc_stop( void)
134061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
134161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef MAX_RES_1080P
134261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_free();
134361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
134461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ioctl(m_nDriver_fd,VEN_IOCTL_CMD_STOP,NULL);
134561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
134661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
134761a2c6a19dbd06a317a419623020e02056661876Praveen Chavanunsigned venc_dev::venc_pause(void)
134861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
134961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ioctl(m_nDriver_fd,VEN_IOCTL_CMD_PAUSE,NULL);
135061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
135161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
135261a2c6a19dbd06a317a419623020e02056661876Praveen Chavanunsigned venc_dev::venc_resume(void)
135361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
135461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ioctl(m_nDriver_fd,VEN_IOCTL_CMD_RESUME,NULL) ;
135547e37c4428509524ee576920a98381f3e4872493Nick Pelly}
135647e37c4428509524ee576920a98381f3e4872493Nick Pelly
1357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned venc_dev::venc_start_done(void)
1358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
135961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return 0;
1360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
13626eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalunsigned venc_dev::venc_set_message_thread_id(pthread_t)
1363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
136461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return 0;
1365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
136747e37c4428509524ee576920a98381f3e4872493Nick Pellyunsigned venc_dev::venc_start(void)
136847e37c4428509524ee576920a98381f3e4872493Nick Pelly{
13698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("%s(): Check Profile/Level set in driver before start",
137061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            __func__);
137161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
137261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!venc_set_profile_level(0, 0)) {
13738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: %s(): Driver Profile/Level is NOT SET",
137461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                __func__);
137561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
13768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("%s(): Driver Profile[%lu]/Level[%lu] successfully SET",
137761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                __func__, codec_profile.profile, profile_level.level);
137861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
137961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
138061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_max_allowed_bitrate_check &&
138161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            !venc_max_allowed_bitrate_check(bitrate.target_bitrate)) {
138261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Maximum Allowed Bitrate Check failed");
138361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return -1;
138461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
138561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
138661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_config_print();
1387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
1389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
139061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((codec_profile.profile == VEN_PROFILE_MPEG4_SP) ||
139161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (codec_profile.profile == VEN_PROFILE_H264_BASELINE) ||
139261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (codec_profile.profile == VEN_PROFILE_H263_BASELINE))
139361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        recon_buffers_count = MAX_RECON_BUFFERS - 2;
139461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else
139561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        recon_buffers_count = MAX_RECON_BUFFERS;
139661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
139761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ltrmode.ltr_mode == (unsigned long)QOMX_VIDEO_LTRMode_Auto) {
139861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        recon_buffers_count = MAX_RECON_BUFFERS;
139961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("ltr mode enabled, so set recon buffers "
140061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "count to %d", recon_buffers_count);
140161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
140261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
140361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!venc_allocate_recon_buffers())
140461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return ioctl(m_nDriver_fd, VEN_IOCTL_CMD_START, NULL);
140561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else {
14068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Failed in creating Recon buffers");
140761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return -1;
140861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
14096eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
1410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
1411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return ioctl(m_nDriver_fd, VEN_IOCTL_CMD_START, NULL);
1412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
1416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 venc_dev::venc_allocate_recon_buffers()
1417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
141861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 yuv_size;
141961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_ioctl_msg ioctl_msg;
142061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_recon_buff_size recon_buff_size;
142161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
142261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    recon_buff_size.width =  ((m_sVenc_cfg.input_width + 15) / 16) * 16;
142361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    recon_buff_size.height = ((m_sVenc_cfg.input_height + 15) / 16 ) * 16;
142461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
14258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Width %d, Height %d, w_round %d, h_round %d", m_sVenc_cfg.input_width,
142661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_sVenc_cfg.input_height, recon_buff_size.width, recon_buff_size.height);
142761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
142861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = NULL;
142961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = (void*)&recon_buff_size;
143061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
143161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_GET_RECON_BUFFER_SIZE, (void*)&ioctl_msg) < 0) {
14328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("VEN_IOCTL_GET_RECON_BUFFER_SIZE Failed for width: %d, Height %d" ,
143361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                recon_buff_size.width, recon_buff_size.height);
143461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
143561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
143661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
14378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("Width %d, Height %d, w_round %d, h_round %d, yuv_size %d alignment %d count %d",
143861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, recon_buff_size.width,
143961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            recon_buff_size.height, recon_buff_size.size, recon_buff_size.alignment,
144061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            recon_buffers_count);
144161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
144261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (int i = 0; i < recon_buffers_count; i++) {
144361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pmem_allocate(recon_buff_size.size, recon_buff_size.alignment,i)) {
14448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error returned in allocating recon buffers");
144561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return -1;
144661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
144761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
144861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
144961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return 0;
1450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 venc_dev::pmem_allocate(OMX_U32 size, OMX_U32 alignment, OMX_U32 count)
1452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
145361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 pmem_fd = -1;
145461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 width, height;
145561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    void *buf_addr = NULL;
145661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_ioctl_msg ioctl_msg;
145761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_recon_addr recon_addr;
145861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = 0;
1459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
146161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    recon_buff[count].ion_device_fd = open (MEM_DEVICE,O_RDONLY);
146261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
146361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (recon_buff[count].ion_device_fd < 0) {
14648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: ION Device open() Failed");
146561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return -1;
146661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
146761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
146861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    recon_buff[count].alloc_data.len = size;
14696eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef MAX_RES_720P
14709157b7d2c90c853713840ce85a78f5d22600fe1ePraveen Chavan    recon_buff[count].alloc_data.ION_HEAP_MASK = ION_HEAP(MEM_HEAP_ID);
14716eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#else
14729157b7d2c90c853713840ce85a78f5d22600fe1ePraveen Chavan    recon_buff[count].alloc_data.ION_HEAP_MASK = (ION_HEAP(MEM_HEAP_ID) |
147361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ION_HEAP(ION_IOMMU_HEAP_ID));
14746eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
147561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    recon_buff[count].alloc_data.flags = ION_FLAG_CACHED;
147661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    recon_buff[count].alloc_data.align = clip2(alignment);
147761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
147861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (recon_buff[count].alloc_data.align != 8192)
147961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        recon_buff[count].alloc_data.align = 8192;
148061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
148161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(recon_buff[count].ion_device_fd,ION_IOC_ALLOC,&recon_buff[count].alloc_data);
148261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
148361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc || !recon_buff[count].alloc_data.handle) {
14848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ION ALLOC memory failed ");
148561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        recon_buff[count].alloc_data.handle=NULL;
148661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return -1;
148761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
148861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
148961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    recon_buff[count].ion_alloc_fd.handle = recon_buff[count].alloc_data.handle;
149061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(recon_buff[count].ion_device_fd,ION_IOC_MAP,&recon_buff[count].ion_alloc_fd);
149161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
149261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
14938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ION MAP failed ");
1494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        recon_buff[count].ion_alloc_fd.fd =-1;
1495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        recon_buff[count].ion_alloc_fd.fd =-1;
1496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return -1;
149761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
149861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
149961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_fd = recon_buff[count].ion_alloc_fd.fd;
1500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
150161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct pmem_allocation allocation;
150261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_fd = open(MEM_DEVICE, O_RDWR);
150361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
150461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((int)(pmem_fd) < 0) {
15058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Failed to get an pmem handle");
150661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return -1;
150761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
150861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
150961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    allocation.size = size;
151061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    allocation.align = clip2(alignment);
151161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
151261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (allocation.align != 8192)
151361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        allocation.align = 8192;
151461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
151561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0) {
15168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Aligment(%u) failed with pmem driver Sz(%lu)",
151761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                allocation.align, allocation.size);
151861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return -1;
151961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
152061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
1521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
152261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf_addr = mmap(NULL, size,
152361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            PROT_READ | PROT_WRITE,
152461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            MAP_SHARED, pmem_fd, 0);
152561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
152661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buf_addr == (void*) MAP_FAILED) {
152761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close(pmem_fd);
152861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pmem_fd = -1;
15298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Error returned in allocating recon buffers buf_addr: %p",buf_addr);
15306eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
153161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
153261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ioctl(recon_buff[count].ion_device_fd,ION_IOC_FREE,
153361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    &recon_buff[count].alloc_data.handle)) {
153461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("ion recon buffer free failed");
153561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
153661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
153761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        recon_buff[count].alloc_data.handle = NULL;
153861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        recon_buff[count].ion_alloc_fd.fd =-1;
153961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close(recon_buff[count].ion_device_fd);
154061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        recon_buff[count].ion_device_fd =-1;
15416eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
154261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return -1;
154361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
15458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("Allocated virt:%p, FD: %d of size %d", buf_addr, pmem_fd, size);
1546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
154761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    recon_addr.buffer_size = size;
154861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    recon_addr.pmem_fd = pmem_fd;
154961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    recon_addr.offset = 0;
155061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    recon_addr.pbuffer = (unsigned char *)buf_addr;
1551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
155261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&recon_addr;
155361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
1554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
155561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_RECON_BUFFER, (void*)&ioctl_msg) < 0) {
15568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Failed to set the Recon_buffers");
155761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return -1;
155861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
156061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    recon_buff[count].virtual_address = (unsigned char *) buf_addr;
156161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    recon_buff[count].size = size;
156261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    recon_buff[count].offset = 0;
156361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    recon_buff[count].pmem_fd = pmem_fd;
1564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
15658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_ERROR("Allocated virt:%p, FD: %d of size %d at index: %d", recon_buff[count].virtual_address,
156661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            recon_buff[count].pmem_fd, recon_buff[count].size, count);
156761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return 0;
1568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 venc_dev::pmem_free()
1571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
157261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int cnt = 0;
157361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_ioctl_msg ioctl_msg;
157461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_recon_addr recon_addr;
157561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
157661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (cnt = 0; cnt < recon_buffers_count; cnt++) {
157761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (recon_buff[cnt].pmem_fd) {
157861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            recon_addr.pbuffer = recon_buff[cnt].virtual_address;
157961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            recon_addr.offset = recon_buff[cnt].offset;
158061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            recon_addr.pmem_fd = recon_buff[cnt].pmem_fd;
158161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            recon_addr.buffer_size = recon_buff[cnt].size;
158261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ioctl_msg.in = (void*)&recon_addr;
158361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ioctl_msg.out = NULL;
158461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
158561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(m_nDriver_fd, VEN_IOCTL_FREE_RECON_BUFFER ,&ioctl_msg) < 0)
158661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("VEN_IOCTL_FREE_RECON_BUFFER failed");
158761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
158861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            munmap(recon_buff[cnt].virtual_address, recon_buff[cnt].size);
158961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            close(recon_buff[cnt].pmem_fd);
1590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
159161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
159261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(recon_buff[cnt].ion_device_fd,ION_IOC_FREE,
159361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        &recon_buff[cnt].alloc_data.handle)) {
159461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("ion recon buffer free failed");
159561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
159661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
159761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            recon_buff[cnt].alloc_data.handle = NULL;
159861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            recon_buff[cnt].ion_alloc_fd.fd =-1;
159961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            close(recon_buff[cnt].ion_device_fd);
160061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            recon_buff[cnt].ion_device_fd =-1;
1601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
16028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("cleaning Index %d of size %d",cnt,recon_buff[cnt].size);
160361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            recon_buff[cnt].pmem_fd = -1;
160461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            recon_buff[cnt].virtual_address = NULL;
160561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            recon_buff[cnt].offset = 0;
160661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            recon_buff[cnt].alignment = 0;
160761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            recon_buff[cnt].size = 0;
160861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
160961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
161061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
161161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return 0;
1612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid venc_dev::venc_config_print()
1616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
16188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("ENC_CONFIG: Codec: %d, Profile %d, level : %d",
161961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_sVenc_cfg.codectype, codec_profile.profile, profile_level.level);
1620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
16218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("ENC_CONFIG: Width: %d, Height:%d, Fps: %d",
162261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_sVenc_cfg.input_width, m_sVenc_cfg.input_height,
162361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_sVenc_cfg.fps_num/m_sVenc_cfg.fps_den);
1624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
16258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("ENC_CONFIG: Bitrate: %d, RC: %d, I-Period: %d",
162661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bitrate.target_bitrate, rate_ctrl.rcmode, intra_period.num_pframes);
1627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
16288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("ENC_CONFIG: qpI: %d, qpP: %d, qpb: 0",
162961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            session_qp.iframeqp, session_qp.pframqp);
1630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
16318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("ENC_CONFIG: minQP: %d, maxQP: %d",
163261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            qp_range.minqp, qp_range.maxqp);
16336eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
16348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("ENC_CONFIG: VOP_Resolution: %d, Slice-Mode: %d, Slize_Size: %d",
163561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            voptimecfg.voptime_resolution, multislice.mslice_mode,
163661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            multislice.mslice_size);
1637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
16388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("ENC_CONFIG: EntropyMode: %d, CabacModel: %d",
163961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            entropy.longentropysel, entropy.cabacmodel);
1640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
16418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("ENC_CONFIG: DB-Mode: %d, alpha: %d, Beta: %d",
164261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dbkfilter.db_mode, dbkfilter.slicealpha_offset,
164361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dbkfilter.slicebeta_offset);
1644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
16458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("ENC_CONFIG: IntraMB/Frame: %d, HEC: %d",
164661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            intra_refresh.mbcount, hec.header_extension);
164747e37c4428509524ee576920a98381f3e4872493Nick Pelly}
164847e37c4428509524ee576920a98381f3e4872493Nick Pelly
164947e37c4428509524ee576920a98381f3e4872493Nick Pellyunsigned venc_dev::venc_flush( unsigned port)
165047e37c4428509524ee576920a98381f3e4872493Nick Pelly{
165161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_ioctl_msg ioctl_msg;
165261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_bufferflush buffer_index;
165347e37c4428509524ee576920a98381f3e4872493Nick Pelly
165461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == PORT_INDEX_IN) {
165561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("Calling Input Flush");
165661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer_index.flush_mode = VEN_FLUSH_INPUT;
165761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.in = (void*)&buffer_index;
165861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.out = NULL;
165961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
166061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return ioctl (m_nDriver_fd,VEN_IOCTL_CMD_FLUSH,(void*)&ioctl_msg);
166161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (port == PORT_INDEX_OUT) {
166261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("Calling Output Flush");
166361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer_index.flush_mode = VEN_FLUSH_OUTPUT;
166461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.in = (void*)&buffer_index;
166561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.out = NULL;
166661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return ioctl (m_nDriver_fd,VEN_IOCTL_CMD_FLUSH,(void*)&ioctl_msg);
166761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
166861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return -1;
166961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
167047e37c4428509524ee576920a98381f3e4872493Nick Pelly}
167147e37c4428509524ee576920a98381f3e4872493Nick Pelly
167247e37c4428509524ee576920a98381f3e4872493Nick Pelly//allocating I/P memory from pmem and register with the device
167347e37c4428509524ee576920a98381f3e4872493Nick Pelly
167447e37c4428509524ee576920a98381f3e4872493Nick Pelly
1675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_use_buf(void *buf_addr, unsigned port,unsigned)
167647e37c4428509524ee576920a98381f3e4872493Nick Pelly{
167761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
167861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct pmem *pmem_tmp;
167961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_bufferpayload dev_buffer = {0};
168061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_allocatorproperty buff_alloc_property = {0};
168147e37c4428509524ee576920a98381f3e4872493Nick Pelly
168261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_tmp = (struct pmem *)buf_addr;
168347e37c4428509524ee576920a98381f3e4872493Nick Pelly
16848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("venc_use_buf:: pmem_tmp = %p", pmem_tmp);
168547e37c4428509524ee576920a98381f3e4872493Nick Pelly
168661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == PORT_INDEX_IN) {
168761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
168861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.fd  = pmem_tmp->fd;
168961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.maped_size = pmem_tmp->size;
169061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.sz = pmem_tmp->size;
169161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.offset = pmem_tmp->offset;
169247e37c4428509524ee576920a98381f3e4872493Nick Pelly
169361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((m_sVenc_cfg.input_height %16 !=0) || (m_sVenc_cfg.input_width%16 != 0)) {
169461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            unsigned long ht = m_sVenc_cfg.input_height;
169561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            unsigned long wd = m_sVenc_cfg.input_width;
169661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            unsigned int luma_size, luma_size_2k;
1697120b7e44bc2419b5f9f03bc2af39c92d134189b7Ajay Dudani
169861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ht = (ht + 15) & ~15;
169961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            wd = (wd + 15) & ~15;
1700120b7e44bc2419b5f9f03bc2af39c92d134189b7Ajay Dudani
170161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            luma_size = ht * wd;
170261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            luma_size_2k = (luma_size + 2047) & ~2047;
1703120b7e44bc2419b5f9f03bc2af39c92d134189b7Ajay Dudani
170461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dev_buffer.sz = luma_size_2k + ((luma_size/2 + 2047) & ~2047);
17052fd0565a057f63bff8abca2a4a5ce2a77a004fe8Haynes Mathew George#ifdef USE_ION
170661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ioctl_msg.in = NULL;
170761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ioctl_msg.out = (void*)&buff_alloc_property;
170861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
170961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl (m_nDriver_fd,VEN_IOCTL_GET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
17108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR: venc_use_buf:get input buffer failed ");
171161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return false;
171261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
171361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
171461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (buff_alloc_property.alignment < 4096) {
171561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                dev_buffer.sz = ((dev_buffer.sz + 4095) & ~4095);
171661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
171761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                dev_buffer.sz = ((dev_buffer.sz + (buff_alloc_property.alignment - 1)) &
171861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ~(buff_alloc_property.alignment - 1));
171961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
172061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
17212fd0565a057f63bff8abca2a4a5ce2a77a004fe8Haynes Mathew George#endif
172261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dev_buffer.maped_size = dev_buffer.sz;
172361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
1724120b7e44bc2419b5f9f03bc2af39c92d134189b7Ajay Dudani
172561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.in  = (void*)&dev_buffer;
172661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.out = NULL;
17272fd0565a057f63bff8abca2a4a5ce2a77a004fe8Haynes Mathew George
17288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("venc_use_buf:pbuffer = %x,fd = %x, offset = %d, maped_size = %d", \
172947e37c4428509524ee576920a98381f3e4872493Nick Pelly                dev_buffer.pbuffer, \
173047e37c4428509524ee576920a98381f3e4872493Nick Pelly                dev_buffer.fd, \
173147e37c4428509524ee576920a98381f3e4872493Nick Pelly                dev_buffer.offset, \
173247e37c4428509524ee576920a98381f3e4872493Nick Pelly                dev_buffer.maped_size);
173347e37c4428509524ee576920a98381f3e4872493Nick Pelly
173461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_INPUT_BUFFER,&ioctl_msg) < 0) {
17358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: venc_use_buf:set input buffer failed ");
173661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
173761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
173861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (port == PORT_INDEX_OUT) {
173961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
174061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.fd  = pmem_tmp->fd;
174161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.sz = pmem_tmp->size;
174261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.maped_size = pmem_tmp->size;
174361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.offset = pmem_tmp->offset;
174461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.in  = (void*)&dev_buffer;
174561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.out = NULL;
174647e37c4428509524ee576920a98381f3e4872493Nick Pelly
17478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("venc_use_buf:pbuffer = %x,fd = %x, offset = %d, maped_size = %d", \
174847e37c4428509524ee576920a98381f3e4872493Nick Pelly                dev_buffer.pbuffer, \
174947e37c4428509524ee576920a98381f3e4872493Nick Pelly                dev_buffer.fd, \
175047e37c4428509524ee576920a98381f3e4872493Nick Pelly                dev_buffer.offset, \
175147e37c4428509524ee576920a98381f3e4872493Nick Pelly                dev_buffer.maped_size);
175247e37c4428509524ee576920a98381f3e4872493Nick Pelly
175361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_OUTPUT_BUFFER,&ioctl_msg) < 0) {
17548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: venc_use_buf:set output buffer failed ");
175561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
175661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
175761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
17588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: venc_use_buf:Invalid Port Index ");
175961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
176047e37c4428509524ee576920a98381f3e4872493Nick Pelly    }
176147e37c4428509524ee576920a98381f3e4872493Nick Pelly
176261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
176347e37c4428509524ee576920a98381f3e4872493Nick Pelly}
176447e37c4428509524ee576920a98381f3e4872493Nick Pelly
176547e37c4428509524ee576920a98381f3e4872493Nick Pellybool venc_dev::venc_free_buf(void *buf_addr, unsigned port)
176647e37c4428509524ee576920a98381f3e4872493Nick Pelly{
176761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
176861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct pmem *pmem_tmp;
176961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_bufferpayload dev_buffer = {0};
177061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
177161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_tmp = (struct pmem *)buf_addr;
177247e37c4428509524ee576920a98381f3e4872493Nick Pelly
17738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("venc_use_buf:: pmem_tmp = %p", pmem_tmp);
177461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
177561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == PORT_INDEX_IN) {
177661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
177761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.fd  = pmem_tmp->fd;
177861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.maped_size = pmem_tmp->size;
177961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.sz = pmem_tmp->size;
178061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.offset = pmem_tmp->offset;
178161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.in  = (void*)&dev_buffer;
178261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.out = NULL;
178361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
17848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("venc_free_buf:pbuffer = %x,fd = %x, offset = %d, maped_size = %d", \
178547e37c4428509524ee576920a98381f3e4872493Nick Pelly                dev_buffer.pbuffer, \
178647e37c4428509524ee576920a98381f3e4872493Nick Pelly                dev_buffer.fd, \
178747e37c4428509524ee576920a98381f3e4872493Nick Pelly                dev_buffer.offset, \
178847e37c4428509524ee576920a98381f3e4872493Nick Pelly                dev_buffer.maped_size);
178947e37c4428509524ee576920a98381f3e4872493Nick Pelly
179061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ioctl (m_nDriver_fd,VEN_IOCTL_CMD_FREE_INPUT_BUFFER,&ioctl_msg) < 0) {
17918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: venc_free_buf: free input buffer failed ");
179261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
179361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
179461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (port == PORT_INDEX_OUT) {
179561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
179661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.fd  = pmem_tmp->fd;
179761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.sz = pmem_tmp->size;
179861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.maped_size = pmem_tmp->size;
179961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.offset = pmem_tmp->offset;
180061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.in  = (void*)&dev_buffer;
180161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.out = NULL;
180247e37c4428509524ee576920a98381f3e4872493Nick Pelly
18038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("venc_free_buf:pbuffer = %x,fd = %x, offset = %d, maped_size = %d", \
180447e37c4428509524ee576920a98381f3e4872493Nick Pelly                dev_buffer.pbuffer, \
180547e37c4428509524ee576920a98381f3e4872493Nick Pelly                dev_buffer.fd, \
180647e37c4428509524ee576920a98381f3e4872493Nick Pelly                dev_buffer.offset, \
180747e37c4428509524ee576920a98381f3e4872493Nick Pelly                dev_buffer.maped_size);
180847e37c4428509524ee576920a98381f3e4872493Nick Pelly
180961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ioctl (m_nDriver_fd,VEN_IOCTL_CMD_FREE_OUTPUT_BUFFER,&ioctl_msg) < 0) {
18108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: venc_free_buf: free output buffer failed ");
181161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
181261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
181361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
18148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: venc_free_buf:Invalid Port Index ");
181561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
181647e37c4428509524ee576920a98381f3e4872493Nick Pelly    }
181747e37c4428509524ee576920a98381f3e4872493Nick Pelly
181861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
181947e37c4428509524ee576920a98381f3e4872493Nick Pelly}
182047e37c4428509524ee576920a98381f3e4872493Nick Pelly
1821c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavanbool venc_dev::venc_color_align(OMX_BUFFERHEADERTYPE *buffer,
1822c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan                OMX_U32 width, OMX_U32 height)
1823c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan{
1824c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan    DEBUG_PRINT_ERROR("%s not implemented!", __func__);
1825c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan    return OMX_ErrorUnsupportedSetting;
1826c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan}
1827c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan
1828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_empty_buf(void *buffer, void *pmem_data_buf,unsigned,unsigned)
182947e37c4428509524ee576920a98381f3e4872493Nick Pelly{
183061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_buffer frameinfo;
183161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct pmem *temp_buffer;
183261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_ioctl_msg ioctl_msg;
183361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct OMX_BUFFERHEADERTYPE *bufhdr;
183461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
183561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer == NULL) {
18368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: venc_etb: buffer is NULL");
183761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
183861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
183961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
184061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bufhdr = (OMX_BUFFERHEADERTYPE *)buffer;
184161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
18428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Input buffer length %d",bufhdr->nFilledLen);
184361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
184461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (pmem_data_buf) {
18458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Internal PMEM addr for i/p Heap UseBuf: %p", pmem_data_buf);
184661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.ptrbuffer = (OMX_U8 *)pmem_data_buf;
184761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
18488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Shared PMEM addr for i/p PMEM UseBuf/AllocateBuf: %p", bufhdr->pBuffer);
184961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.ptrbuffer = (OMX_U8 *)bufhdr->pBuffer;
185061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
185161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
185261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.clientdata = (void *) buffer;
185361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.sz = bufhdr->nFilledLen;
185461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.len = bufhdr->nFilledLen;
185561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.flags = bufhdr->nFlags;
185661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.offset = bufhdr->nOffset;
185761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.timestamp = bufhdr->nTimeStamp;
18588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("i/p TS = %u", (OMX_U32)frameinfo.timestamp);
185961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = &frameinfo;
186061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
186161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
186261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("DBG: i/p frameinfo: bufhdr->pBuffer = %p, ptrbuffer = %p, offset = %u, len = %u",
186361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufhdr->pBuffer, frameinfo.ptrbuffer, frameinfo.offset, frameinfo.len);
186461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
186561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(m_nDriver_fd,VEN_IOCTL_CMD_ENCODE_FRAME,&ioctl_msg) < 0) {
186661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Generate an async error and move to invalid state*/
186761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
186861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
186961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
18708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_debug.in_buffer_log) {
18718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        venc_input_log_buffers(bufhdr, pmem_data_bufr, frameinfo.len);
187261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
187361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
187461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
187547e37c4428509524ee576920a98381f3e4872493Nick Pelly}
1876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_fill_buf(void *buffer, void *pmem_data_buf,unsigned,unsigned)
187747e37c4428509524ee576920a98381f3e4872493Nick Pelly{
187861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
187961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct pmem *temp_buffer = NULL;
188061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_buffer  frameinfo;
188161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct OMX_BUFFERHEADERTYPE *bufhdr;
188261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
188361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer == NULL) {
188461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
188561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
188661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
188761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bufhdr = (OMX_BUFFERHEADERTYPE *)buffer;
188861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
188961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (pmem_data_buf) {
18908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Internal PMEM addr for o/p Heap UseBuf: %p", pmem_data_buf);
189161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.ptrbuffer = (OMX_U8 *)pmem_data_buf;
189261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
18938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Shared PMEM addr for o/p PMEM UseBuf/AllocateBuf: %p", bufhdr->pBuffer);
189461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.ptrbuffer = (OMX_U8 *)bufhdr->pBuffer;
189561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
189661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
189761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.clientdata = buffer;
189861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.sz = bufhdr->nAllocLen;
189961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.flags = bufhdr->nFlags;
190061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.offset = bufhdr->nOffset;
190161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
190261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = &frameinfo;
190361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
190461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("DBG: o/p frameinfo: bufhdr->pBuffer = %p, ptrbuffer = %p, offset = %u, len = %u",
190561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufhdr->pBuffer, frameinfo.ptrbuffer, frameinfo.offset, frameinfo.len);
190661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
190761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_CMD_FILL_OUTPUT_BUFFER,&ioctl_msg) < 0) {
19088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: ioctl VEN_IOCTL_CMD_FILL_OUTPUT_BUFFER failed");
190961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
191061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
191161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
191261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
1913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_slice_delivery_mode(OMX_BOOL enable)
1916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
191761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
191861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("Set slice_delivery_mode: %d", enable);
191961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
192061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (multislice.mslice_mode == VEN_MSLICE_CNT_MB) {
192161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ioctl(m_nDriver_fd, VEN_IOCTL_SET_SLICE_DELIVERY_MODE) < 0) {
192261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Request for setting slice delivery mode failed");
192361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
192461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
192561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
192661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("WARNING: slice_mode[%d] is not VEN_MSLICE_CNT_MB to set "
192761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "slice delivery mode to the driver.", multislice.mslice_mode);
192861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
192961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
193061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
1931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
19336eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool venc_dev::venc_set_plusptype(OMX_BOOL enable)
1934b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand{
193561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
193661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_plusptype plusptype = {0};
193761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Set plusptype: %d", enable);
193861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plusptype.plusptype_enable = enable;
193961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&plusptype;
194061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
194161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
194261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(m_nDriver_fd, VEN_IOCTL_SET_H263_PLUSPTYPE,(void*)&ioctl_msg) < 0) {
194361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Request for setting plusptype for h263 failed");
194461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
194561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
194661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
194761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
1948b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand}
1949b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand
19506eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool venc_dev::venc_set_ltrmode(QOMX_VIDEO_LTRMODETYPE mode)
1951b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand{
195261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
195361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ltrmode ltr_mode;
195461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ltr_mode.ltr_mode = (unsigned long)mode;
195561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("Set ltr mode: %d", mode);
195661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&ltr_mode;
195761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
195861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
195961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd, VEN_IOCTL_SET_LTRMODE, (void*)&ioctl_msg) < 0) {
196061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Setting ltrmode failed");
196161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
196261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
196361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
196461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ltrmode.ltr_mode = (unsigned long)mode;
196561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
19666eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
19676eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
19686eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool venc_dev::venc_set_ltrcount(OMX_U32 count)
19696eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
197061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
197161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ltrcount ltr_count;
197261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ltr_count.ltr_count = (unsigned long)count;
197361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("Set ltr count: %d", count);
197461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&ltr_count;
197561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
197661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
197761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd, VEN_IOCTL_SET_LTRCOUNT, (void*)&ioctl_msg) < 0) {
197861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Setting ltrcount failed");
197961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
198061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
198161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
198261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ltrcount.ltr_count = (unsigned long)count;
198361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
19846eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
19856eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
19866eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool venc_dev::venc_set_ltrperiod(OMX_U32 period)
19876eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
198861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
198961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ltrperiod ltr_period;
199061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ltr_period.ltr_period = (unsigned long)period;
199161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("Set ltr period: %d", period);
199261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&ltr_period;
199361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
199461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
199561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd, VEN_IOCTL_SET_LTRPERIOD, (void*)&ioctl_msg) < 0) {
199661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Setting ltrperiod failed");
199761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
199861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
199961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
200061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ltrperiod.ltr_period = (unsigned long)period;
200161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
20026eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
20036eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
20046eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool venc_dev::venc_set_ltruse(OMX_U32 id, OMX_U32 frames)
20056eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
200661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
200761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ltruse ltr_use;
200861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ltr_use.ltr_id = (unsigned long)id;
200961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ltr_use.ltr_frames = (unsigned long)frames;
201061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("Set ltr use: id = %d, ltr_frames = %d", id, frames);
201161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&ltr_use;
201261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
201361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
201461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd, VEN_IOCTL_SET_LTRUSE, (void*)&ioctl_msg) < 0) {
201561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Setting ltruse failed");
201661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
201761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
201861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
201961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
202061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
20213145f89c1398e32bb7fc6cc03866388f42d2bad3Deva Ramasubramanian
2022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_extradata(OMX_U32 extra_data)
2023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
202461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
202561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("venc_set_extradata:: %x", extra_data);
202661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&extra_data;
202761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
202861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
202961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd, VEN_IOCTL_SET_EXTRADATA, (void*)&ioctl_msg) < 0) {
203061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for setting extradata failed");
203161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
203261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
203361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
203461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
203547e37c4428509524ee576920a98381f3e4872493Nick Pelly}
203647e37c4428509524ee576920a98381f3e4872493Nick Pelly
203747e37c4428509524ee576920a98381f3e4872493Nick Pellybool venc_dev::venc_set_session_qp(OMX_U32 i_frame_qp, OMX_U32 p_frame_qp)
203847e37c4428509524ee576920a98381f3e4872493Nick Pelly{
203961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
204061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_sessionqp qp = {0, 0};
204161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("venc_set_session_qp:: i_frame_qp = %d, p_frame_qp = %d", i_frame_qp,
204261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            p_frame_qp);
204361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
204461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    qp.iframeqp = i_frame_qp;
204561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    qp.pframqp = p_frame_qp;
204661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
204761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&qp;
204861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
204961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
205061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_SESSION_QP,(void*)&ioctl_msg)< 0) {
20518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for setting session qp failed");
205261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
205361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
205461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
205561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    session_qp.iframeqp = i_frame_qp;
205661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    session_qp.pframqp = p_frame_qp;
205761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
205861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
205947e37c4428509524ee576920a98381f3e4872493Nick Pelly}
206047e37c4428509524ee576920a98381f3e4872493Nick Pelly
20616eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool venc_dev::venc_set_qp_range(OMX_U32 min_qp, OMX_U32 max_qp)
20626eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
206361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
206461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_qprange qp = {0, 0};
206561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("venc_set_qp_range:: min_qp = %d, max_qp = %d", min_qp,
206661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            max_qp);
206761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
206861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    qp.minqp = min_qp;
206961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    qp.maxqp = max_qp;
207061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
207161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&qp;
207261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
207361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
207461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_QP_RANGE,(void*)&ioctl_msg)< 0) {
20758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for setting qp range failed");
207661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
207761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
207861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
207961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    qp_range.minqp= min_qp;
208061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    qp_range.maxqp= max_qp;
208161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
208261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
20836eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
20846eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
208547e37c4428509524ee576920a98381f3e4872493Nick Pellybool venc_dev::venc_set_profile_level(OMX_U32 eProfile,OMX_U32 eLevel)
208647e37c4428509524ee576920a98381f3e4872493Nick Pelly{
208761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
208861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_profile requested_profile;
208961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct ven_profilelevel requested_level;
209061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned const int *profile_tbl = NULL;
209161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned long mb_per_frame = 0, mb_per_sec = 0;
209261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("venc_set_profile_level:: eProfile = %d, Level = %d",
209361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eProfile, eLevel);
209461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    mb_per_frame = ((m_sVenc_cfg.input_height + 15) >> 4)*
209561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ((m_sVenc_cfg.input_width + 15) >> 4);
209661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
209761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((eProfile == 0) && (eLevel == 0) && m_profile_set && m_level_set) {
209861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("Set profile/level was done already");
209961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return true;
210047e37c4428509524ee576920a98381f3e4872493Nick Pelly    }
210161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
210261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eProfile && eLevel) {
210361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /* non-zero values will be set by user, saving the same*/
210461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_eProfile = eProfile;
210561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_eLevel = eLevel;
210661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("Save profile/level (%d/%d) for max allowed bitrate check",
210761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_eProfile, m_eLevel);
210847e37c4428509524ee576920a98381f3e4872493Nick Pelly    }
210947e37c4428509524ee576920a98381f3e4872493Nick Pelly
211061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Validating Profile/Level from table");
211147e37c4428509524ee576920a98381f3e4872493Nick Pelly
211261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!venc_validate_profile_level(&eProfile, &eLevel)) {
21138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("ERROR: Profile/Level validation failed");
211461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
2115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
211661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
211761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_sVenc_cfg.codectype == VEN_CODEC_MPEG4) {
211861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("eProfile = %d, OMX_VIDEO_MPEG4ProfileSimple = %d and "
211961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "OMX_VIDEO_MPEG4ProfileAdvancedSimple = %d", eProfile,
212061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4ProfileAdvancedSimple);
212161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
212261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eProfile == OMX_VIDEO_MPEG4ProfileSimple) {
212361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            requested_profile.profile = VEN_PROFILE_MPEG4_SP;
212461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_tbl = (unsigned int const *)
212561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (&mpeg4_profile_level_table[MPEG4_SP_START]);
212661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_tbl += MPEG4_720P_LEVEL*5;
212761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple) {
212861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            requested_profile.profile = VEN_PROFILE_MPEG4_ASP;
212961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_tbl = (unsigned int const *)
213061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (&mpeg4_profile_level_table[MPEG4_ASP_START]);
213161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_tbl += MPEG4_720P_LEVEL*5;
213261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
21338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("ERROR: Unsupported MPEG4 profile = %u",
213461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eProfile);
213561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
2136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
213761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
213861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("eLevel = %d, OMX_VIDEO_MPEG4Level0 = %d, OMX_VIDEO_MPEG4Level1 = %d,"
213961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "OMX_VIDEO_MPEG4Level2 = %d, OMX_VIDEO_MPEG4Level3 = %d, OMX_VIDEO_MPEG4Level4 = %d,"
214061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "OMX_VIDEO_MPEG4Level5 = %d", eLevel, OMX_VIDEO_MPEG4Level0, OMX_VIDEO_MPEG4Level1,
214161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_MPEG4Level2, OMX_VIDEO_MPEG4Level3, OMX_VIDEO_MPEG4Level4, OMX_VIDEO_MPEG4Level5);
214261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
214361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (mb_per_frame >= 3600) {
214461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (requested_profile.profile == VEN_PROFILE_MPEG4_ASP)
214561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_MPEG4_5;
214661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
214761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (requested_profile.profile == VEN_PROFILE_MPEG4_SP)
214861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_MPEG4_6;
214961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
215061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            switch (eLevel) {
215161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_VIDEO_MPEG4Level0:
215261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    requested_level.level = VEN_LEVEL_MPEG4_0;
215361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
215461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_VIDEO_MPEG4Level1:
215561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    requested_level.level = VEN_LEVEL_MPEG4_1;
215661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
215761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_VIDEO_MPEG4Level2:
215861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    requested_level.level = VEN_LEVEL_MPEG4_2;
215961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
216061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_VIDEO_MPEG4Level3:
216161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    requested_level.level = VEN_LEVEL_MPEG4_3;
216261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
216361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_VIDEO_MPEG4Level4a:
216461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    requested_level.level = VEN_LEVEL_MPEG4_4;
216561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
216661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_VIDEO_MPEG4Level5:
216761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    mb_per_sec = mb_per_frame * (m_sVenc_cfg.fps_num / m_sVenc_cfg.fps_den);
216861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
216961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ((requested_profile.profile == VEN_PROFILE_MPEG4_SP) && (mb_per_frame >= profile_tbl[0]) &&
217061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (mb_per_sec >= profile_tbl[1])) {
21718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_LOW("MPEG4 Level 6 is set for 720p resolution");
217261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        requested_level.level = VEN_LEVEL_MPEG4_6;
217361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
21748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_LOW("MPEG4 Level 5 is set for non-720p resolution");
217561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        requested_level.level = VEN_LEVEL_MPEG4_5;
217661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
217761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
217861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
217961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                default:
218061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return false;
218161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    // TODO update corresponding levels for MPEG4_LEVEL_3b,MPEG4_LEVEL_6
218261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
218361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
218461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
218561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_sVenc_cfg.codectype == VEN_CODEC_H263) {
218661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eProfile == OMX_VIDEO_H263ProfileBaseline) {
218761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            requested_profile.profile = VEN_PROFILE_H263_BASELINE;
218861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
21898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("ERROR: Unsupported H.263 profile = %u",
219061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    requested_profile.profile);
219161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
219261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
219361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
219461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        //profile level
219561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (eLevel) {
219661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263Level10:
219761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H263_10;
219861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
219961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263Level20:
220061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H263_20;
220161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
220261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263Level30:
220361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H263_30;
220461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
220561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263Level40:
220661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H263_40;
220761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
220861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263Level45:
220961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H263_45;
221061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
221161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263Level50:
221261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H263_50;
221361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
221461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263Level60:
221561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H263_60;
221661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
221761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263Level70:
221861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H263_70;
221961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
222061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default:
222161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return false;
222261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
222361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
222461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_sVenc_cfg.codectype == VEN_CODEC_H264) {
222561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eProfile == OMX_VIDEO_AVCProfileBaseline) {
222661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            requested_profile.profile = VEN_PROFILE_H264_BASELINE;
222761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (eProfile == OMX_VIDEO_AVCProfileMain) {
222861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            requested_profile.profile = VEN_PROFILE_H264_MAIN;
222961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (eProfile == OMX_VIDEO_AVCProfileHigh) {
223061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            requested_profile.profile = VEN_PROFILE_H264_HIGH;
223161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
22328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("ERROR: Unsupported H.264 profile = %u",
223361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    requested_profile.profile);
223461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
223561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
223661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
223761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        //profile level
223861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (eLevel) {
223961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel1:
224061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H264_1;
224161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
224261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel1b:
224361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H264_1b;
224461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
224561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel11:
224661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H264_1p1;
224761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
224861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel12:
224961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H264_1p2;
225061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
225161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel13:
225261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H264_1p3;
225361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
225461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel2:
225561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H264_2;
225661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
225761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel21:
225861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H264_2p1;
225961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
226061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel22:
226161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H264_2p2;
226261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
226361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel3:
226461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H264_3;
226561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
226661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel31:
226761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H264_3p1;
226861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
226961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel32:
227061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H264_3p2;
227161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
227261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel4:
227361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H264_4;
227461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
227561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default :
22768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR: Unsupported H.264 level= %u",
227761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        requested_level.level);
227861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return false;
227961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
2280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
228147e37c4428509524ee576920a98381f3e4872493Nick Pelly    }
228261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
228361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_profile_set) {
228461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.in = (void*)&requested_profile;
228561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.out = NULL;
228661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
228761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_CODEC_PROFILE,(void*)&ioctl_msg)< 0) {
22888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: Request for setting profile failed");
228961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
229061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
229161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
229261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_profile.profile = requested_profile.profile;
229361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_profile_set = true;
229461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("Set codec profile = 0x%x", codec_profile.profile);
229547e37c4428509524ee576920a98381f3e4872493Nick Pelly    }
229661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
229761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_level_set) {
229861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.in = (void*)&requested_level;
229961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.out = NULL;
230061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
230161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_PROFILE_LEVEL,(void*)&ioctl_msg)< 0) {
23028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: Request for setting profile level failed");
230361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
230461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
230561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
230661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        profile_level.level = requested_level.level;
230761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_level_set = true;
230861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("Set codec level = 0x%x", profile_level.level);
230947e37c4428509524ee576920a98381f3e4872493Nick Pelly    }
231047e37c4428509524ee576920a98381f3e4872493Nick Pelly
231161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
231247e37c4428509524ee576920a98381f3e4872493Nick Pelly}
231347e37c4428509524ee576920a98381f3e4872493Nick Pelly
2314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_voptiming_cfg( OMX_U32 TimeIncRes)
2315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
231661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
231761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_voptimingcfg vop_timing_cfg;
2318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
231961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("venc_set_voptiming_cfg: TimeRes = %u",
232061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            TimeIncRes);
2321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
232261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    vop_timing_cfg.voptime_resolution = TimeIncRes;
2323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
232461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&vop_timing_cfg;
232561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
2326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
232761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_VOP_TIMING_CFG,(void*)&ioctl_msg)< 0) {
23288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for setting Vop Timing failed");
232961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
233061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
233161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
233261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    voptimecfg.voptime_resolution = vop_timing_cfg.voptime_resolution;
233361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
2334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_intra_period(OMX_U32 nPFrames, OMX_U32 nBFrames)
233747e37c4428509524ee576920a98381f3e4872493Nick Pelly{
233861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
233961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_intraperiod intraperiod_cfg;
234061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
234161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("venc_set_intra_period: nPFrames = %u",
234261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nPFrames);
234361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    intraperiod_cfg.num_pframes = nPFrames;
234461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
234561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((codec_profile.profile == VEN_PROFILE_MPEG4_ASP) ||
234661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (codec_profile.profile == VEN_PROFILE_H264_MAIN) ||
234761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (codec_profile.profile == VEN_PROFILE_H264_HIGH)) {
2348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
234961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
235061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (nBFrames) {
235161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
235261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            intraperiod_cfg.num_bframes = 1;
235361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else
235461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            intraperiod_cfg.num_bframes = 0;
235561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
2356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
235761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
235861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (nBFrames) {
235961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("B frames not supported");
236061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            intraperiod_cfg.num_bframes = 0;
236161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
236261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("B frames not supported");
236361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            intraperiod_cfg.num_bframes = 0;
236461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
236561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
2366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
236761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else
236861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        intraperiod_cfg.num_bframes = 0;
236961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
237061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("venc_set_intra_period: nPFrames = %u nBFrames = %u",
237161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            intraperiod_cfg.num_pframes, intraperiod_cfg.num_bframes);
237261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&intraperiod_cfg;
237361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
237461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
237561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_INTRA_PERIOD,(void*)&ioctl_msg)< 0) {
23768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for setting intra period failed");
237761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
237861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
237961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
238061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    intra_period.num_pframes = intraperiod_cfg.num_pframes;
238161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    intra_period.num_bframes = intraperiod_cfg.num_bframes;
238261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
238347e37c4428509524ee576920a98381f3e4872493Nick Pelly}
238447e37c4428509524ee576920a98381f3e4872493Nick Pelly
2385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_entropy_config(OMX_BOOL enable, OMX_U32 i_cabac_level)
238647e37c4428509524ee576920a98381f3e4872493Nick Pelly{
238761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
238861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_entropycfg entropy_cfg;
238947e37c4428509524ee576920a98381f3e4872493Nick Pelly
239061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&entropy_cfg,0,sizeof(entropy_cfg));
23918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("venc_set_entropy_config: CABAC = %u level: %u", enable, i_cabac_level);
239261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
239361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (enable &&(codec_profile.profile != VEN_PROFILE_H264_BASELINE)) {
239461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        entropy_cfg.longentropysel = VEN_ENTROPY_MODEL_CABAC;
239561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
239661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (i_cabac_level == 0) {
239761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            entropy_cfg.cabacmodel = VEN_CABAC_MODEL_0;
239861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
2399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
240161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else {
240261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_HIGH("Invalid model set (%d) defaulting to  model 0",i_cabac_level);
240361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            entropy_cfg.cabacmodel = VEN_CABAC_MODEL_0;
240461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
240561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
2406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
240761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else if (i_cabac_level == 1) {
240861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            entropy_cfg.cabacmodel = VEN_CABAC_MODEL_1;
240961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (i_cabac_level == 2) {
241061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            entropy_cfg.cabacmodel = VEN_CABAC_MODEL_2;
241161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
241261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
2413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
241461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!enable) {
241561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        entropy_cfg.longentropysel = VEN_ENTROPY_MODEL_CAVLC;
241661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
24178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid Entropy mode for Baseline Profile");
241861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
241961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
242061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
242161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&entropy_cfg;
242261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
242361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
242461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_ENTROPY_CFG,(void*)&ioctl_msg)< 0) {
24258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for setting entropy config failed");
242661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
242761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
242861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
242961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    entropy.longentropysel = entropy_cfg.longentropysel;
243061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    entropy.cabacmodel  = entropy_cfg.cabacmodel;
243161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
243247e37c4428509524ee576920a98381f3e4872493Nick Pelly}
243347e37c4428509524ee576920a98381f3e4872493Nick Pelly
2434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_multislice_cfg(OMX_INDEXTYPE Codec, OMX_U32 nSlicesize) // MB
243547e37c4428509524ee576920a98381f3e4872493Nick Pelly{
243661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL, NULL};
243761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
243861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_multiclicecfg multislice_cfg;
243961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
244061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((Codec != OMX_IndexParamVideoH263)  && (nSlicesize)) {
244161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice_cfg.mslice_mode = VEN_MSLICE_CNT_MB;
244261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice_cfg.mslice_size = nSlicesize;
244361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
244461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice_cfg.mslice_mode = VEN_MSLICE_OFF;
244561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice_cfg.mslice_size = 0;
244661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
244761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
24488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("%s(): mode = %u, size = %u", __func__, multislice_cfg.mslice_mode,
244961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            multislice_cfg.mslice_size);
245061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
245161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&multislice_cfg;
245261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
245361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
245461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd, VEN_IOCTL_SET_MULTI_SLICE_CFG,(void*)&ioctl_msg) < 0) {
24558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for setting multi-slice cfg failed");
245661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        status = false;
245761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
245861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice.mslice_mode = multislice_cfg.mslice_mode;
245961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice.mslice_size = nSlicesize;
246061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
246161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
246261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
2463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_intra_refresh(OMX_VIDEO_INTRAREFRESHTYPE ir_mode, OMX_U32 irMBs)
2466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
246761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL, NULL};
246861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
246961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_intrarefresh intraRefresh_cfg;
247061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
247161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // There is no disabled mode.  Disabled mode is indicated by a 0 count.
247261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (irMBs == 0 || ir_mode == OMX_VIDEO_IntraRefreshMax) {
247361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        intraRefresh_cfg.irmode = VEN_IR_OFF;
247461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        intraRefresh_cfg.mbcount = 0;
247561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if ((ir_mode == OMX_VIDEO_IntraRefreshCyclic) &&
247661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (irMBs < ((m_sVenc_cfg.input_width * m_sVenc_cfg.input_height)>>8))) {
247761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        intraRefresh_cfg.irmode = VEN_IR_CYCLIC;
247861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        intraRefresh_cfg.mbcount = irMBs;
247961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
24808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Invalid IntraRefresh Parameters:"
248161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "mb count: %d, mb mode:%d", irMBs, ir_mode);
248261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
248361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
248461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
248561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&intraRefresh_cfg;
248661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
248761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
248861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_INTRA_REFRESH,(void*)&ioctl_msg) < 0) {
24898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for setting Intra Refresh failed");
249061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        status = false;
249161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
249261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        intra_refresh.irmode = intraRefresh_cfg.irmode;
249361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        intra_refresh.mbcount = intraRefresh_cfg.mbcount;
249461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
249561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
249661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
2497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_error_resilience(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* error_resilience)
2500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
250161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL, NULL};
250261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
250361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_headerextension hec_cfg;
250461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_multiclicecfg multislice_cfg;
250561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
250661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_sVenc_cfg.codectype == OMX_VIDEO_CodingMPEG4) {
250761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (error_resilience->bEnableHEC) {
250861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            hec_cfg.header_extension = 1;
250961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
251061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            hec_cfg.header_extension = 0;
251161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
251261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
251361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.in = (void*)&hec_cfg;
251461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.out = NULL;
251561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
251661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_HEC,(void*)&ioctl_msg) < 0) {
25178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: Request for setting HEader Error correction failed");
251861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
251961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
252061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
252161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        hec.header_extension = error_resilience->bEnableHEC;
252261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
252361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
252461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (error_resilience->bEnableRVLC) {
25258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("RVLC is not Supported");
252661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
252761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
252861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
252961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (( m_sVenc_cfg.codectype != OMX_VIDEO_CodingH263) &&
253061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (error_resilience->bEnableDataPartitioning)) {
25318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("DataPartioning are not Supported for MPEG4/H264");
253261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
253361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
253461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
253561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (( m_sVenc_cfg.codectype != OMX_VIDEO_CodingH263) &&
2536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            (error_resilience->nResynchMarkerSpacing)) {
253761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice_cfg.mslice_mode = VEN_MSLICE_CNT_BYTE;
253861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice_cfg.mslice_size = error_resilience->nResynchMarkerSpacing;
253961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_sVenc_cfg.codectype == OMX_VIDEO_CodingH263 &&
2540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            error_resilience->bEnableDataPartitioning) {
254161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice_cfg.mslice_mode = VEN_MSLICE_GOB;
254261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice_cfg.mslice_size = 0;
254361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
2544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        multislice_cfg.mslice_mode = VEN_MSLICE_OFF;
2545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        multislice_cfg.mslice_size = 0;
254661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
254761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
25488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("%s(): mode = %u, size = %u", __func__, multislice_cfg.mslice_mode,
254961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            multislice_cfg.mslice_size);
255061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&multislice_cfg;
255161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
255261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
255361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_MULTI_SLICE_CFG,(void*)&ioctl_msg) < 0) {
25548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for setting multi-slice cfg failed");
255561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        status = false;
255661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
255761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice.mslice_mode = multislice_cfg.mslice_mode ;
255861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice.mslice_size = multislice_cfg.mslice_size;
255961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
256061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
256161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
256261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
2563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_inloop_filter(OMX_VIDEO_AVCLOOPFILTERTYPE loopfilter)
2566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
256761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
256861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_dbcfg filter_cfg;
256961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
257061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&filter_cfg, 0, sizeof(filter_cfg));
25718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("venc_set_inloop_filter: %u",loopfilter);
257261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
257361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (loopfilter == OMX_VIDEO_AVCLoopFilterEnable) {
257461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        filter_cfg.db_mode = VEN_DB_ALL_BLKG_BNDRY;
257561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (loopfilter == OMX_VIDEO_AVCLoopFilterDisable) {
257661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        filter_cfg.db_mode = VEN_DB_DISABLE;
257761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (loopfilter == OMX_VIDEO_AVCLoopFilterDisableSliceBoundary) {
257861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        filter_cfg.db_mode = VEN_DB_SKIP_SLICE_BNDRY;
257961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
258061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
258161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    filter_cfg.slicealpha_offset = filter_cfg.slicebeta_offset = 0;
258261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
258361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&filter_cfg;
258461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
258561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
258661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_DEBLOCKING_CFG,(void*)&ioctl_msg)< 0) {
25878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for setting inloop filter failed");
258861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
258961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
259061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
259161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    dbkfilter.db_mode = filter_cfg.db_mode;
259261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    dbkfilter.slicealpha_offset = dbkfilter.slicebeta_offset = 0;
259361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
2594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_target_bitrate(OMX_U32 nTargetBitrate, OMX_U32 config)
2597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
259861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL, NULL};
259961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_targetbitrate bitrate_cfg;
260061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
260161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("venc_set_target_bitrate: bitrate = %u",
260261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nTargetBitrate);
260361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bitrate_cfg.target_bitrate = nTargetBitrate ;
260461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&bitrate_cfg;
260561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
260661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
260761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_TARGET_BITRATE,(void*)&ioctl_msg) < 0) {
26088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for setting bit rate failed");
260961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
2610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
261161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
261261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.targetbitrate = nTargetBitrate;
261361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bitrate.target_bitrate = nTargetBitrate;
261461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
261561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!config) {
261661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_level_set = false;
261761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
261861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (venc_set_profile_level(0, 0)) {
26198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Calling set level (Bitrate) with %d",profile_level.level);
262061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
262161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
262261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
262361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
2624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_encode_framerate(OMX_U32 encode_framerate, OMX_U32 config)
2627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
262861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL, NULL};
262961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_framerate frame_rate_cfg;
263061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
263161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    Q16ToFraction(encode_framerate,frame_rate_cfg.fps_numerator,frame_rate_cfg.fps_denominator);
263261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
263361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("venc_set_encode_framerate: framerate(Q16) = %u, NR: %d, DR: %d",
263461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            encode_framerate,frame_rate_cfg.fps_numerator,frame_rate_cfg.fps_denominator);
263561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
263661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&frame_rate_cfg;
263761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
263861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
263961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(m_nDriver_fd, VEN_IOCTL_SET_FRAME_RATE,
264061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (void*)&ioctl_msg) < 0) {
26418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for setting framerate failed");
264261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
2643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
264461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
264561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.fps_den = frame_rate_cfg.fps_denominator;
264661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.fps_num = frame_rate_cfg.fps_numerator;
264761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
264861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!config) {
264961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_level_set = false;
265061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
265161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (venc_set_profile_level(0, 0)) {
265261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("Calling set level (Framerate) with %d",profile_level.level);
265361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
265461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
265561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
265661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
265747e37c4428509524ee576920a98381f3e4872493Nick Pelly}
265847e37c4428509524ee576920a98381f3e4872493Nick Pelly
265947e37c4428509524ee576920a98381f3e4872493Nick Pellybool venc_dev::venc_set_color_format(OMX_COLOR_FORMATTYPE color_format)
266047e37c4428509524ee576920a98381f3e4872493Nick Pelly{
266161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL, NULL};
266261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
266361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (color_format == OMX_COLOR_FormatYUV420SemiPlanar) {
2664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
266561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sVenc_cfg.inputformat= VEN_INPUTFMT_NV12_16M2KA;
2666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
266761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sVenc_cfg.inputformat = VEN_INPUTFMT_NV12;
2668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
266961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
26708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("WARNING: Unsupported Color format [%d]", color_format);
2671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
267261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sVenc_cfg.inputformat= VEN_INPUTFMT_NV12_16M2KA;
2673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
267461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sVenc_cfg.inputformat = VEN_INPUTFMT_NV12;
2675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
26768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Default color format YUV420SemiPlanar is set");
267761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
267861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
267961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&m_sVenc_cfg;
268061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
268161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
268261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(m_nDriver_fd, VEN_IOCTL_SET_BASE_CFG, (void*)&ioctl_msg) < 0) {
26838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for setting color format failed");
268461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
268561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
268661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
268761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
268847e37c4428509524ee576920a98381f3e4872493Nick Pelly}
268947e37c4428509524ee576920a98381f3e4872493Nick Pelly
269047e37c4428509524ee576920a98381f3e4872493Nick Pellybool venc_dev::venc_set_intra_vop_refresh(OMX_BOOL intra_vop_refresh)
269147e37c4428509524ee576920a98381f3e4872493Nick Pelly{
26928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("venc_set_intra_vop_refresh: intra_vop = %uc", intra_vop_refresh);
269361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
269461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (intra_vop_refresh == OMX_TRUE) {
269561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ioctl(m_nDriver_fd, VEN_IOCTL_CMD_REQUEST_IFRAME, NULL) < 0) {
26968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: Request for setting Intra VOP Refresh failed");
269761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
269861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
269961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
27008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: VOP Refresh is False, no effect");
270161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
270261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
270361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
270447e37c4428509524ee576920a98381f3e4872493Nick Pelly}
270547e37c4428509524ee576920a98381f3e4872493Nick Pelly
270647e37c4428509524ee576920a98381f3e4872493Nick Pellybool venc_dev::venc_set_ratectrl_cfg(OMX_VIDEO_CONTROLRATETYPE eControlRate)
270747e37c4428509524ee576920a98381f3e4872493Nick Pelly{
270861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
270961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
271061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_ratectrlcfg ratectrl_cfg;
271161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
271261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //rate control
271361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch (eControlRate) {
271461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_Video_ControlRateDisable:
271561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ratectrl_cfg.rcmode = VEN_RC_OFF;
271661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
271761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_Video_ControlRateVariableSkipFrames:
271861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ratectrl_cfg.rcmode = VEN_RC_VBR_VFR;
271961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
272061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_Video_ControlRateVariable:
272161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ratectrl_cfg.rcmode = VEN_RC_VBR_CFR;
272261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
272361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_Video_ControlRateConstantSkipFrames:
272461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ratectrl_cfg.rcmode = VEN_RC_CBR_VFR;
272561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
272661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_Video_ControlRateConstant:
272761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ratectrl_cfg.rcmode = VEN_RC_CBR_CFR;
272861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
272961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
273061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = false;
273161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
273247e37c4428509524ee576920a98381f3e4872493Nick Pelly    }
273361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
273461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (status) {
273561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.in = (void*)&ratectrl_cfg;
273661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.out = NULL;
273761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
273861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_RATE_CTRL_CFG,(void*)&ioctl_msg) < 0) {
27398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: Request for setting rate control failed");
274061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = false;
274161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else
274261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            rate_ctrl.rcmode = ratectrl_cfg.rcmode;
274361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
274461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
274561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
274647e37c4428509524ee576920a98381f3e4872493Nick Pelly}
274747e37c4428509524ee576920a98381f3e4872493Nick Pelly
274847e37c4428509524ee576920a98381f3e4872493Nick Pellybool venc_dev::venc_get_profile_level(OMX_U32 *eProfile,OMX_U32 *eLevel)
274947e37c4428509524ee576920a98381f3e4872493Nick Pelly{
275061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
275161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
275261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eProfile == NULL || eLevel == NULL) {
275361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
275447e37c4428509524ee576920a98381f3e4872493Nick Pelly    }
275561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
275661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_sVenc_cfg.codectype == VEN_CODEC_MPEG4) {
275761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (codec_profile.profile) {
275861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_PROFILE_MPEG4_SP:
275961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
276061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
276161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_PROFILE_MPEG4_ASP:
276261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
276361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
276461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default:
276561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_MPEG4ProfileMax;
276661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                status = false;
276761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
276861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
276961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
277061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!status) {
277161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return status;
277261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
277361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
277461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        //profile level
277561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (profile_level.level) {
277661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_MPEG4_0:
277761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_MPEG4Level0;
277861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
277961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_MPEG4_1:
278061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_MPEG4Level1;
278161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
278261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_MPEG4_2:
278361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_MPEG4Level2;
278461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
278561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_MPEG4_3:
278661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_MPEG4Level3;
278761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
278861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_MPEG4_4:
278961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_MPEG4Level4a;
279061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
279161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_MPEG4_5:
279261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_MPEG4_6:
279361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_MPEG4Level5;
279461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
279561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default:
279661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_MPEG4LevelMax;
279761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                status =  false;
279861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
279961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
280061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_sVenc_cfg.codectype == VEN_CODEC_H263) {
280161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (codec_profile.profile == VEN_PROFILE_H263_BASELINE) {
280261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            *eProfile = OMX_VIDEO_H263ProfileBaseline;
280361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
280461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            *eProfile = OMX_VIDEO_H263ProfileMax;
280561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
280661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
280761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
280861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (profile_level.level) {
280961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H263_10:
281061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263Level10;
281161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
281261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H263_20:
281361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263Level20;
281461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
281561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H263_30:
281661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263Level30;
281761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
281861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H263_40:
281961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263Level40;
282061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
282161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H263_45:
282261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263Level45;
282361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
282461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H263_50:
282561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263Level50;
282661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
282761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H263_60:
282861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263Level60;
282961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
283061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H263_70:
283161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263Level70;
283261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
283361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default:
283461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263LevelMax;
283561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                status = false;
283661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
283761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
283861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_sVenc_cfg.codectype == VEN_CODEC_H264) {
283961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (codec_profile.profile) {
284061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_PROFILE_H264_BASELINE:
284161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_AVCProfileBaseline;
284261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
284361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_PROFILE_H264_MAIN:
284461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_AVCProfileMain;
284561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
284661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_PROFILE_H264_HIGH:
284761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_AVCProfileHigh;
284861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
284961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default:
285061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_AVCProfileMax;
285161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                status = false;
285261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
285361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
285461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
285561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!status) {
285661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return status;
285761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
285861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
285961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (profile_level.level) {
286061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H264_1:
286161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel1;
286261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
286361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H264_1b:
286461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel1b;
286561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
286661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H264_1p1:
286761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel11;
286861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
286961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H264_1p2:
287061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel12;
287161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
287261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H264_1p3:
287361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel13;
287461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
287561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H264_2:
287661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel2;
287761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
287861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H264_2p1:
287961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel21;
288061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
288161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H264_2p2:
288261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel22;
288361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
288461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H264_3:
288561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel3;
288661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
288761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H264_3p1:
288861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel31;
288961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
289061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H264_3p2:
289161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel32;
289261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
289361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H264_4:
289461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel4;
289561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
289661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default :
289761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevelMax;
289861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                status = false;
289961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
290061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
290161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
290261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
290361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
290447e37c4428509524ee576920a98381f3e4872493Nick Pelly}
290547e37c4428509524ee576920a98381f3e4872493Nick Pelly
290647e37c4428509524ee576920a98381f3e4872493Nick Pellybool venc_dev::venc_validate_profile_level(OMX_U32 *eProfile, OMX_U32 *eLevel)
290747e37c4428509524ee576920a98381f3e4872493Nick Pelly{
290861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 new_profile = 0, new_level = 0;
290961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned const int *profile_tbl = NULL;
291061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 mb_per_frame, mb_per_sec;
291161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool profile_level_found = false;
291261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
29138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Init profile table for respective codec");
291461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
291561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //validate the ht,width,fps,bitrate and set the appropriate profile and level
291661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_sVenc_cfg.codectype == VEN_CODEC_MPEG4) {
291761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eProfile == 0) {
291861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!m_profile_set) {
291961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
292061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
292161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                switch (codec_profile.profile) {
292261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    case VEN_PROFILE_MPEG4_ASP:
292361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        *eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
292461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
292561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    case VEN_PROFILE_MPEG4_SP:
292661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
292761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
292861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    default:
29298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_LOW("%s(): Unknown Error", __func__);
293061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
293161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
293261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
293347e37c4428509524ee576920a98381f3e4872493Nick Pelly        }
293461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
293561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eLevel == 0 && !m_level_set) {
293661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            *eLevel = OMX_VIDEO_MPEG4LevelMax;
293761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
293861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
293961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eProfile == OMX_VIDEO_MPEG4ProfileSimple) {
294061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_tbl = (unsigned int const *)mpeg4_profile_level_table;
294161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (*eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple) {
294261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_tbl = (unsigned int const *)
294361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (&mpeg4_profile_level_table[MPEG4_ASP_START]);
294461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
29458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Unsupported MPEG4 profile type %lu", *eProfile);
294647e37c4428509524ee576920a98381f3e4872493Nick Pelly            return false;
294747e37c4428509524ee576920a98381f3e4872493Nick Pelly        }
294861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_sVenc_cfg.codectype == VEN_CODEC_H264) {
294961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eProfile == 0) {
295061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!m_profile_set) {
295161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_AVCProfileBaseline;
295261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
295361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                switch (codec_profile.profile) {
295461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    case VEN_PROFILE_H264_BASELINE:
295561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        *eProfile = OMX_VIDEO_AVCProfileBaseline;
295661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
295761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    case VEN_PROFILE_H264_MAIN:
295861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        *eProfile = OMX_VIDEO_AVCProfileMain;
295961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
296061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    case VEN_PROFILE_H264_HIGH:
296161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        *eProfile = OMX_VIDEO_AVCProfileHigh;
296261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
296361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    default:
29648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_LOW("%s(): Unknown Error", __func__);
296561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
296661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
296761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
296847e37c4428509524ee576920a98381f3e4872493Nick Pelly        }
296961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
297061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eLevel == 0 && !m_level_set) {
297161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            *eLevel = OMX_VIDEO_AVCLevelMax;
297261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
297361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
297461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eProfile == OMX_VIDEO_AVCProfileBaseline) {
297561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_tbl = (unsigned int const *)h264_profile_level_table;
297661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (*eProfile == OMX_VIDEO_AVCProfileHigh) {
297761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_tbl = (unsigned int const *)
297861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (&h264_profile_level_table[H264_HP_START]);
297961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (*eProfile == OMX_VIDEO_AVCProfileMain) {
298061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_tbl = (unsigned int const *)
298161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (&h264_profile_level_table[H264_MP_START]);
298261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
29838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Unsupported AVC profile type %lu", *eProfile);
298447e37c4428509524ee576920a98381f3e4872493Nick Pelly            return false;
298547e37c4428509524ee576920a98381f3e4872493Nick Pelly        }
298661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_sVenc_cfg.codectype == VEN_CODEC_H263) {
298761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eProfile == 0) {
298861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!m_profile_set) {
298961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_H263ProfileBaseline;
299061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
299161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                switch (codec_profile.profile) {
299261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    case VEN_PROFILE_H263_BASELINE:
299361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        *eProfile = OMX_VIDEO_H263ProfileBaseline;
299461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
299561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    default:
29968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_LOW("%s(): Unknown Error", __func__);
299761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
299861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
299961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
300047e37c4428509524ee576920a98381f3e4872493Nick Pelly        }
300161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
300261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eLevel == 0 && !m_level_set) {
300361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            *eLevel = OMX_VIDEO_H263LevelMax;
300461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
300561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
300661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eProfile == OMX_VIDEO_H263ProfileBaseline) {
300761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_tbl = (unsigned int const *)h263_profile_level_table;
300861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
30098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Unsupported H.263 profile type %lu", *eProfile);
301047e37c4428509524ee576920a98381f3e4872493Nick Pelly            return false;
301147e37c4428509524ee576920a98381f3e4872493Nick Pelly        }
301261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
30138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Invalid codec type");
301447e37c4428509524ee576920a98381f3e4872493Nick Pelly        return false;
301561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
301661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
301761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    mb_per_frame = ((m_sVenc_cfg.input_height + 15) >> 4)*
301861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ((m_sVenc_cfg.input_width + 15)>> 4);
301961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
302061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((mb_per_frame >= 3600) && (m_sVenc_cfg.codectype == VEN_CODEC_MPEG4)) {
302161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (codec_profile.profile == VEN_PROFILE_MPEG4_ASP)
302261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_level.level = VEN_LEVEL_MPEG4_5;
302361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
302461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (codec_profile.profile == VEN_PROFILE_MPEG4_SP)
302561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_level.level = VEN_LEVEL_MPEG4_6;
302661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
302747e37c4428509524ee576920a98381f3e4872493Nick Pelly        {
302861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            new_level = profile_level.level;
302961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            new_profile = codec_profile.profile;
303061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return true;
303161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
303261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
303361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
303461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    mb_per_sec = mb_per_frame * m_sVenc_cfg.fps_num / m_sVenc_cfg.fps_den;
303561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
303661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    do {
303761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (mb_per_frame <= (int)profile_tbl[0]) {
303861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (mb_per_sec <= (int)profile_tbl[1]) {
303961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_sVenc_cfg.targetbitrate <= (int)profile_tbl[2]) {
304061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    new_level = (int)profile_tbl[3];
304161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    new_profile = (int)profile_tbl[4];
304261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    profile_level_found = true;
30438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("Appropriate profile/level found %d/%d", new_profile, new_level);
304461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
304561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
304661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
304747e37c4428509524ee576920a98381f3e4872493Nick Pelly        }
304861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
304961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        profile_tbl = profile_tbl + 5;
305061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } while (profile_tbl[0] != 0);
305161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
305261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (profile_level_found != true) {
30538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("ERROR: Unsupported profile/level");
305461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
305561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
305661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
305761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((*eLevel == OMX_VIDEO_MPEG4LevelMax) || (*eLevel == OMX_VIDEO_AVCLevelMax)
305861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            || (*eLevel == OMX_VIDEO_H263LevelMax)) {
305961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *eLevel = new_level;
306061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
306161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
306261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("%s: Returning with eProfile = %lu"
306361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            "Level = %lu", __func__, *eProfile, *eLevel);
306461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
306561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
306647e37c4428509524ee576920a98381f3e4872493Nick Pelly}
3067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_max_allowed_bitrate_check(OMX_U32 nTargetBitrate)
306947e37c4428509524ee576920a98381f3e4872493Nick Pelly{
307061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned const int *profile_tbl = NULL;
307161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
307261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch (m_sVenc_cfg.codectype) {
307361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VEN_CODEC_MPEG4:
307461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
307561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_eProfile == OMX_VIDEO_MPEG4ProfileSimple) {
307661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profile_tbl = (unsigned int const *)mpeg4_profile_level_table;
307761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (m_eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple) {
307861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profile_tbl = (unsigned int const *)
307961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (&mpeg4_profile_level_table[MPEG4_ASP_START]);
308061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
308161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Unsupported MPEG4 profile type %lu", m_eProfile);
308261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return false;
308361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
308461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
308561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
308661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VEN_CODEC_H264:
308761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
308861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_eProfile == OMX_VIDEO_AVCProfileBaseline) {
308961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profile_tbl = (unsigned int const *)h264_profile_level_table;
309061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (m_eProfile == OMX_VIDEO_AVCProfileHigh) {
309161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profile_tbl = (unsigned int const *)
309261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (&h264_profile_level_table[H264_HP_START]);
309361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (m_eProfile == OMX_VIDEO_AVCProfileMain) {
309461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profile_tbl = (unsigned int const *)
309561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (&h264_profile_level_table[H264_MP_START]);
309661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
309761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Unsupported AVC profile type %lu", m_eProfile);
309861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return false;
309961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
310061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
310161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
310261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VEN_CODEC_H263:
310361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
310461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_eProfile == OMX_VIDEO_H263ProfileBaseline) {
310561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profile_tbl = (unsigned int const *)h263_profile_level_table;
310661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
310761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Unsupported H.263 profile type %lu", m_eProfile);
310861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return false;
310961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
311061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
311161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
311261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
311361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("%s: unknown codec type", __func__);
311461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
311547e37c4428509524ee576920a98381f3e4872493Nick Pelly    }
311661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
311761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (profile_tbl[0] != 0) {
311861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (profile_tbl[3] == m_eLevel) {
311961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (nTargetBitrate > profile_tbl[2]) {
312061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Max. supported bitrate for Profile[%d] & Level[%d]"
312161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        " is %u", m_eProfile, m_eLevel, profile_tbl[2]);
312261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return false;
312361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
312461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
312561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
312661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        profile_tbl += 5;
312761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
312861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
312961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
3130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_
3133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_meta_mode(bool mode)
3134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
313561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
313661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = &mode;
313761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("Set meta buffer mode: %d", mode);
313861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
313961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(m_nDriver_fd,VEN_IOCTL_SET_METABUFFER_MODE,&ioctl_msg) < 0) {
314061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR(" Set meta buffer mode failed");
314161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
314261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
314361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
314461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
314547e37c4428509524ee576920a98381f3e4872493Nick Pelly}
3146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3147