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"
35e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include <linux/android_pmem.h>
36826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
37278952ff92fab2da0c47b912daeb662130676be1Haynes Mathew George#include <linux/msm_ion.h>
38826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3947e37c4428509524ee576920a98381f3e4872493Nick Pelly
4047e37c4428509524ee576920a98381f3e4872493Nick Pelly#define MPEG4_SP_START 0
4147e37c4428509524ee576920a98381f3e4872493Nick Pelly#define MPEG4_ASP_START (MPEG4_SP_START + 8)
4247e37c4428509524ee576920a98381f3e4872493Nick Pelly#define MPEG4_720P_LEVEL 6
4347e37c4428509524ee576920a98381f3e4872493Nick Pelly#define H263_BP_START 0
4447e37c4428509524ee576920a98381f3e4872493Nick Pelly#define H264_BP_START 0
45826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define H264_HP_START (H264_BP_START + 13)
46826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define H264_MP_START (H264_BP_START + 26)
4747e37c4428509524ee576920a98381f3e4872493Nick Pelly
4847e37c4428509524ee576920a98381f3e4872493Nick Pelly/* MPEG4 profile and level table*/
4961a2c6a19dbd06a317a419623020e02056661876Praveen Chavanstatic const unsigned int mpeg4_profile_level_table[][5]= {
5047e37c4428509524ee576920a98381f3e4872493Nick Pelly    /*max mb per frame, max mb per sec, max bitrate, level, profile*/
5147e37c4428509524ee576920a98381f3e4872493Nick Pelly    {99,1485,64000,OMX_VIDEO_MPEG4Level0,OMX_VIDEO_MPEG4ProfileSimple},
52826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,64000,OMX_VIDEO_MPEG4Level1,OMX_VIDEO_MPEG4ProfileSimple},
5347e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,5940,128000,OMX_VIDEO_MPEG4Level2,OMX_VIDEO_MPEG4ProfileSimple},
5447e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,11880,384000,OMX_VIDEO_MPEG4Level3,OMX_VIDEO_MPEG4ProfileSimple},
5547e37c4428509524ee576920a98381f3e4872493Nick Pelly    {1200,36000,4000000,OMX_VIDEO_MPEG4Level4a,OMX_VIDEO_MPEG4ProfileSimple},
5647e37c4428509524ee576920a98381f3e4872493Nick Pelly    {1620,40500,8000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple},
57826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {3600,108000,12000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple},
5847e37c4428509524ee576920a98381f3e4872493Nick Pelly    {0,0,0,0,0},
5947e37c4428509524ee576920a98381f3e4872493Nick Pelly
60826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,128000,OMX_VIDEO_MPEG4Level0,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
61826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,128000,OMX_VIDEO_MPEG4Level1,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
6247e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,5940,384000,OMX_VIDEO_MPEG4Level2,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
6347e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,11880,768000,OMX_VIDEO_MPEG4Level3,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
6447e37c4428509524ee576920a98381f3e4872493Nick Pelly    {792,23760,3000000,OMX_VIDEO_MPEG4Level4,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
6547e37c4428509524ee576920a98381f3e4872493Nick Pelly    {1620,48600,8000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
66826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {0,0,0,0,0},
6747e37c4428509524ee576920a98381f3e4872493Nick Pelly};
6847e37c4428509524ee576920a98381f3e4872493Nick Pelly
6947e37c4428509524ee576920a98381f3e4872493Nick Pelly/* H264 profile and level table*/
7061a2c6a19dbd06a317a419623020e02056661876Praveen Chavanstatic const unsigned int h264_profile_level_table[][5]= {
7161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*max mb per frame, max mb per sec, max bitrate, level, profile*/
7247e37c4428509524ee576920a98381f3e4872493Nick Pelly    {99,1485,64000,OMX_VIDEO_AVCLevel1,OMX_VIDEO_AVCProfileBaseline},
7347e37c4428509524ee576920a98381f3e4872493Nick Pelly    {99,1485,128000,OMX_VIDEO_AVCLevel1b,OMX_VIDEO_AVCProfileBaseline},
7447e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,3000,192000,OMX_VIDEO_AVCLevel11,OMX_VIDEO_AVCProfileBaseline},
7547e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,6000,384000,OMX_VIDEO_AVCLevel12,OMX_VIDEO_AVCProfileBaseline},
7647e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,11880,768000,OMX_VIDEO_AVCLevel13,OMX_VIDEO_AVCProfileBaseline},
7747e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,11880,2000000,OMX_VIDEO_AVCLevel2,OMX_VIDEO_AVCProfileBaseline},
7847e37c4428509524ee576920a98381f3e4872493Nick Pelly    {792,19800,4000000,OMX_VIDEO_AVCLevel21,OMX_VIDEO_AVCProfileBaseline},
7947e37c4428509524ee576920a98381f3e4872493Nick Pelly    {1620,20250,4000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileBaseline},
8047e37c4428509524ee576920a98381f3e4872493Nick Pelly    {1620,40500,10000000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileBaseline},
8147e37c4428509524ee576920a98381f3e4872493Nick Pelly    {3600,108000,14000000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileBaseline},
82826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {5120,216000,20000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileBaseline},
83826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {8192,245760,20000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileBaseline},
8447e37c4428509524ee576920a98381f3e4872493Nick Pelly    {0,0,0,0,0},
8547e37c4428509524ee576920a98381f3e4872493Nick Pelly
8647e37c4428509524ee576920a98381f3e4872493Nick Pelly    {99,1485,64000,OMX_VIDEO_AVCLevel1,OMX_VIDEO_AVCProfileHigh},
8747e37c4428509524ee576920a98381f3e4872493Nick Pelly    {99,1485,160000,OMX_VIDEO_AVCLevel1b,OMX_VIDEO_AVCProfileHigh},
8847e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,3000,240000,OMX_VIDEO_AVCLevel11,OMX_VIDEO_AVCProfileHigh},
8947e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,6000,480000,OMX_VIDEO_AVCLevel12,OMX_VIDEO_AVCProfileHigh},
9047e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,11880,960000,OMX_VIDEO_AVCLevel13,OMX_VIDEO_AVCProfileHigh},
9147e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,11880,2500000,OMX_VIDEO_AVCLevel2,OMX_VIDEO_AVCProfileHigh},
9247e37c4428509524ee576920a98381f3e4872493Nick Pelly    {792,19800,5000000,OMX_VIDEO_AVCLevel21,OMX_VIDEO_AVCProfileHigh},
9347e37c4428509524ee576920a98381f3e4872493Nick Pelly    {1620,20250,5000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileHigh},
9447e37c4428509524ee576920a98381f3e4872493Nick Pelly    {1620,40500,12500000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileHigh},
9547e37c4428509524ee576920a98381f3e4872493Nick Pelly    {3600,108000,17500000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileHigh},
96826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {5120,216000,25000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileHigh},
97826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {8192,245760,25000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileHigh},
9847e37c4428509524ee576920a98381f3e4872493Nick Pelly    {0,0,0,0,0},
9947e37c4428509524ee576920a98381f3e4872493Nick Pelly
10047e37c4428509524ee576920a98381f3e4872493Nick Pelly    {99,1485,64000,OMX_VIDEO_AVCLevel1,OMX_VIDEO_AVCProfileMain},
101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,128000,OMX_VIDEO_AVCLevel1b,OMX_VIDEO_AVCProfileMain},
102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,3000,192000,OMX_VIDEO_AVCLevel11,OMX_VIDEO_AVCProfileMain},
103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,6000,384000,OMX_VIDEO_AVCLevel12,OMX_VIDEO_AVCProfileMain},
104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,768000,OMX_VIDEO_AVCLevel13,OMX_VIDEO_AVCProfileMain},
105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,2000000,OMX_VIDEO_AVCLevel2,OMX_VIDEO_AVCProfileMain},
106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {792,19800,4000000,OMX_VIDEO_AVCLevel21,OMX_VIDEO_AVCProfileMain},
107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1620,20250,4000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileMain},
108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1620,40500,10000000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileMain},
109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {3600,108000,14000000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileMain},
110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {5120,216000,20000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileMain},
111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {8192,245760,20000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileMain},
11247e37c4428509524ee576920a98381f3e4872493Nick Pelly    {0,0,0,0,0}
113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
11447e37c4428509524ee576920a98381f3e4872493Nick Pelly};
11547e37c4428509524ee576920a98381f3e4872493Nick Pelly
11647e37c4428509524ee576920a98381f3e4872493Nick Pelly/* H263 profile and level table*/
11761a2c6a19dbd06a317a419623020e02056661876Praveen Chavanstatic const unsigned int h263_profile_level_table[][5]= {
11847e37c4428509524ee576920a98381f3e4872493Nick Pelly    /*max mb per frame, max mb per sec, max bitrate, level, profile*/
11947e37c4428509524ee576920a98381f3e4872493Nick Pelly    {99,1485,64000,OMX_VIDEO_H263Level10,OMX_VIDEO_H263ProfileBaseline},
12047e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,5940,128000,OMX_VIDEO_H263Level20,OMX_VIDEO_H263ProfileBaseline},
12147e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,11880,384000,OMX_VIDEO_H263Level30,OMX_VIDEO_H263ProfileBaseline},
12247e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,11880,2048000,OMX_VIDEO_H263Level40,OMX_VIDEO_H263ProfileBaseline},
12347e37c4428509524ee576920a98381f3e4872493Nick Pelly    {99,1485,128000,OMX_VIDEO_H263Level45,OMX_VIDEO_H263ProfileBaseline},
12447e37c4428509524ee576920a98381f3e4872493Nick Pelly    {396,19800,4096000,OMX_VIDEO_H263Level50,OMX_VIDEO_H263ProfileBaseline},
12547e37c4428509524ee576920a98381f3e4872493Nick Pelly    {810,40500,8192000,OMX_VIDEO_H263Level60,OMX_VIDEO_H263ProfileBaseline},
12647e37c4428509524ee576920a98381f3e4872493Nick Pelly    {1620,81000,16384000,OMX_VIDEO_H263Level70,OMX_VIDEO_H263ProfileBaseline},
12747e37c4428509524ee576920a98381f3e4872493Nick Pelly    {0,0,0,0,0}
12847e37c4428509524ee576920a98381f3e4872493Nick Pelly};
12947e37c4428509524ee576920a98381f3e4872493Nick Pelly
130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Log2(number, power)  { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) &&  power < 16) { temp >>=0x1; power++; } }
131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power);  num = q >> power; den = 0x1 << (16 - power); }
132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#define BUFFER_LOG_LOC "/data/misc/media"
1348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
13547e37c4428509524ee576920a98381f3e4872493Nick Pelly//constructor
136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvenc_dev::venc_dev(class omx_venc *venc_class)
13747e37c4428509524ee576920a98381f3e4872493Nick Pelly{
13861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_max_allowed_bitrate_check = false;
13961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_eLevel = 0;
14061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_eProfile = 0;
14161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_init(&loaded_start_stop_mlock, NULL);
14261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_cond_init (&loaded_start_stop_cond, NULL);
1438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    memset(&m_debug,0,sizeof(m_debug));
1448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
1458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    char property_value[PROPERTY_VALUE_MAX] = {0};
1468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_value[0] = '\0';
1478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_get("vidc.enc.log.in", property_value, "0");
1488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_debug.in_buffer_log = atoi(property_value);
1498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
1508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_value[0] = '\0';
1518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    property_get("vidc.enc.log.out", property_value, "0");
1528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    m_debug.out_buffer_log = atoi(property_value);
1538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    snprintf(m_debug.log_loc, PROPERTY_VAL_MAX,
1548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan             "%s", BUFFER_LOG_LOC);
1558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
15661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("venc_dev constructor");
15747e37c4428509524ee576920a98381f3e4872493Nick Pelly}
15847e37c4428509524ee576920a98381f3e4872493Nick Pelly
15947e37c4428509524ee576920a98381f3e4872493Nick Pellyvenc_dev::~venc_dev()
16047e37c4428509524ee576920a98381f3e4872493Nick Pelly{
16161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_cond_destroy(&loaded_start_stop_cond);
16261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_destroy(&loaded_start_stop_mlock);
16361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("venc_dev distructor");
16447e37c4428509524ee576920a98381f3e4872493Nick Pelly}
16547e37c4428509524ee576920a98381f3e4872493Nick Pelly
16647e37c4428509524ee576920a98381f3e4872493Nick Pellyvoid* async_venc_message_thread (void *input)
16747e37c4428509524ee576920a98381f3e4872493Nick Pelly{
16861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_ioctl_msg ioctl_msg ={NULL,NULL};
16961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_timeout timeout;
17061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_msg venc_msg;
17161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int error_code = 0;
17261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx_venc *omx = reinterpret_cast<omx_venc*>(input);
17361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
17461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    prctl(PR_SET_NAME, (unsigned long)"VideoEncCallBackThread", 0, 0, 0);
17561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    timeout.millisec = VEN_TIMEOUT_INFINITE;
17661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
17761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (1) {
17861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.in = NULL;
17961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.out = (void*)&venc_msg;
18061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
18161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Wait for a message from the video decoder driver*/
18261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        error_code = ioctl(omx->handle->m_nDriver_fd,VEN_IOCTL_CMD_READ_NEXT_MSG,(void *)&ioctl_msg);
18361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
18461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (error_code == -512) { // ERESTARTSYS
1858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERESTARTSYS received in ioctl read next msg!");
18661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (error_code <0) {
1878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("ioctl VEN_IOCTL_CMD_READ_NEXT_MSG failed");
18861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
18961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (omx->async_message_process(input,&venc_msg) < 0) {
1908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: Wrong ioctl message");
19161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
19261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
19361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("omx_venc: Async Thread exit");
195073c5e91be587a9f90fe39719e1e9fa7cd2a3525Vineeta Srivastava    return NULL;
196a66301743224ed885fc1b5275acd16f4843a03f5Vineeta Srivastava}
197a66301743224ed885fc1b5275acd16f4843a03f5Vineeta Srivastava
1988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanint venc_dev::venc_extradata_log_buffers(char *buffer_addr)
1998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
2008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return OMX_ErrorUnsupportedSetting;
2018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
2028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
2038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanint venc_dev::venc_output_log_buffers(const char *buffer_addr, int buffer_len)
2048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
2058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_debug.out_buffer_log && !m_debug.outfile) {
2068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int size = 0;
2078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if(m_sVenc_cfg.codectype == VEN_CODEC_MPEG4) {
2088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           size = snprintf(m_debug.outfile_name, PROPERTY_VALUE_MAX, "%s/output_enc_%d_%d_%p.m4v",
2098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                           m_debug.log_loc, m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, this);
2108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        } else if(m_sVenc_cfg.codectype == VEN_CODEC_H264) {
2118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           size = snprintf(m_debug.outfile_name, PROPERTY_VALUE_MAX, "%s/output_enc_%d_%d_%p.264",
2128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                           m_debug.log_loc, m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, this);
2138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        } else if(m_sVenc_cfg.codectype == VENC_CODEC_H263) {
2148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           size = snprintf(m_debug.outfile_name, PROPERTY_VALUE_MAX, "%s/output_enc_%d_%d_%p.263",
2158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                           m_debug.log_loc, m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, this);
2168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        } else if(m_sVenc_cfg.codectype == VENC_CODEC_VP8) {
2178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           size = snprintf(m_debug.outfile_name, PROPERTY_VALUE_MAX, "%s/output_enc_%d_%d_%p.ivf",
2188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                           m_debug.log_loc, m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, this);
2198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
2208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if ((size > PROPERTY_VALUE_MAX) || (size < 0)) {
2218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to open output file: %s for logging as size:%d",
2228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                               m_debug.outfile_name, size);
2238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return -1;
2248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
2258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_debug.outfile = fopen(m_debug.outfile_name, "ab");
2268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!m_debug.outfile) {
2278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to open output file: %s for logging errno:%d",
2288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                              m_debug.outfile_name, errno);
2298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_debug.outfile_name[0] = '\0';
2308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return -1;
2318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
2328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
2338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_debug.outfile && buffer_len) {
2348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("%s buffer_len:%d", __func__, buffer_len);
2358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fwrite(buffer_addr, buffer_len, 1, m_debug.outfile);
2368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
2378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return 0;
2388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
2398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
2408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanbool venc_dev::venc_get_output_log_flag()
2418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan{
2428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return (m_debug.out_buffer_log == 1);
2438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
2448767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
2458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanint venc_dev::venc_input_log_buffers(OMX_BUFFERHEADERTYPE *pbuffer, void *pmem_data_buf, int framelen) {
2468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (!m_debug.infile) {
2478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int size = snprintf(m_debug.infile_name, PROPERTY_VALUE_MAX, "%s/input_enc_%d_%d_%p.yuv",
2488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                           m_debug.log_loc, m_sVenc_cfg.input_width,
2498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                           m_sVenc_cfg.input_height, this);
2508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if ((size > PROPERTY_VALUE_MAX) || (size < 0)) {
2518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Failed to open input file: %s for logging size:%d",
2528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                               m_debug.infile_name, size);
2538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return -1;
2548767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
2558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_debug.infile = fopen (m_debug.infile_name, "ab");
2568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        if (!m_debug.infile) {
2578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_HIGH("Failed to open input file: %s for logging", m_debug.infile);
2588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            m_debug.infile_name[0] = '\0';
2598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            return -1;
2608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        }
2618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
2628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_debug.infile && pbuffer && pbuffer->nFilledLen) {
2638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#ifdef MAX_RES_1080P
2648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       int y_size = 0;
2658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       int c_offset = 0;
2668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       unsigned char *buf_addr = NULL;
2678767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
2688767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       y_size = m_sVenc_cfg.input_width * m_sVenc_cfg.input_height;
2698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       //chroma offset is y_size aligned to the 2k boundary
2708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       c_offset= (y_size + 2047) & (~(2047));
2718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
2728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       if (pmem_data_buf) {
2738767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           DEBUG_PRINT_LOW("Internal PMEM addr for i/p Heap UseBuf: %p", pmem_data_buf);
2748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           buf_addr = (OMX_U8 *)pmem_data_buf;
2758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       } else {
2768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           DEBUG_PRINT_LOW("Shared PMEM addr for i/p PMEM UseBuf/AllocateBuf: %p", bufhdr->pBuffer);
2778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           buf_addr = (unsigned char *)mmap(NULL,
2788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                      ((encoder_media_buffer_type *)pbuffer->pBuffer)->meta_handle->data[2],
2798767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                      PROT_READ|PROT_WRITE, MAP_SHARED,
2808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                      ((encoder_media_buffer_type *)pbuffer->pBuffer)->meta_handle->data[0], 0);
2818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       }
2828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
2838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       if (m_debug.infile) {
2848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           fwrite((const char *)buf_addr, y_size, 1, m_debug.infile);
2858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           fwrite((const char *)(buf_addr + c_offset), (y_size>>1), 1, m_debug.infile);
2868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       }
2878767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
2888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       if (!pmem_data_buf) {
2898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           munmap (buf_addr, ((encoder_media_buffer_type *)pbuffer->pBuffer)->meta_handle->data[2]);
2908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       }
2918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#else
2928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       if (m_debug.infile) {
2938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           OMX_U8* ptrbuffer = NULL;
2948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           if (pmem_data_buf) {
2958767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan               DEBUG_PRINT_LOW("Internal PMEM addr for i/p Heap UseBuf: %p", pmem_data_buf);
2968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan               ptrbuffer = (OMX_U8 *)pmem_data_buf;
2978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           } else {
2988767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan               DEBUG_PRINT_LOW("Shared PMEM addr for i/p PMEM UseBuf/AllocateBuf: %p", bufhdr->pBuffer);
2998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan               ptrbuffer = (OMX_U8 *)bufhdr->pBuffer;
3008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           }
3018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan           fwrite((const char *)ptrbuffer, framelen, 1, m_debug.infile);
3028767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan       }
3038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
3048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan#endif
3058767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
3068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    return 0;
3078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan}
3088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
30947e37c4428509524ee576920a98381f3e4872493Nick Pellybool venc_dev::venc_open(OMX_U32 codec)
31047e37c4428509524ee576920a98381f3e4872493Nick Pelly{
31161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
31261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int r;
31361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int   alignment = 0,buffer_size = 0, temp =0;
31461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
3156eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    m_nDriver_fd = open ("/dev/msm_vidc_enc",O_RDWR|O_NONBLOCK);
31647e37c4428509524ee576920a98381f3e4872493Nick Pelly
31761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_nDriver_fd == 0) {
3188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Got fd as 0 for msm_vidc_enc, Opening again");
31961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_nDriver_fd = open ("/dev/msm_vidc_enc",O_RDWR|O_NONBLOCK);
32061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
32161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
32261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((int)m_nDriver_fd < 0) {
3238767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Omx_venc::Comp Init Returning failure");
32461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
32561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
32647e37c4428509524ee576920a98381f3e4872493Nick Pelly
3278767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("m_nDriver_fd = %d", m_nDriver_fd);
328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef SINGLE_ENCODER_INSTANCE
32961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 num_instances = 0;
33061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = NULL;
33161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = &num_instances;
33261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
33361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd, VEN_IOCTL_GET_NUMBER_INSTANCES, (void*)&ioctl_msg) < 0 ) {
3348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request number of encoder instances failed");
33561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (num_instances > 1) {
3368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Second encoder instance rejected!");
33761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        venc_close();
33861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
33961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
34061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
34261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // set the basic configuration of the video encoder driver
34361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.input_width = OMX_CORE_QCIF_WIDTH;
34461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.input_height= OMX_CORE_QCIF_HEIGHT;
34561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.dvs_width = OMX_CORE_QCIF_WIDTH;
34661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.dvs_height = OMX_CORE_QCIF_HEIGHT;
34761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.fps_num = 30;
34861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.fps_den = 1;
34961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.targetbitrate = 64000;
350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
35161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.inputformat= VEN_INPUTFMT_NV12_16M2KA;
352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
35361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.inputformat= VEN_INPUTFMT_NV12;
354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
35561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // initializing QP range parameters
35661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    qp_range.minqp = 2;
35761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
35861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (codec == OMX_VIDEO_CodingAVC)
35961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        qp_range.maxqp = 51;
36061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else
36161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        qp_range.maxqp = 31;
36261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
36361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (codec == OMX_VIDEO_CodingMPEG4) {
36461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sVenc_cfg.codectype = VEN_CODEC_MPEG4;
36561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_profile.profile = VEN_PROFILE_MPEG4_SP;
36661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        profile_level.level = VEN_LEVEL_MPEG4_2;
36761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (codec == OMX_VIDEO_CodingH263) {
36861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sVenc_cfg.codectype = VEN_CODEC_H263;
36961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_profile.profile = VEN_PROFILE_H263_BASELINE;
37061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        profile_level.level = VEN_LEVEL_H263_20;
37161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
37261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
37361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (codec == OMX_VIDEO_CodingAVC) {
37461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sVenc_cfg.codectype = VEN_CODEC_H264;
37561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_profile.profile = VEN_PROFILE_H264_BASELINE;
37661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        profile_level.level = VEN_LEVEL_H264_1p1;
37761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
37861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
37961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&m_sVenc_cfg;
38061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
38161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
38261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_BASE_CFG,(void*)&ioctl_msg) < 0 ) {
3838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for setting base configuration failed");
38461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
38561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
38661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
38761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // Get the I/P and O/P buffer requirements
38861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = NULL;
38961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = (void*)&m_sInput_buff_property;
39061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
39161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_GET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
3928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for getting i/p buffer requirement failed");
39361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
39461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
39561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
39661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = NULL;
39761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = (void*)&m_sOutput_buff_property;
39861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
39961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_GET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
4008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for getting o/p buffer requirement failed");
40161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
40261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
40361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
40461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_profile_set = false;
40561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_level_set = false;
40661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
40761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (venc_set_profile_level(0, 0)) {
4088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("%s(): Init Profile/Level setting success",
40961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                __func__);
41061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
41161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
41261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    recon_buffers_count = MAX_RECON_BUFFERS;
41361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ltrmode.ltr_mode = 0;
41461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ltrcount.ltr_count = 0;
41561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ltrperiod.ltr_period = 0;
41661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
41761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
41847e37c4428509524ee576920a98381f3e4872493Nick Pelly}
41947e37c4428509524ee576920a98381f3e4872493Nick Pelly
42047e37c4428509524ee576920a98381f3e4872493Nick Pellyvoid venc_dev::venc_close()
42147e37c4428509524ee576920a98381f3e4872493Nick Pelly{
4228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("venc_close: fd = %d", m_nDriver_fd);
42361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
42461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((int)m_nDriver_fd >= 0) {
4258767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("venc_close(): Calling VEN_IOCTL_CMD_STOP_READ_MSG");
42661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        (void)ioctl(m_nDriver_fd, VEN_IOCTL_CMD_STOP_READ_MSG,
42761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                NULL);
4288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Calling close()");
42961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close(m_nDriver_fd);
43061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_nDriver_fd = -1;
43161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
43261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
4338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_debug.infile) {
4348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fclose(m_debug.infile);
4358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_debug.infile = NULL;
4368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
4378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_debug.outfile) {
4388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        fclose(m_debug.outfile);
4398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        m_debug.outfile = NULL;
4408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    }
4418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan
44247e37c4428509524ee576920a98381f3e4872493Nick Pelly}
44347e37c4428509524ee576920a98381f3e4872493Nick Pelly
44447e37c4428509524ee576920a98381f3e4872493Nick Pellybool venc_dev::venc_set_buf_req(unsigned long *min_buff_count,
44561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned long *actual_buff_count,
44661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned long *buff_size,
44761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned long port)
44847e37c4428509524ee576920a98381f3e4872493Nick Pelly{
44961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
45061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned long temp_count = 0;
45161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
45261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == 0) {
45361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*actual_buff_count > m_sInput_buff_property.mincount) {
45461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            temp_count = m_sInput_buff_property.actualcount;
45561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_sInput_buff_property.actualcount = *actual_buff_count;
45661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ioctl_msg.in = (void*)&m_sInput_buff_property;
45761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ioctl_msg.out = NULL;
45861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
45961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
4608767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR: Request for setting i/p buffer requirement failed");
46161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_sInput_buff_property.actualcount = temp_count;
46261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return false;
46361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
46461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
4658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("I/P Count set to %lu", *actual_buff_count);
46661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
46761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
46861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*actual_buff_count > m_sOutput_buff_property.mincount) {
46961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            temp_count = m_sOutput_buff_property.actualcount;
47061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_sOutput_buff_property.actualcount = *actual_buff_count;
47161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ioctl_msg.in = (void*)&m_sOutput_buff_property;
47261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ioctl_msg.out = NULL;
47361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
47461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
4758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR: Request for setting o/p buffer requirement failed");
47661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_sOutput_buff_property.actualcount = temp_count;
47761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return false;
47861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
47961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
4808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("O/P Count set to %lu", *actual_buff_count);
48161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
48247e37c4428509524ee576920a98381f3e4872493Nick Pelly    }
48347e37c4428509524ee576920a98381f3e4872493Nick Pelly
48461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
48547e37c4428509524ee576920a98381f3e4872493Nick Pelly
48647e37c4428509524ee576920a98381f3e4872493Nick Pelly}
48747e37c4428509524ee576920a98381f3e4872493Nick Pelly
488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_loaded_start()
489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
49061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct timespec ts;
49161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int status = 0;
49261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
49361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_CMD_START, NULL) < 0) {
49461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: VEN_IOCTL_CMD_START failed");
49561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
49661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
49761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
49861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (clock_gettime(CLOCK_REALTIME, &ts) < 0) {
49961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("%s: clock_gettime failed", __func__);
50061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
50161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
50261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
50361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ts.tv_sec += 1;
50461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&loaded_start_stop_mlock);
50561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("%s: wait on start done", __func__);
50661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    status = pthread_cond_timedwait(&loaded_start_stop_cond,
50761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            &loaded_start_stop_mlock, &ts);
50861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
50961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (status != 0) {
51061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("%s: error status = %d, %s", __func__,
51161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                status, strerror(status));
51261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_unlock(&loaded_start_stop_mlock);
51361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
51461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
51561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
51661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("%s: wait over on start done", __func__);
517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pthread_mutex_unlock(&loaded_start_stop_mlock);
51861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("%s: venc_loaded_start success", __func__);
51961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_loaded_stop()
523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
52461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct timespec ts;
52561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int status = 0;
52661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
52761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_CMD_STOP, NULL) < 0) {
52861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: VEN_IOCTL_CMD_STOP failed");
52961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
53061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
53161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
53261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (clock_gettime(CLOCK_REALTIME, &ts) < 0) {
53361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("%s: clock_gettime failed", __func__);
53461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
53561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
53661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
53761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ts.tv_sec += 1;
53861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&loaded_start_stop_mlock);
53961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("%s: wait on stop done", __func__);
54061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    status = pthread_cond_timedwait(&loaded_start_stop_cond,
54161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            &loaded_start_stop_mlock, &ts);
54261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
54361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (status != 0) {
54461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("%s: error status = %d, %s", __func__,
54561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                status, strerror(status));
54661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_unlock(&loaded_start_stop_mlock);
54761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
54861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
54961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
55061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("%s: wait over on stop done", __func__);
551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pthread_mutex_unlock(&loaded_start_stop_mlock);
55261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("%s: venc_loaded_stop success", __func__);
55361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_loaded_start_done()
557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
55861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&loaded_start_stop_mlock);
55961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("%s: signal start done", __func__);
56061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_cond_signal(&loaded_start_stop_cond);
56161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&loaded_start_stop_mlock);
56261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_loaded_stop_done()
566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
56761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&loaded_start_stop_mlock);
56861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("%s: signal stop done", __func__);
56961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_cond_signal(&loaded_start_stop_cond);
57061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&loaded_start_stop_mlock);
57161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_get_seq_hdr(void *buffer,
575e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        unsigned buffer_size, unsigned *header_len)
576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
57761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
57861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int i = 0;
57961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("venc_dev::venc_get_seq_hdr");
58061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_seqheader seq_in, seq_out;
58161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    seq_in.hdrlen = 0;
58261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    seq_in.bufsize = buffer_size;
58361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    seq_in.hdrbufptr = (unsigned char*)buffer;
58461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
58561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (seq_in.hdrbufptr == NULL) {
58661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: malloc for sequence header failed");
58761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
58861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
59061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("seq_in: buf=%x, sz=%d, hdrlen=%d", seq_in.hdrbufptr,
59161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            seq_in.bufsize, seq_in.hdrlen);
5926eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
59361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&seq_in;
59461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = (void*)&seq_out;
59547e37c4428509524ee576920a98381f3e4872493Nick Pelly
59661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_GET_SEQUENCE_HDR,(void*)&ioctl_msg) < 0) {
59761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for getting sequence header failed");
59861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
59947e37c4428509524ee576920a98381f3e4872493Nick Pelly    }
60061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
60161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (seq_out.hdrlen == 0) {
60261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Seq header returned zero length header");
60361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("seq_out: buf=%x, sz=%d, hdrlen=%d", seq_out.hdrbufptr,
60461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                seq_out.bufsize, seq_out.hdrlen);
60561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
60647e37c4428509524ee576920a98381f3e4872493Nick Pelly    }
60747e37c4428509524ee576920a98381f3e4872493Nick Pelly
60861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    *header_len = seq_out.hdrlen;
60961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("seq_out: buf=%x, sz=%d, hdrlen=%d", seq_out.hdrbufptr,
61061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            seq_out.bufsize, seq_out.hdrlen);
61147e37c4428509524ee576920a98381f3e4872493Nick Pelly
61261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
61347e37c4428509524ee576920a98381f3e4872493Nick Pelly}
61447e37c4428509524ee576920a98381f3e4872493Nick Pelly
61561a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_get_capability_ltrcount(unsigned long *min,
61661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned long *max, unsigned long *step_size)
61747e37c4428509524ee576920a98381f3e4872493Nick Pelly{
61861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
61961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_range  cap_ltr_count;
62061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = NULL;
62161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = (void*)&cap_ltr_count;
622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
62361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd, VEN_IOCTL_GET_CAPABILITY_LTRCOUNT,
62461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (void*)&ioctl_msg) < 0) {
62561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Get LTR Capability failed");
62661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
62761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
62861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *min = cap_ltr_count.min;
62961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *max = cap_ltr_count.max;
63061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *step_size = cap_ltr_count.step_size;
63161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("LTR Capability: min=%x, max=%d, step_size=%d",
63261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *min, *max, *step_size);
63361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
634058dcdbfe54a3294a2713ba9993e6024f3f3a6a0Haynes Mathew George
63561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
63661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
637058dcdbfe54a3294a2713ba9993e6024f3f3a6a0Haynes Mathew George
63861a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_get_buf_req(unsigned long *min_buff_count,
63961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned long *actual_buff_count,
64061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned long *buff_size,
64161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned long port)
64261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
64361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
64447e37c4428509524ee576920a98381f3e4872493Nick Pelly
64561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == 0) {
646058dcdbfe54a3294a2713ba9993e6024f3f3a6a0Haynes Mathew George        ioctl_msg.in = NULL;
647058dcdbfe54a3294a2713ba9993e6024f3f3a6a0Haynes Mathew George        ioctl_msg.out = (void*)&m_sInput_buff_property;
64861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
64961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ioctl (m_nDriver_fd,VEN_IOCTL_GET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
6508767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: Request for getting i/p buffer requirement failed");
65147e37c4428509524ee576920a98381f3e4872493Nick Pelly            return false;
652058dcdbfe54a3294a2713ba9993e6024f3f3a6a0Haynes Mathew George        }
653058dcdbfe54a3294a2713ba9993e6024f3f3a6a0Haynes Mathew George
65461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *min_buff_count = m_sInput_buff_property.mincount;
65561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *actual_buff_count = m_sInput_buff_property.actualcount;
65661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef USE_ION
65761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // For ION memory allocations of the allocated buffer size
65861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // must be 4k aligned, hence aligning the input buffer
65961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // size to 4k.
66061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sInput_buff_property.datasize = (m_sInput_buff_property.datasize + 4095)
66161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            & (~4095);
66261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
66361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *buff_size = m_sInput_buff_property.datasize;
66461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
665058dcdbfe54a3294a2713ba9993e6024f3f3a6a0Haynes Mathew George        ioctl_msg.in = NULL;
666058dcdbfe54a3294a2713ba9993e6024f3f3a6a0Haynes Mathew George        ioctl_msg.out = (void*)&m_sOutput_buff_property;
66761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
66861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ioctl (m_nDriver_fd,VEN_IOCTL_GET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
6698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: Request for getting o/p buffer requirement failed");
67047e37c4428509524ee576920a98381f3e4872493Nick Pelly            return false;
671058dcdbfe54a3294a2713ba9993e6024f3f3a6a0Haynes Mathew George        }
672058dcdbfe54a3294a2713ba9993e6024f3f3a6a0Haynes Mathew George
67361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *min_buff_count = m_sOutput_buff_property.mincount;
67461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *actual_buff_count = m_sOutput_buff_property.actualcount;
67561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *buff_size = m_sOutput_buff_property.datasize;
67661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
677058dcdbfe54a3294a2713ba9993e6024f3f3a6a0Haynes Mathew George
67861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
67947e37c4428509524ee576920a98381f3e4872493Nick Pelly
68061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
68147e37c4428509524ee576920a98381f3e4872493Nick Pelly
68261a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_set_param(void *paramData,OMX_INDEXTYPE index )
68361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
68461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
6858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("venc_set_param:: venc-720p");
68661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
68761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch (index) {
68861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamPortDefinition:
689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
69061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
69161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
69261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("venc_set_param: OMX_IndexParamPortDefinition");
69361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
69461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (portDefn->nPortIndex == PORT_INDEX_IN) {
69561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
69661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_encode_framerate(portDefn->format.video.xFramerate, 0)) {
69761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
69861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
69961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
70061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_color_format(portDefn->format.video.eColorFormat)) {
70161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
70261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
70361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
70461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_LOW("Basic parameter has changed");
70561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_sVenc_cfg.input_height = portDefn->format.video.nFrameHeight;
70661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_sVenc_cfg.input_width = portDefn->format.video.nFrameWidth;
70761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
70861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ioctl_msg.in = (void*)&m_sVenc_cfg;
70961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ioctl_msg.out = NULL;
71061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
71161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_BASE_CFG,(void*)&ioctl_msg) < 0) {
7128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Request for setting base config failed");
71361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
71461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
71561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
71661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH("WxH (%dx%d), codec (%d), fps(nr/dr) (%d/%d), bitrate (%d), "
71761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            "color_format (%d)", m_sVenc_cfg.input_width, m_sVenc_cfg.input_height,
71861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            m_sVenc_cfg.codectype, m_sVenc_cfg.fps_num, m_sVenc_cfg.fps_den,
71961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            m_sVenc_cfg.targetbitrate, m_sVenc_cfg.inputformat);
72061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
72161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_LOW("Updating the buffer count/size for the new resolution");
72261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ioctl_msg.in = NULL;
72361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ioctl_msg.out = (void*)&m_sInput_buff_property;
72461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
72561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (ioctl (m_nDriver_fd, VEN_IOCTL_GET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
7268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Request for getting i/p bufreq failed");
72761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
72861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
72961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
73061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH("Got updated m_sInput_buff_property values: "
73161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            "datasize = %u, maxcount = %u, actualcnt = %u, "
73261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            "mincount = %u", m_sInput_buff_property.datasize,
73361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            m_sInput_buff_property.maxcount, m_sInput_buff_property.actualcount,
73461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            m_sInput_buff_property.mincount);
73561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
73661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ioctl_msg.in = NULL;
73761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ioctl_msg.out = (void*)&m_sOutput_buff_property;
73861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
73961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (ioctl (m_nDriver_fd, VEN_IOCTL_GET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
7408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Request for getting o/p bufreq failed");
74161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
74261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
74361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
74461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_HIGH("Got updated m_sOutput_buff_property values: "
74561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            "datasize = %u, maxcount = %u, actualcnt = %u, "
74661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            "mincount = %u", m_sOutput_buff_property.datasize,
74761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            m_sOutput_buff_property.maxcount, m_sOutput_buff_property.actualcount,
74861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            m_sOutput_buff_property.mincount);
74961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ioctl_msg.in = (void*)&m_sOutput_buff_property;
75061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    ioctl_msg.out = NULL;
75161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
75261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (ioctl (m_nDriver_fd, VEN_IOCTL_SET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
7538767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Request for setting o/p bufreq failed");
75461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
75561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
75661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
75761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ((portDefn->nBufferCountActual >= m_sInput_buff_property.mincount) &&
75861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (portDefn->nBufferCountActual <= m_sInput_buff_property.maxcount)) {
75961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_sInput_buff_property.actualcount = portDefn->nBufferCountActual;
76061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ioctl_msg.in = (void*)&m_sInput_buff_property;
76161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ioctl_msg.out = NULL;
76261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
76361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (ioctl(m_nDriver_fd,VEN_IOCTL_SET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
7648767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_ERROR("ERROR: Request for setting i/p buffer requirements failed");
76561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            return false;
76661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
76761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
76861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
76961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (m_sInput_buff_property.datasize != portDefn->nBufferSize) {
7708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("WARNING: Requested i/p bufsize[%u],"
77161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                "Driver's updated i/p bufsize = %u", portDefn->nBufferSize,
77261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                m_sInput_buff_property.datasize);
77361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
77461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
77561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_level_set = false;
77661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
77761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_profile_level(0, 0)) {
77861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_LOW("%s(): Profile/Level setting success", __func__);
77961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
78061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (portDefn->nPortIndex == PORT_INDEX_OUT) {
78161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_target_bitrate(portDefn->format.video.nBitrate, 0)) {
78261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
78361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
78461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
78561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ( (portDefn->nBufferCountActual >= m_sOutput_buff_property.mincount)
78661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            &&
78761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (m_sOutput_buff_property.maxcount >= portDefn->nBufferCountActual)
78861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            &&
78961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (m_sOutput_buff_property.datasize == portDefn->nBufferSize)
79061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                       ) {
79161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_sOutput_buff_property.actualcount = portDefn->nBufferCountActual;
79261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ioctl_msg.in = (void*)&m_sOutput_buff_property;
79361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ioctl_msg.out = NULL;
79461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
79561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
7968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                            DEBUG_PRINT_ERROR("ERROR: ioctl VEN_IOCTL_SET_OUTPUT_BUFFER_REQ failed");
79761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            return false;
79861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
79961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
8008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Setting Output buffer requirements failed");
80161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
80261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
80361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
8048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamPortDefinition");
80561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
80661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
80761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
80961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoPortFormat:
810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
81161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt;
81261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portFmt =(OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
8138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoPortFormat");
81461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
81561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (portFmt->nPortIndex == (OMX_U32) PORT_INDEX_IN) {
81661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_color_format(portFmt->eColorFormat)) {
81761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
81861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
81961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (portFmt->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
82061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_encode_framerate(portFmt->xFramerate, 0)) {
82161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
82261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
82361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
8248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoPortFormat");
82561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
82661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
82761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
82961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoBitrate:
830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
83161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_BITRATETYPE* pParam;
83261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pParam = (OMX_VIDEO_PARAM_BITRATETYPE*)paramData;
8338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoBitrate");
83461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
83561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
83661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_target_bitrate(pParam->nTargetBitrate, 0)) {
8378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Target Bit Rate setting failed");
83861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
83961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
84061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
84161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_ratectrl_cfg(pParam->eControlRate)) {
8428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Rate Control setting failed");
84361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
84461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
84561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
8468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoBitrate");
84761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
84861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
84961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
85161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoMpeg4:
852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
85361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_MPEG4TYPE* pParam;
85461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_U32 bFrames = 0;
85547e37c4428509524ee576920a98381f3e4872493Nick Pelly
85661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pParam = (OMX_VIDEO_PARAM_MPEG4TYPE*)paramData;
8578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoMpeg4");
85861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
85961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
86061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_voptiming_cfg(pParam->nTimeIncRes)) {
8618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Request for setting vop_timing failed");
86261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
86361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
86461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
86561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_profile_set = false;
86661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_level_set = false;
86761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
86861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_profile_level (pParam->eProfile, pParam->eLevel)) {
8698767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Unsuccessful in updating Profile and level");
87061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
87161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
87247e37c4428509524ee576920a98381f3e4872493Nick Pelly
873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
87461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    else {
87561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (pParam->eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple) {
87661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (pParam->nBFrames) {
87761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
87861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                bFrames = 1;
87961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
88061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
88161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (pParam->nBFrames) {
8828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_ERROR("Warning: B frames not supported");
88361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                bFrames = 0;
88461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
88561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
88661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
88761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
88947e37c4428509524ee576920a98381f3e4872493Nick Pelly
89061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_intra_period (pParam->nPFrames,bFrames)) {
8918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Request for setting intra period failed");
89261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
89361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
89447e37c4428509524ee576920a98381f3e4872493Nick Pelly
89561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_multislice_cfg(OMX_IndexParamVideoMpeg4,pParam->nSliceHeaderSpacing)) {
8968767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Unsuccessful in updating slice_config");
89761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
89861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
89961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
9008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoMpeg4");
90161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
90261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
90361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
90461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
90561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoH263:
90661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
90761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_H263TYPE* pParam = (OMX_VIDEO_PARAM_H263TYPE*)paramData;
9088767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoH263");
90961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_U32 bFrames = 0;
91061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
91161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
91261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_profile_set = false;
91361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_level_set = false;
91461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
91561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_profile_level (pParam->eProfile, pParam->eLevel)) {
9168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Unsuccessful in updating Profile and level");
91761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
91861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
91961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
92061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pParam->nBFrames)
9218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("WARNING: B frame not supported for H.263");
92261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
92361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_intra_period (pParam->nPFrames, bFrames) == false) {
9248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Request for setting intra period failed");
92561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
92661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
92761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
9288767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoH263");
92961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
93061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
93161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
93261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
93361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoAvc:
93461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
9358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoAvc");
93661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_AVCTYPE* pParam = (OMX_VIDEO_PARAM_AVCTYPE*)paramData;
93761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_U32 bFrames = 0;
93861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
93961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
9408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("pParam->eProfile :%d ,pParam->eLevel %d",
94161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pParam->eProfile,pParam->eLevel);
94261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
94361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_profile_set = false;
94461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_level_set = false;
94561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
94661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_profile_level (pParam->eProfile,pParam->eLevel)) {
9478767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Unsuccessful in updating Profile and level %d, %d",
94861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pParam->eProfile, pParam->eLevel);
94961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
95061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
95161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
95261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef MAX_RES_1080P
95361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    else {
95461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (pParam->eProfile != OMX_VIDEO_AVCProfileBaseline) {
95561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (pParam->nBFrames) {
95661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
95761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                bFrames = 1;
95861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
95961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
96061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (pParam->nBFrames) {
9618767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                                DEBUG_PRINT_ERROR("Warning: B frames not supported");
96261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                bFrames = 0;
96361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
96461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
96561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
96661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
96761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
96861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
96961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_intra_period (pParam->nPFrames, bFrames)) {
9708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Request for setting intra period failed");
97161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
97261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
97361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
97461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_entropy_config (pParam->bEntropyCodingCABAC, pParam->nCabacInitIdc)) {
9758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Request for setting Entropy failed");
97661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
97761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
97861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
97961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_inloop_filter (pParam->eLoopFilterMode)) {
9808767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Request for setting Inloop filter failed");
98161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
98261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
98361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
98461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_multislice_cfg(OMX_IndexParamVideoAvc, pParam->nSliceHeaderSpacing)) {
9858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("WARNING: Unsuccessful in updating slice_config");
98661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
98761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
98861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
9898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoAvc");
99061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
99161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
99261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //TBD, lot of other variables to be updated, yet to decide
99361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
99461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
99561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoIntraRefresh:
99661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
9978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoIntraRefresh");
99861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_INTRAREFRESHTYPE *intra_refresh =
99961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_VIDEO_PARAM_INTRAREFRESHTYPE *)paramData;
100061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
100161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (intra_refresh->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
100261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_intra_refresh(intra_refresh->eRefreshMode, intra_refresh->nCirMBs) == false) {
10038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Setting Intra refresh failed");
100461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
100561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
100661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
10078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoIntraRefresh");
100861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
100961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
101061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
101161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
101261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoErrorCorrection:
101361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
10148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoErrorCorrection");
101561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *error_resilience =
101661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)paramData;
101761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
101861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (error_resilience->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
101961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_error_resilience(error_resilience) == false) {
10208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Setting Intra refresh failed");
102161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
102261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
102361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
10248767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoErrorCorrection");
102561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
102661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
102761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
102861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
102961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoProfileLevelCurrent:
103061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
10318767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoProfileLevelCurrent");
103261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_PROFILELEVELTYPE *profile_level =
103361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData;
103461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
103561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (profile_level->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
103661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_profile_set = false;
103761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_level_set = false;
103861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
103961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_profile_level (profile_level->eProfile,
104061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                profile_level->eLevel)) {
10418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("WARNING: Unsuccessful in updating Profile and level");
104261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
104361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
104461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
10458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoProfileLevelCurrent");
104661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
104761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
104861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
104961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
105061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoQuantization:
105161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
10528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoQuantization");
105361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_QUANTIZATIONTYPE *session_qp =
105461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_VIDEO_PARAM_QUANTIZATIONTYPE *)paramData;
105561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
105661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (session_qp->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
105761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_session_qp (session_qp->nQpI,
105861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                session_qp->nQpP) == false) {
10598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Setting Session QP failed");
106061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
106161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
106261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
10638767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoQuantization");
106461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
106561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
106661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
106761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
106861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
106961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexParamVideoQPRange:
107061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
10718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param:OMX_QcomIndexParamVideoQPRange");
107261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_QCOM_VIDEO_PARAM_QPRANGETYPE *qp_range =
107361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_QCOM_VIDEO_PARAM_QPRANGETYPE *)paramData;
107461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
107561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (qp_range->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
107661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_qp_range (qp_range->minQP,
107761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                qp_range->maxQP) == false) {
10788767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Setting QP Range failed");
107961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
108061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
108161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
10828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_QcomIndexParamVideoQPRange");
108361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
108461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
108561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
108661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
108761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
108861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_ExtraDataVideoEncoderSliceInfo:
108961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
109061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param: OMX_ExtraDataVideoEncoderSliceInfo");
109161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_U32 extra_data = *(OMX_U32 *)paramData;
109261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
109361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (venc_set_extradata(extra_data) == false) {
109461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Setting "
109561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            "OMX_ExtraDataVideoEncoderSliceInfo failed");
109661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return false;
109761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
109861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
109961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
110061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
110161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_ExtraDataVideoLTRInfo:
110261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
110361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param: OMX_ExtraDataVideoLTRInfo");
110461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_U32 extra_data = *(OMX_U32 *)paramData;
110561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
110661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (venc_set_extradata(extra_data) == false) {
110761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Setting "
110861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            "OMX_ExtraDataVideoLTRInfo failed");
110961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return false;
111061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
111161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
111261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
111361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
111461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexEnableSliceDeliveryMode:
111561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
111661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_EXTNINDEX_PARAMTYPE* pParam =
111761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (QOMX_EXTNINDEX_PARAMTYPE*)paramData;
111861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
111961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pParam->nPortIndex == PORT_INDEX_OUT) {
112061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_slice_delivery_mode(pParam->bEnable) == false) {
112161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("Setting slice delivery mode failed");
112261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorUnsupportedSetting;
112361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
112461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
112561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("OMX_QcomIndexEnableSliceDeliveryMode "
112661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            "called on wrong port(%d)", pParam->nPortIndex);
112761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadPortIndex;
112861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
112961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
113061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
113161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
113261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexEnableH263PlusPType:
113361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
113461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_EXTNINDEX_PARAMTYPE* pParam =
113561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (QOMX_EXTNINDEX_PARAMTYPE*)paramData;
113661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("OMX_QcomIndexEnableH263PlusPType");
113761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
113861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pParam->nPortIndex == PORT_INDEX_OUT) {
113961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_plusptype(pParam->bEnable) == false) {
114061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("Setting PlusPType failed for H263");
114161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorUnsupportedSetting;
114261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
114361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
114461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("OMX_QcomIndexEnableH263PlusPType "
114561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            "called on wrong port(%d)", pParam->nPortIndex);
114661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadPortIndex;
114761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
114861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
114961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
115061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
115161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case QOMX_IndexParamVideoLTRMode:
115261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
115361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_VIDEO_PARAM_LTRMODE_TYPE* pParam =
115461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (QOMX_VIDEO_PARAM_LTRMODE_TYPE*)paramData;
115561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
115661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pParam->nPortIndex == PORT_INDEX_OUT) {
115761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_ltrmode(pParam->eLTRMode)) {
115861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("Setting ltr mode failed");
115961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorUnsupportedSetting;
116061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
116161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
116261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("QOMX_IndexParamVideoLTRMode "
116361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            "called on wrong port(%d)", pParam->nPortIndex);
116461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadPortIndex;
116561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
116661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
116761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
116861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
116961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case QOMX_IndexParamVideoLTRCount:
117061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
117161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_VIDEO_PARAM_LTRCOUNT_TYPE* pParam =
117261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (QOMX_VIDEO_PARAM_LTRCOUNT_TYPE*)paramData;
117361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
117461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pParam->nPortIndex == PORT_INDEX_OUT) {
117561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_ltrcount(pParam->nCount)) {
117661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("Setting ltr count failed");
117761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorUnsupportedSetting;
117861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
117961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
118061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("QOMX_IndexParamVideoLTRCount "
118161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            "called on wrong port(%d)", pParam->nPortIndex);
118261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadPortIndex;
118361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
118461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
118561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
118661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
118761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoSliceFMO:
118861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
118961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("venc_set_param: Unsupported index 0x%x", index);
119061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
119161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
119261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
119361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
119461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
119561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
119661a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_set_config(void *configData, OMX_INDEXTYPE index)
119761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
119861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
11998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Inside venc_set_config");
120061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
120161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch (index) {
120261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexConfigVideoBitrate:
120361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
120461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_CONFIG_BITRATETYPE *bit_rate = (OMX_VIDEO_CONFIG_BITRATETYPE *)
120561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    configData;
120661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
120761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_max_allowed_bitrate_check &&
120861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        !venc_max_allowed_bitrate_check(bit_rate->nEncodeBitrate)) {
120961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("Max Allowed Bitrate Check failed");
121061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return false;
121161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
121261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
12138767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("venc_set_config: OMX_IndexConfigVideoBitrate");
121461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
121561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (bit_rate->nPortIndex == (OMX_U32)PORT_INDEX_OUT) {
121661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_target_bitrate(bit_rate->nEncodeBitrate, 1) == false) {
12178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Setting Target Bit rate failed");
121861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
121961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
122061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
12218767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexConfigVideoBitrate");
122261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
122361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
122461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
122561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
122661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexConfigVideoFramerate:
122761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
122861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_CONFIG_FRAMERATETYPE *frame_rate = (OMX_CONFIG_FRAMERATETYPE *)
122961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    configData;
12308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("venc_set_config: OMX_IndexConfigVideoFramerate");
123161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
123261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (frame_rate->nPortIndex == (OMX_U32)PORT_INDEX_OUT) {
123361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_encode_framerate(frame_rate->xEncodeFramerate, 1) == false) {
12348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Setting Encode Framerate failed");
123561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
123661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
123761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
12388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexConfigVideoFramerate");
123961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
124061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
124161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
124261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
124361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case QOMX_IndexConfigVideoIntraperiod:
124461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
12458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param:QOMX_IndexConfigVideoIntraperiod");
124661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_VIDEO_INTRAPERIODTYPE *intraperiod =
124761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (QOMX_VIDEO_INTRAPERIODTYPE *)configData;
124861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
124961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (intraperiod->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
125061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_intra_period(intraperiod->nPFrames, intraperiod->nBFrames) == false) {
12518767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Request for setting intra period failed");
125261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
125361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
125461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
125561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
125661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
125761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
125861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexConfigVideoIntraVOPRefresh:
125961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
126061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_CONFIG_INTRAREFRESHVOPTYPE *intra_vop_refresh = (OMX_CONFIG_INTRAREFRESHVOPTYPE *)
126161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    configData;
12628767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_LOW("venc_set_config: OMX_IndexConfigVideoIntraVOPRefresh");
126361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
126461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (intra_vop_refresh->nPortIndex == (OMX_U32)PORT_INDEX_OUT) {
126561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_intra_vop_refresh(intra_vop_refresh->IntraRefreshVOP) == false) {
12668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_ERROR("ERROR: Setting Encode Framerate failed");
126761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
126861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
126961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
12708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexConfigVideoFramerate");
127161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
127261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
127361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
127461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
127561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexConfigCommonRotate:
127661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
127761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_CONFIG_ROTATIONTYPE *config_rotation =
127861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    reinterpret_cast<OMX_CONFIG_ROTATIONTYPE*>(configData);
127961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                venc_ioctl_msg ioctl_msg = {NULL,NULL};
128061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_U32 nFrameWidth;
128161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
12828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_HIGH("venc_set_config: updating the new Dims");
128361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nFrameWidth = m_sVenc_cfg.input_width;
128461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_sVenc_cfg.input_width  = m_sVenc_cfg.input_height;
128561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_sVenc_cfg.input_height = nFrameWidth;
128661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ioctl_msg.in = (void*)&m_sVenc_cfg;
128761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                ioctl_msg.out = NULL;
128861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
128961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_BASE_CFG,(void*)&ioctl_msg) < 0) {
12908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Dimension Change for Rotation failed");
129161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return false;
129261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
129361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
129461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
129561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
129661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case QOMX_IndexConfigVideoLTRPeriod:
129761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
129861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE* pParam =
129961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE*)configData;
130061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
130161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pParam->nPortIndex == PORT_INDEX_OUT) {
130261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_ltrperiod(pParam->nFrames)) {
130361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("Setting ltr period failed");
130461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorUnsupportedSetting;
130561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
130661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
130761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("QOMX_IndexConfigVideoLTRPeriod "
130861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            "called on wrong port(%d)", pParam->nPortIndex);
130961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadPortIndex;
131061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
131161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
131261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
131361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
131461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case QOMX_IndexConfigVideoLTRUse:
131561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
131661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_VIDEO_CONFIG_LTRUSE_TYPE* pParam =
131761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (QOMX_VIDEO_CONFIG_LTRUSE_TYPE*)configData;
131861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
131961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pParam->nPortIndex == PORT_INDEX_OUT) {
132061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_ltruse(pParam->nID, pParam->nFrames)) {
132161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("Setting ltr use failed");
132261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorUnsupportedSetting;
132361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
132461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
132561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("QOMX_IndexConfigVideoLTRUse "
132661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            "called on wrong port(%d)", pParam->nPortIndex);
132761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadPortIndex;
132861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
132961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
133061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
133161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
133261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
133361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("venc_set_config: Unsupported index = 0x%x", index);
133461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
133561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
133661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
133761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
133861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
133961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
134061a2c6a19dbd06a317a419623020e02056661876Praveen Chavanunsigned venc_dev::venc_stop( void)
134161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
134261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef MAX_RES_1080P
134361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_free();
134461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
134561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ioctl(m_nDriver_fd,VEN_IOCTL_CMD_STOP,NULL);
134661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
134761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
134861a2c6a19dbd06a317a419623020e02056661876Praveen Chavanunsigned venc_dev::venc_pause(void)
134961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
135061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ioctl(m_nDriver_fd,VEN_IOCTL_CMD_PAUSE,NULL);
135161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
135261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
135361a2c6a19dbd06a317a419623020e02056661876Praveen Chavanunsigned venc_dev::venc_resume(void)
135461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
135561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ioctl(m_nDriver_fd,VEN_IOCTL_CMD_RESUME,NULL) ;
135647e37c4428509524ee576920a98381f3e4872493Nick Pelly}
135747e37c4428509524ee576920a98381f3e4872493Nick Pelly
1358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned venc_dev::venc_start_done(void)
1359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
136061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return 0;
1361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
13636eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalunsigned venc_dev::venc_set_message_thread_id(pthread_t)
1364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
136561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return 0;
1366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
136847e37c4428509524ee576920a98381f3e4872493Nick Pellyunsigned venc_dev::venc_start(void)
136947e37c4428509524ee576920a98381f3e4872493Nick Pelly{
13708767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("%s(): Check Profile/Level set in driver before start",
137161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            __func__);
137261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
137361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!venc_set_profile_level(0, 0)) {
13748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: %s(): Driver Profile/Level is NOT SET",
137561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                __func__);
137661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
13778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("%s(): Driver Profile[%lu]/Level[%lu] successfully SET",
137861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                __func__, codec_profile.profile, profile_level.level);
137961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
138061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
138161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_max_allowed_bitrate_check &&
138261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            !venc_max_allowed_bitrate_check(bitrate.target_bitrate)) {
138361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Maximum Allowed Bitrate Check failed");
138461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return -1;
138561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
138661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
138761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_config_print();
1388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
1390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
139161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((codec_profile.profile == VEN_PROFILE_MPEG4_SP) ||
139261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (codec_profile.profile == VEN_PROFILE_H264_BASELINE) ||
139361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (codec_profile.profile == VEN_PROFILE_H263_BASELINE))
139461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        recon_buffers_count = MAX_RECON_BUFFERS - 2;
139561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else
139661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        recon_buffers_count = MAX_RECON_BUFFERS;
139761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
139861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ltrmode.ltr_mode == (unsigned long)QOMX_VIDEO_LTRMode_Auto) {
139961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        recon_buffers_count = MAX_RECON_BUFFERS;
140061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("ltr mode enabled, so set recon buffers "
140161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "count to %d", recon_buffers_count);
140261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
140361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
140461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!venc_allocate_recon_buffers())
140561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return ioctl(m_nDriver_fd, VEN_IOCTL_CMD_START, NULL);
140661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else {
14078767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Failed in creating Recon buffers");
140861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return -1;
140961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
14106eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
1411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
1412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return ioctl(m_nDriver_fd, VEN_IOCTL_CMD_START, NULL);
1413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
1417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 venc_dev::venc_allocate_recon_buffers()
1418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
141961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 yuv_size;
142061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_ioctl_msg ioctl_msg;
142161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_recon_buff_size recon_buff_size;
142261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
142361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    recon_buff_size.width =  ((m_sVenc_cfg.input_width + 15) / 16) * 16;
142461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    recon_buff_size.height = ((m_sVenc_cfg.input_height + 15) / 16 ) * 16;
142561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
14268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Width %d, Height %d, w_round %d, h_round %d", m_sVenc_cfg.input_width,
142761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_sVenc_cfg.input_height, recon_buff_size.width, recon_buff_size.height);
142861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
142961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = NULL;
143061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = (void*)&recon_buff_size;
143161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
143261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_GET_RECON_BUFFER_SIZE, (void*)&ioctl_msg) < 0) {
14338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("VEN_IOCTL_GET_RECON_BUFFER_SIZE Failed for width: %d, Height %d" ,
143461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                recon_buff_size.width, recon_buff_size.height);
143561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorInsufficientResources;
143661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
143761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
14388767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("Width %d, Height %d, w_round %d, h_round %d, yuv_size %d alignment %d count %d",
143961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, recon_buff_size.width,
144061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            recon_buff_size.height, recon_buff_size.size, recon_buff_size.alignment,
144161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            recon_buffers_count);
144261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
144361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (int i = 0; i < recon_buffers_count; i++) {
144461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pmem_allocate(recon_buff_size.size, recon_buff_size.alignment,i)) {
14458767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("Error returned in allocating recon buffers");
144661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return -1;
144761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
144861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
144961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
145061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return 0;
1451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 venc_dev::pmem_allocate(OMX_U32 size, OMX_U32 alignment, OMX_U32 count)
1453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
145461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 pmem_fd = -1;
145561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 width, height;
145661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    void *buf_addr = NULL;
145761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_ioctl_msg ioctl_msg;
145861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_recon_addr recon_addr;
145961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = 0;
1460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
146261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    recon_buff[count].ion_device_fd = open (MEM_DEVICE,O_RDONLY);
146361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
146461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (recon_buff[count].ion_device_fd < 0) {
14658767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: ION Device open() Failed");
146661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return -1;
146761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
146861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
146961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    recon_buff[count].alloc_data.len = size;
14706eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef MAX_RES_720P
1471e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    recon_buff[count].alloc_data.heap_id_mask = ION_HEAP(MEM_HEAP_ID);
14726eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#else
1473e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    recon_buff[count].alloc_data.heap_id_mask = (ION_HEAP(MEM_HEAP_ID) |
147461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ION_HEAP(ION_IOMMU_HEAP_ID));
14756eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
147661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    recon_buff[count].alloc_data.flags = ION_FLAG_CACHED;
147761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    recon_buff[count].alloc_data.align = clip2(alignment);
147861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
147961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (recon_buff[count].alloc_data.align != 8192)
148061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        recon_buff[count].alloc_data.align = 8192;
148161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
148261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(recon_buff[count].ion_device_fd,ION_IOC_ALLOC,&recon_buff[count].alloc_data);
148361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
148461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc || !recon_buff[count].alloc_data.handle) {
14858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ION ALLOC memory failed ");
148661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        recon_buff[count].alloc_data.handle=NULL;
148761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return -1;
148861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
148961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
149061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    recon_buff[count].ion_alloc_fd.handle = recon_buff[count].alloc_data.handle;
149161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(recon_buff[count].ion_device_fd,ION_IOC_MAP,&recon_buff[count].ion_alloc_fd);
149261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
149361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
14948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ION MAP failed ");
1495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        recon_buff[count].ion_alloc_fd.fd =-1;
1496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        recon_buff[count].ion_alloc_fd.fd =-1;
1497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return -1;
149861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
149961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
150061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_fd = recon_buff[count].ion_alloc_fd.fd;
1501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
150261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct pmem_allocation allocation;
150361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_fd = open(MEM_DEVICE, O_RDWR);
150461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
150561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((int)(pmem_fd) < 0) {
15068767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Failed to get an pmem handle");
150761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return -1;
150861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
150961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
151061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    allocation.size = size;
151161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    allocation.align = clip2(alignment);
151261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
151361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (allocation.align != 8192)
151461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        allocation.align = 8192;
151561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
151661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0) {
15178767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Aligment(%u) failed with pmem driver Sz(%lu)",
151861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                allocation.align, allocation.size);
151961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return -1;
152061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
152161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
1522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
152361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf_addr = mmap(NULL, size,
152461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            PROT_READ | PROT_WRITE,
152561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            MAP_SHARED, pmem_fd, 0);
152661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
152761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buf_addr == (void*) MAP_FAILED) {
152861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close(pmem_fd);
152961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pmem_fd = -1;
15308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Error returned in allocating recon buffers buf_addr: %p",buf_addr);
15316eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
153261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
153361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ioctl(recon_buff[count].ion_device_fd,ION_IOC_FREE,
153461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    &recon_buff[count].alloc_data.handle)) {
153561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("ion recon buffer free failed");
153661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
153761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
153861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        recon_buff[count].alloc_data.handle = NULL;
153961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        recon_buff[count].ion_alloc_fd.fd =-1;
154061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close(recon_buff[count].ion_device_fd);
154161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        recon_buff[count].ion_device_fd =-1;
15426eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
154361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return -1;
154461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
15468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("Allocated virt:%p, FD: %d of size %d", buf_addr, pmem_fd, size);
1547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
154861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    recon_addr.buffer_size = size;
154961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    recon_addr.pmem_fd = pmem_fd;
155061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    recon_addr.offset = 0;
155161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    recon_addr.pbuffer = (unsigned char *)buf_addr;
1552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
155361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&recon_addr;
155461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
1555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
155661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_RECON_BUFFER, (void*)&ioctl_msg) < 0) {
15578767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Failed to set the Recon_buffers");
155861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return -1;
155961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
1560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
156161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    recon_buff[count].virtual_address = (unsigned char *) buf_addr;
156261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    recon_buff[count].size = size;
156361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    recon_buff[count].offset = 0;
156461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    recon_buff[count].pmem_fd = pmem_fd;
1565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
15668767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_ERROR("Allocated virt:%p, FD: %d of size %d at index: %d", recon_buff[count].virtual_address,
156761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            recon_buff[count].pmem_fd, recon_buff[count].size, count);
156861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return 0;
1569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 venc_dev::pmem_free()
1572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
157361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int cnt = 0;
157461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_ioctl_msg ioctl_msg;
157561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_recon_addr recon_addr;
157661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
157761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (cnt = 0; cnt < recon_buffers_count; cnt++) {
157861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (recon_buff[cnt].pmem_fd) {
157961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            recon_addr.pbuffer = recon_buff[cnt].virtual_address;
158061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            recon_addr.offset = recon_buff[cnt].offset;
158161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            recon_addr.pmem_fd = recon_buff[cnt].pmem_fd;
158261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            recon_addr.buffer_size = recon_buff[cnt].size;
158361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ioctl_msg.in = (void*)&recon_addr;
158461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ioctl_msg.out = NULL;
158561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
158661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(m_nDriver_fd, VEN_IOCTL_FREE_RECON_BUFFER ,&ioctl_msg) < 0)
158761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("VEN_IOCTL_FREE_RECON_BUFFER failed");
158861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
158961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            munmap(recon_buff[cnt].virtual_address, recon_buff[cnt].size);
159061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            close(recon_buff[cnt].pmem_fd);
1591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
159261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
159361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(recon_buff[cnt].ion_device_fd,ION_IOC_FREE,
159461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        &recon_buff[cnt].alloc_data.handle)) {
159561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("ion recon buffer free failed");
159661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
159761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
159861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            recon_buff[cnt].alloc_data.handle = NULL;
159961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            recon_buff[cnt].ion_alloc_fd.fd =-1;
160061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            close(recon_buff[cnt].ion_device_fd);
160161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            recon_buff[cnt].ion_device_fd =-1;
1602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
16038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("cleaning Index %d of size %d",cnt,recon_buff[cnt].size);
160461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            recon_buff[cnt].pmem_fd = -1;
160561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            recon_buff[cnt].virtual_address = NULL;
160661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            recon_buff[cnt].offset = 0;
160761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            recon_buff[cnt].alignment = 0;
160861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            recon_buff[cnt].size = 0;
160961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
161061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
161161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
161261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return 0;
1613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid venc_dev::venc_config_print()
1617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
16198767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("ENC_CONFIG: Codec: %d, Profile %d, level : %d",
162061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_sVenc_cfg.codectype, codec_profile.profile, profile_level.level);
1621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
16228767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("ENC_CONFIG: Width: %d, Height:%d, Fps: %d",
162361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_sVenc_cfg.input_width, m_sVenc_cfg.input_height,
162461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_sVenc_cfg.fps_num/m_sVenc_cfg.fps_den);
1625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
16268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("ENC_CONFIG: Bitrate: %d, RC: %d, I-Period: %d",
162761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bitrate.target_bitrate, rate_ctrl.rcmode, intra_period.num_pframes);
1628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
16298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("ENC_CONFIG: qpI: %d, qpP: %d, qpb: 0",
163061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            session_qp.iframeqp, session_qp.pframqp);
1631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
16328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("ENC_CONFIG: minQP: %d, maxQP: %d",
163361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            qp_range.minqp, qp_range.maxqp);
16346eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
16358767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("ENC_CONFIG: VOP_Resolution: %d, Slice-Mode: %d, Slize_Size: %d",
163661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            voptimecfg.voptime_resolution, multislice.mslice_mode,
163761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            multislice.mslice_size);
1638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
16398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("ENC_CONFIG: EntropyMode: %d, CabacModel: %d",
164061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            entropy.longentropysel, entropy.cabacmodel);
1641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
16428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("ENC_CONFIG: DB-Mode: %d, alpha: %d, Beta: %d",
164361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dbkfilter.db_mode, dbkfilter.slicealpha_offset,
164461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dbkfilter.slicebeta_offset);
1645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
16468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_HIGH("ENC_CONFIG: IntraMB/Frame: %d, HEC: %d",
164761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            intra_refresh.mbcount, hec.header_extension);
164847e37c4428509524ee576920a98381f3e4872493Nick Pelly}
164947e37c4428509524ee576920a98381f3e4872493Nick Pelly
165047e37c4428509524ee576920a98381f3e4872493Nick Pellyunsigned venc_dev::venc_flush( unsigned port)
165147e37c4428509524ee576920a98381f3e4872493Nick Pelly{
165261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_ioctl_msg ioctl_msg;
165361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_bufferflush buffer_index;
165447e37c4428509524ee576920a98381f3e4872493Nick Pelly
165561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == PORT_INDEX_IN) {
165661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("Calling Input Flush");
165761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer_index.flush_mode = VEN_FLUSH_INPUT;
165861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.in = (void*)&buffer_index;
165961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.out = NULL;
166061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
166161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return ioctl (m_nDriver_fd,VEN_IOCTL_CMD_FLUSH,(void*)&ioctl_msg);
166261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (port == PORT_INDEX_OUT) {
166361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("Calling Output Flush");
166461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buffer_index.flush_mode = VEN_FLUSH_OUTPUT;
166561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.in = (void*)&buffer_index;
166661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.out = NULL;
166761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return ioctl (m_nDriver_fd,VEN_IOCTL_CMD_FLUSH,(void*)&ioctl_msg);
166861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
166961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return -1;
167061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
167147e37c4428509524ee576920a98381f3e4872493Nick Pelly}
167247e37c4428509524ee576920a98381f3e4872493Nick Pelly
167347e37c4428509524ee576920a98381f3e4872493Nick Pelly//allocating I/P memory from pmem and register with the device
167447e37c4428509524ee576920a98381f3e4872493Nick Pelly
167547e37c4428509524ee576920a98381f3e4872493Nick Pelly
1676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_use_buf(void *buf_addr, unsigned port,unsigned)
167747e37c4428509524ee576920a98381f3e4872493Nick Pelly{
167861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
167961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct pmem *pmem_tmp;
168061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_bufferpayload dev_buffer = {0};
168161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_allocatorproperty buff_alloc_property = {0};
168247e37c4428509524ee576920a98381f3e4872493Nick Pelly
168361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_tmp = (struct pmem *)buf_addr;
168447e37c4428509524ee576920a98381f3e4872493Nick Pelly
16858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("venc_use_buf:: pmem_tmp = %p", pmem_tmp);
168647e37c4428509524ee576920a98381f3e4872493Nick Pelly
168761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == PORT_INDEX_IN) {
168861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
168961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.fd  = pmem_tmp->fd;
169061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.maped_size = pmem_tmp->size;
169161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.sz = pmem_tmp->size;
169261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.offset = pmem_tmp->offset;
169347e37c4428509524ee576920a98381f3e4872493Nick Pelly
169461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((m_sVenc_cfg.input_height %16 !=0) || (m_sVenc_cfg.input_width%16 != 0)) {
169561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            unsigned long ht = m_sVenc_cfg.input_height;
169661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            unsigned long wd = m_sVenc_cfg.input_width;
169761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            unsigned int luma_size, luma_size_2k;
1698120b7e44bc2419b5f9f03bc2af39c92d134189b7Ajay Dudani
169961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ht = (ht + 15) & ~15;
170061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            wd = (wd + 15) & ~15;
1701120b7e44bc2419b5f9f03bc2af39c92d134189b7Ajay Dudani
170261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            luma_size = ht * wd;
170361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            luma_size_2k = (luma_size + 2047) & ~2047;
1704120b7e44bc2419b5f9f03bc2af39c92d134189b7Ajay Dudani
170561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dev_buffer.sz = luma_size_2k + ((luma_size/2 + 2047) & ~2047);
17062fd0565a057f63bff8abca2a4a5ce2a77a004fe8Haynes Mathew George#ifdef USE_ION
170761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ioctl_msg.in = NULL;
170861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ioctl_msg.out = (void*)&buff_alloc_property;
170961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
171061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl (m_nDriver_fd,VEN_IOCTL_GET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < 0) {
17118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR: venc_use_buf:get input buffer failed ");
171261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return false;
171361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
171461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
171561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (buff_alloc_property.alignment < 4096) {
171661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                dev_buffer.sz = ((dev_buffer.sz + 4095) & ~4095);
171761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
171861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                dev_buffer.sz = ((dev_buffer.sz + (buff_alloc_property.alignment - 1)) &
171961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        ~(buff_alloc_property.alignment - 1));
172061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
172161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
17222fd0565a057f63bff8abca2a4a5ce2a77a004fe8Haynes Mathew George#endif
172361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dev_buffer.maped_size = dev_buffer.sz;
172461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
1725120b7e44bc2419b5f9f03bc2af39c92d134189b7Ajay Dudani
172661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.in  = (void*)&dev_buffer;
172761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.out = NULL;
17282fd0565a057f63bff8abca2a4a5ce2a77a004fe8Haynes Mathew George
17298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("venc_use_buf:pbuffer = %x,fd = %x, offset = %d, maped_size = %d", \
173047e37c4428509524ee576920a98381f3e4872493Nick Pelly                dev_buffer.pbuffer, \
173147e37c4428509524ee576920a98381f3e4872493Nick Pelly                dev_buffer.fd, \
173247e37c4428509524ee576920a98381f3e4872493Nick Pelly                dev_buffer.offset, \
173347e37c4428509524ee576920a98381f3e4872493Nick Pelly                dev_buffer.maped_size);
173447e37c4428509524ee576920a98381f3e4872493Nick Pelly
173561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_INPUT_BUFFER,&ioctl_msg) < 0) {
17368767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: venc_use_buf:set input buffer failed ");
173761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
173861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
173961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (port == PORT_INDEX_OUT) {
174061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
174161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.fd  = pmem_tmp->fd;
174261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.sz = pmem_tmp->size;
174361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.maped_size = pmem_tmp->size;
174461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.offset = pmem_tmp->offset;
174561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.in  = (void*)&dev_buffer;
174661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.out = NULL;
174747e37c4428509524ee576920a98381f3e4872493Nick Pelly
17488767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("venc_use_buf:pbuffer = %x,fd = %x, offset = %d, maped_size = %d", \
174947e37c4428509524ee576920a98381f3e4872493Nick Pelly                dev_buffer.pbuffer, \
175047e37c4428509524ee576920a98381f3e4872493Nick Pelly                dev_buffer.fd, \
175147e37c4428509524ee576920a98381f3e4872493Nick Pelly                dev_buffer.offset, \
175247e37c4428509524ee576920a98381f3e4872493Nick Pelly                dev_buffer.maped_size);
175347e37c4428509524ee576920a98381f3e4872493Nick Pelly
175461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_OUTPUT_BUFFER,&ioctl_msg) < 0) {
17558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: venc_use_buf:set output buffer failed ");
175661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
175761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
175861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
17598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: venc_use_buf:Invalid Port Index ");
176061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
176147e37c4428509524ee576920a98381f3e4872493Nick Pelly    }
176247e37c4428509524ee576920a98381f3e4872493Nick Pelly
176361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
176447e37c4428509524ee576920a98381f3e4872493Nick Pelly}
176547e37c4428509524ee576920a98381f3e4872493Nick Pelly
176647e37c4428509524ee576920a98381f3e4872493Nick Pellybool venc_dev::venc_free_buf(void *buf_addr, unsigned port)
176747e37c4428509524ee576920a98381f3e4872493Nick Pelly{
176861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
176961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct pmem *pmem_tmp;
177061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_bufferpayload dev_buffer = {0};
177161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
177261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_tmp = (struct pmem *)buf_addr;
177347e37c4428509524ee576920a98381f3e4872493Nick Pelly
17748767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("venc_use_buf:: pmem_tmp = %p", pmem_tmp);
177561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
177661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == PORT_INDEX_IN) {
177761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
177861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.fd  = pmem_tmp->fd;
177961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.maped_size = pmem_tmp->size;
178061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.sz = pmem_tmp->size;
178161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.offset = pmem_tmp->offset;
178261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.in  = (void*)&dev_buffer;
178361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.out = NULL;
178461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
17858767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("venc_free_buf:pbuffer = %x,fd = %x, offset = %d, maped_size = %d", \
178647e37c4428509524ee576920a98381f3e4872493Nick Pelly                dev_buffer.pbuffer, \
178747e37c4428509524ee576920a98381f3e4872493Nick Pelly                dev_buffer.fd, \
178847e37c4428509524ee576920a98381f3e4872493Nick Pelly                dev_buffer.offset, \
178947e37c4428509524ee576920a98381f3e4872493Nick Pelly                dev_buffer.maped_size);
179047e37c4428509524ee576920a98381f3e4872493Nick Pelly
179161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ioctl (m_nDriver_fd,VEN_IOCTL_CMD_FREE_INPUT_BUFFER,&ioctl_msg) < 0) {
17928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: venc_free_buf: free input buffer failed ");
179361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
179461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
179561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (port == PORT_INDEX_OUT) {
179661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
179761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.fd  = pmem_tmp->fd;
179861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.sz = pmem_tmp->size;
179961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.maped_size = pmem_tmp->size;
180061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.offset = pmem_tmp->offset;
180161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.in  = (void*)&dev_buffer;
180261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.out = NULL;
180347e37c4428509524ee576920a98381f3e4872493Nick Pelly
18048767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("venc_free_buf:pbuffer = %x,fd = %x, offset = %d, maped_size = %d", \
180547e37c4428509524ee576920a98381f3e4872493Nick Pelly                dev_buffer.pbuffer, \
180647e37c4428509524ee576920a98381f3e4872493Nick Pelly                dev_buffer.fd, \
180747e37c4428509524ee576920a98381f3e4872493Nick Pelly                dev_buffer.offset, \
180847e37c4428509524ee576920a98381f3e4872493Nick Pelly                dev_buffer.maped_size);
180947e37c4428509524ee576920a98381f3e4872493Nick Pelly
181061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ioctl (m_nDriver_fd,VEN_IOCTL_CMD_FREE_OUTPUT_BUFFER,&ioctl_msg) < 0) {
18118767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: venc_free_buf: free output buffer failed ");
181261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
181361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
181461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
18158767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: venc_free_buf:Invalid Port Index ");
181661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
181747e37c4428509524ee576920a98381f3e4872493Nick Pelly    }
181847e37c4428509524ee576920a98381f3e4872493Nick Pelly
181961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
182047e37c4428509524ee576920a98381f3e4872493Nick Pelly}
182147e37c4428509524ee576920a98381f3e4872493Nick Pelly
1822c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavanbool venc_dev::venc_color_align(OMX_BUFFERHEADERTYPE *buffer,
1823c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan                OMX_U32 width, OMX_U32 height)
1824c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan{
1825c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan    DEBUG_PRINT_ERROR("%s not implemented!", __func__);
1826c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan    return OMX_ErrorUnsupportedSetting;
1827c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan}
1828c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan
1829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_empty_buf(void *buffer, void *pmem_data_buf,unsigned,unsigned)
183047e37c4428509524ee576920a98381f3e4872493Nick Pelly{
183161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_buffer frameinfo;
183261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct pmem *temp_buffer;
183361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_ioctl_msg ioctl_msg;
183461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct OMX_BUFFERHEADERTYPE *bufhdr;
183561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
183661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer == NULL) {
18378767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: venc_etb: buffer is NULL");
183861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
183961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
184061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
184161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bufhdr = (OMX_BUFFERHEADERTYPE *)buffer;
184261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
18438767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Input buffer length %d",bufhdr->nFilledLen);
184461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
184561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (pmem_data_buf) {
18468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Internal PMEM addr for i/p Heap UseBuf: %p", pmem_data_buf);
184761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.ptrbuffer = (OMX_U8 *)pmem_data_buf;
184861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
18498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Shared PMEM addr for i/p PMEM UseBuf/AllocateBuf: %p", bufhdr->pBuffer);
185061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.ptrbuffer = (OMX_U8 *)bufhdr->pBuffer;
185161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
185261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
185361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.clientdata = (void *) buffer;
185461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.sz = bufhdr->nFilledLen;
185561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.len = bufhdr->nFilledLen;
185661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.flags = bufhdr->nFlags;
185761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.offset = bufhdr->nOffset;
185861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.timestamp = bufhdr->nTimeStamp;
18598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("i/p TS = %u", (OMX_U32)frameinfo.timestamp);
186061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = &frameinfo;
186161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
186261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
186361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("DBG: i/p frameinfo: bufhdr->pBuffer = %p, ptrbuffer = %p, offset = %u, len = %u",
186461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufhdr->pBuffer, frameinfo.ptrbuffer, frameinfo.offset, frameinfo.len);
186561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
186661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(m_nDriver_fd,VEN_IOCTL_CMD_ENCODE_FRAME,&ioctl_msg) < 0) {
186761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /*Generate an async error and move to invalid state*/
186861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
186961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
187061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
18718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    if (m_debug.in_buffer_log) {
18728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        venc_input_log_buffers(bufhdr, pmem_data_bufr, frameinfo.len);
187361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
187461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
187561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
187647e37c4428509524ee576920a98381f3e4872493Nick Pelly}
1877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_fill_buf(void *buffer, void *pmem_data_buf,unsigned,unsigned)
187847e37c4428509524ee576920a98381f3e4872493Nick Pelly{
187961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_ioctl_msg ioctl_msg = {NULL,NULL};
188061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct pmem *temp_buffer = NULL;
188161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_buffer  frameinfo;
188261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct OMX_BUFFERHEADERTYPE *bufhdr;
188361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
188461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer == NULL) {
188561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
188661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
188761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
188861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bufhdr = (OMX_BUFFERHEADERTYPE *)buffer;
188961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
189061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (pmem_data_buf) {
18918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Internal PMEM addr for o/p Heap UseBuf: %p", pmem_data_buf);
189261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.ptrbuffer = (OMX_U8 *)pmem_data_buf;
189361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
18948767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Shared PMEM addr for o/p PMEM UseBuf/AllocateBuf: %p", bufhdr->pBuffer);
189561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        frameinfo.ptrbuffer = (OMX_U8 *)bufhdr->pBuffer;
189661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
189761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
189861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.clientdata = buffer;
189961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.sz = bufhdr->nAllocLen;
190061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.flags = bufhdr->nFlags;
190161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frameinfo.offset = bufhdr->nOffset;
190261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
190361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = &frameinfo;
190461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
190561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("DBG: o/p frameinfo: bufhdr->pBuffer = %p, ptrbuffer = %p, offset = %u, len = %u",
190661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufhdr->pBuffer, frameinfo.ptrbuffer, frameinfo.offset, frameinfo.len);
190761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
190861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_CMD_FILL_OUTPUT_BUFFER,&ioctl_msg) < 0) {
19098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: ioctl VEN_IOCTL_CMD_FILL_OUTPUT_BUFFER failed");
191061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
191161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
191261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
191361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
1914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_slice_delivery_mode(OMX_BOOL enable)
1917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
191861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
191961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("Set slice_delivery_mode: %d", enable);
192061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
192161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (multislice.mslice_mode == VEN_MSLICE_CNT_MB) {
192261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ioctl(m_nDriver_fd, VEN_IOCTL_SET_SLICE_DELIVERY_MODE) < 0) {
192361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Request for setting slice delivery mode failed");
192461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
192561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
192661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
192761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("WARNING: slice_mode[%d] is not VEN_MSLICE_CNT_MB to set "
192861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "slice delivery mode to the driver.", multislice.mslice_mode);
192961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
193061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
193161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
1932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
19346eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool venc_dev::venc_set_plusptype(OMX_BOOL enable)
1935b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand{
193661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
193761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_plusptype plusptype = {0};
193861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Set plusptype: %d", enable);
193961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plusptype.plusptype_enable = enable;
194061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&plusptype;
194161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
194261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
194361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(m_nDriver_fd, VEN_IOCTL_SET_H263_PLUSPTYPE,(void*)&ioctl_msg) < 0) {
194461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Request for setting plusptype for h263 failed");
194561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
194661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
194761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
194861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
1949b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand}
1950b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand
19516eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool venc_dev::venc_set_ltrmode(QOMX_VIDEO_LTRMODETYPE mode)
1952b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand{
195361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
195461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ltrmode ltr_mode;
195561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ltr_mode.ltr_mode = (unsigned long)mode;
195661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("Set ltr mode: %d", mode);
195761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&ltr_mode;
195861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
195961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
196061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd, VEN_IOCTL_SET_LTRMODE, (void*)&ioctl_msg) < 0) {
196161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Setting ltrmode failed");
196261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
196361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
196461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
196561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ltrmode.ltr_mode = (unsigned long)mode;
196661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
19676eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
19686eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
19696eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool venc_dev::venc_set_ltrcount(OMX_U32 count)
19706eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
197161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
197261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ltrcount ltr_count;
197361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ltr_count.ltr_count = (unsigned long)count;
197461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("Set ltr count: %d", count);
197561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&ltr_count;
197661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
197761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
197861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd, VEN_IOCTL_SET_LTRCOUNT, (void*)&ioctl_msg) < 0) {
197961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Setting ltrcount failed");
198061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
198161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
198261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
198361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ltrcount.ltr_count = (unsigned long)count;
198461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
19856eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
19866eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
19876eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool venc_dev::venc_set_ltrperiod(OMX_U32 period)
19886eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
198961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
199061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ltrperiod ltr_period;
199161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ltr_period.ltr_period = (unsigned long)period;
199261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("Set ltr period: %d", period);
199361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&ltr_period;
199461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
199561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
199661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd, VEN_IOCTL_SET_LTRPERIOD, (void*)&ioctl_msg) < 0) {
199761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Setting ltrperiod failed");
199861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
199961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
200061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
200161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ltrperiod.ltr_period = (unsigned long)period;
200261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
20036eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
20046eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
20056eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool venc_dev::venc_set_ltruse(OMX_U32 id, OMX_U32 frames)
20066eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
200761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
200861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ltruse ltr_use;
200961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ltr_use.ltr_id = (unsigned long)id;
201061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ltr_use.ltr_frames = (unsigned long)frames;
201161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("Set ltr use: id = %d, ltr_frames = %d", id, frames);
201261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&ltr_use;
201361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
201461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
201561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd, VEN_IOCTL_SET_LTRUSE, (void*)&ioctl_msg) < 0) {
201661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Setting ltruse failed");
201761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
201861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
201961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
202061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
202161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
20223145f89c1398e32bb7fc6cc03866388f42d2bad3Deva Ramasubramanian
2023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_extradata(OMX_U32 extra_data)
2024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
202561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
202661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("venc_set_extradata:: %x", extra_data);
202761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&extra_data;
202861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
202961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
203061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd, VEN_IOCTL_SET_EXTRADATA, (void*)&ioctl_msg) < 0) {
203161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for setting extradata failed");
203261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
203361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
203461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
203561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
203647e37c4428509524ee576920a98381f3e4872493Nick Pelly}
203747e37c4428509524ee576920a98381f3e4872493Nick Pelly
203847e37c4428509524ee576920a98381f3e4872493Nick Pellybool venc_dev::venc_set_session_qp(OMX_U32 i_frame_qp, OMX_U32 p_frame_qp)
203947e37c4428509524ee576920a98381f3e4872493Nick Pelly{
204061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
204161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_sessionqp qp = {0, 0};
204261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("venc_set_session_qp:: i_frame_qp = %d, p_frame_qp = %d", i_frame_qp,
204361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            p_frame_qp);
204461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
204561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    qp.iframeqp = i_frame_qp;
204661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    qp.pframqp = p_frame_qp;
204761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
204861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&qp;
204961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
205061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
205161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_SESSION_QP,(void*)&ioctl_msg)< 0) {
20528767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for setting session qp failed");
205361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
205461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
205561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
205661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    session_qp.iframeqp = i_frame_qp;
205761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    session_qp.pframqp = p_frame_qp;
205861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
205961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
206047e37c4428509524ee576920a98381f3e4872493Nick Pelly}
206147e37c4428509524ee576920a98381f3e4872493Nick Pelly
20626eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool venc_dev::venc_set_qp_range(OMX_U32 min_qp, OMX_U32 max_qp)
20636eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
206461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
206561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_qprange qp = {0, 0};
206661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("venc_set_qp_range:: min_qp = %d, max_qp = %d", min_qp,
206761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            max_qp);
206861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
206961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    qp.minqp = min_qp;
207061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    qp.maxqp = max_qp;
207161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
207261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&qp;
207361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
207461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
207561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_QP_RANGE,(void*)&ioctl_msg)< 0) {
20768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for setting qp range failed");
207761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
207861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
207961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
208061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    qp_range.minqp= min_qp;
208161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    qp_range.maxqp= max_qp;
208261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
208361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
20846eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
20856eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
208647e37c4428509524ee576920a98381f3e4872493Nick Pellybool venc_dev::venc_set_profile_level(OMX_U32 eProfile,OMX_U32 eLevel)
208747e37c4428509524ee576920a98381f3e4872493Nick Pelly{
208861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
208961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_profile requested_profile;
209061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct ven_profilelevel requested_level;
209161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned const int *profile_tbl = NULL;
209261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned long mb_per_frame = 0, mb_per_sec = 0;
209361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("venc_set_profile_level:: eProfile = %d, Level = %d",
209461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eProfile, eLevel);
209561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    mb_per_frame = ((m_sVenc_cfg.input_height + 15) >> 4)*
209661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ((m_sVenc_cfg.input_width + 15) >> 4);
209761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
209861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((eProfile == 0) && (eLevel == 0) && m_profile_set && m_level_set) {
209961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("Set profile/level was done already");
210061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return true;
210147e37c4428509524ee576920a98381f3e4872493Nick Pelly    }
210261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
210361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eProfile && eLevel) {
210461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        /* non-zero values will be set by user, saving the same*/
210561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_eProfile = eProfile;
210661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_eLevel = eLevel;
210761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("Save profile/level (%d/%d) for max allowed bitrate check",
210861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_eProfile, m_eLevel);
210947e37c4428509524ee576920a98381f3e4872493Nick Pelly    }
211047e37c4428509524ee576920a98381f3e4872493Nick Pelly
211161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Validating Profile/Level from table");
211247e37c4428509524ee576920a98381f3e4872493Nick Pelly
211361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!venc_validate_profile_level(&eProfile, &eLevel)) {
21148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("ERROR: Profile/Level validation failed");
211561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
2116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
211761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
211861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_sVenc_cfg.codectype == VEN_CODEC_MPEG4) {
211961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("eProfile = %d, OMX_VIDEO_MPEG4ProfileSimple = %d and "
212061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "OMX_VIDEO_MPEG4ProfileAdvancedSimple = %d", eProfile,
212161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4ProfileAdvancedSimple);
212261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
212361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eProfile == OMX_VIDEO_MPEG4ProfileSimple) {
212461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            requested_profile.profile = VEN_PROFILE_MPEG4_SP;
212561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_tbl = (unsigned int const *)
212661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (&mpeg4_profile_level_table[MPEG4_SP_START]);
212761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_tbl += MPEG4_720P_LEVEL*5;
212861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple) {
212961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            requested_profile.profile = VEN_PROFILE_MPEG4_ASP;
213061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_tbl = (unsigned int const *)
213161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (&mpeg4_profile_level_table[MPEG4_ASP_START]);
213261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_tbl += MPEG4_720P_LEVEL*5;
213361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
21348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("ERROR: Unsupported MPEG4 profile = %u",
213561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eProfile);
213661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
2137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
213861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
213961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("eLevel = %d, OMX_VIDEO_MPEG4Level0 = %d, OMX_VIDEO_MPEG4Level1 = %d,"
214061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "OMX_VIDEO_MPEG4Level2 = %d, OMX_VIDEO_MPEG4Level3 = %d, OMX_VIDEO_MPEG4Level4 = %d,"
214161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "OMX_VIDEO_MPEG4Level5 = %d", eLevel, OMX_VIDEO_MPEG4Level0, OMX_VIDEO_MPEG4Level1,
214261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_MPEG4Level2, OMX_VIDEO_MPEG4Level3, OMX_VIDEO_MPEG4Level4, OMX_VIDEO_MPEG4Level5);
214361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
214461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (mb_per_frame >= 3600) {
214561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (requested_profile.profile == VEN_PROFILE_MPEG4_ASP)
214661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_MPEG4_5;
214761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
214861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (requested_profile.profile == VEN_PROFILE_MPEG4_SP)
214961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_MPEG4_6;
215061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
215161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            switch (eLevel) {
215261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_VIDEO_MPEG4Level0:
215361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    requested_level.level = VEN_LEVEL_MPEG4_0;
215461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
215561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_VIDEO_MPEG4Level1:
215661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    requested_level.level = VEN_LEVEL_MPEG4_1;
215761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
215861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_VIDEO_MPEG4Level2:
215961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    requested_level.level = VEN_LEVEL_MPEG4_2;
216061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
216161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_VIDEO_MPEG4Level3:
216261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    requested_level.level = VEN_LEVEL_MPEG4_3;
216361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
216461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_VIDEO_MPEG4Level4a:
216561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    requested_level.level = VEN_LEVEL_MPEG4_4;
216661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
216761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_VIDEO_MPEG4Level5:
216861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    mb_per_sec = mb_per_frame * (m_sVenc_cfg.fps_num / m_sVenc_cfg.fps_den);
216961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
217061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ((requested_profile.profile == VEN_PROFILE_MPEG4_SP) && (mb_per_frame >= profile_tbl[0]) &&
217161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            (mb_per_sec >= profile_tbl[1])) {
21728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_LOW("MPEG4 Level 6 is set for 720p resolution");
217361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        requested_level.level = VEN_LEVEL_MPEG4_6;
217461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
21758767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_LOW("MPEG4 Level 5 is set for non-720p resolution");
217661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        requested_level.level = VEN_LEVEL_MPEG4_5;
217761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
217861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
217961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
218061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                default:
218161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return false;
218261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    // TODO update corresponding levels for MPEG4_LEVEL_3b,MPEG4_LEVEL_6
218361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
218461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
218561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
218661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_sVenc_cfg.codectype == VEN_CODEC_H263) {
218761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eProfile == OMX_VIDEO_H263ProfileBaseline) {
218861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            requested_profile.profile = VEN_PROFILE_H263_BASELINE;
218961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
21908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("ERROR: Unsupported H.263 profile = %u",
219161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    requested_profile.profile);
219261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
219361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
219461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
219561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        //profile level
219661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (eLevel) {
219761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263Level10:
219861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H263_10;
219961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
220061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263Level20:
220161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H263_20;
220261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
220361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263Level30:
220461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H263_30;
220561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
220661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263Level40:
220761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H263_40;
220861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
220961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263Level45:
221061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H263_45;
221161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
221261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263Level50:
221361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H263_50;
221461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
221561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263Level60:
221661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H263_60;
221761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
221861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263Level70:
221961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H263_70;
222061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
222161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default:
222261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return false;
222361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
222461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
222561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_sVenc_cfg.codectype == VEN_CODEC_H264) {
222661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eProfile == OMX_VIDEO_AVCProfileBaseline) {
222761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            requested_profile.profile = VEN_PROFILE_H264_BASELINE;
222861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (eProfile == OMX_VIDEO_AVCProfileMain) {
222961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            requested_profile.profile = VEN_PROFILE_H264_MAIN;
223061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (eProfile == OMX_VIDEO_AVCProfileHigh) {
223161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            requested_profile.profile = VEN_PROFILE_H264_HIGH;
223261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
22338767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("ERROR: Unsupported H.264 profile = %u",
223461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    requested_profile.profile);
223561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
223661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
223761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
223861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        //profile level
223961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (eLevel) {
224061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel1:
224161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H264_1;
224261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
224361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel1b:
224461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H264_1b;
224561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
224661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel11:
224761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H264_1p1;
224861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
224961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel12:
225061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H264_1p2;
225161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
225261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel13:
225361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H264_1p3;
225461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
225561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel2:
225661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H264_2;
225761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
225861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel21:
225961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H264_2p1;
226061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
226161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel22:
226261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H264_2p2;
226361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
226461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel3:
226561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H264_3;
226661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
226761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel31:
226861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H264_3p1;
226961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
227061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel32:
227161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H264_3p2;
227261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
227361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel4:
227461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = VEN_LEVEL_H264_4;
227561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
227661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default :
22778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                DEBUG_PRINT_ERROR("ERROR: Unsupported H.264 level= %u",
227861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        requested_level.level);
227961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return false;
228061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
2281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
228247e37c4428509524ee576920a98381f3e4872493Nick Pelly    }
228361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
228461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_profile_set) {
228561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.in = (void*)&requested_profile;
228661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.out = NULL;
228761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
228861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_CODEC_PROFILE,(void*)&ioctl_msg)< 0) {
22898767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: Request for setting profile failed");
229061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
229161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
229261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
229361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_profile.profile = requested_profile.profile;
229461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_profile_set = true;
229561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("Set codec profile = 0x%x", codec_profile.profile);
229647e37c4428509524ee576920a98381f3e4872493Nick Pelly    }
229761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
229861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_level_set) {
229961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.in = (void*)&requested_level;
230061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.out = NULL;
230161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
230261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_PROFILE_LEVEL,(void*)&ioctl_msg)< 0) {
23038767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: Request for setting profile level failed");
230461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
230561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
230661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
230761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        profile_level.level = requested_level.level;
230861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_level_set = true;
230961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("Set codec level = 0x%x", profile_level.level);
231047e37c4428509524ee576920a98381f3e4872493Nick Pelly    }
231147e37c4428509524ee576920a98381f3e4872493Nick Pelly
231261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
231347e37c4428509524ee576920a98381f3e4872493Nick Pelly}
231447e37c4428509524ee576920a98381f3e4872493Nick Pelly
2315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_voptiming_cfg( OMX_U32 TimeIncRes)
2316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
231761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
231861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_voptimingcfg vop_timing_cfg;
2319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
232061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("venc_set_voptiming_cfg: TimeRes = %u",
232161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            TimeIncRes);
2322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
232361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    vop_timing_cfg.voptime_resolution = TimeIncRes;
2324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
232561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&vop_timing_cfg;
232661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
2327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
232861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_VOP_TIMING_CFG,(void*)&ioctl_msg)< 0) {
23298767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for setting Vop Timing failed");
233061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
233161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
233261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
233361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    voptimecfg.voptime_resolution = vop_timing_cfg.voptime_resolution;
233461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
2335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_intra_period(OMX_U32 nPFrames, OMX_U32 nBFrames)
233847e37c4428509524ee576920a98381f3e4872493Nick Pelly{
233961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
234061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_intraperiod intraperiod_cfg;
234161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
234261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("venc_set_intra_period: nPFrames = %u",
234361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nPFrames);
234461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    intraperiod_cfg.num_pframes = nPFrames;
234561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
234661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((codec_profile.profile == VEN_PROFILE_MPEG4_ASP) ||
234761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (codec_profile.profile == VEN_PROFILE_H264_MAIN) ||
234861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (codec_profile.profile == VEN_PROFILE_H264_HIGH)) {
2349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
235061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
235161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (nBFrames) {
235261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
235361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            intraperiod_cfg.num_bframes = 1;
235461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else
235561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            intraperiod_cfg.num_bframes = 0;
235661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
2357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
235861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
235961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (nBFrames) {
236061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("B frames not supported");
236161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            intraperiod_cfg.num_bframes = 0;
236261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
236361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("B frames not supported");
236461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            intraperiod_cfg.num_bframes = 0;
236561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
236661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
2367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
236861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else
236961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        intraperiod_cfg.num_bframes = 0;
237061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
237161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("venc_set_intra_period: nPFrames = %u nBFrames = %u",
237261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            intraperiod_cfg.num_pframes, intraperiod_cfg.num_bframes);
237361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&intraperiod_cfg;
237461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
237561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
237661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_INTRA_PERIOD,(void*)&ioctl_msg)< 0) {
23778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for setting intra period failed");
237861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
237961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
238061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
238161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    intra_period.num_pframes = intraperiod_cfg.num_pframes;
238261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    intra_period.num_bframes = intraperiod_cfg.num_bframes;
238361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
238447e37c4428509524ee576920a98381f3e4872493Nick Pelly}
238547e37c4428509524ee576920a98381f3e4872493Nick Pelly
2386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_entropy_config(OMX_BOOL enable, OMX_U32 i_cabac_level)
238747e37c4428509524ee576920a98381f3e4872493Nick Pelly{
238861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
238961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_entropycfg entropy_cfg;
239047e37c4428509524ee576920a98381f3e4872493Nick Pelly
239161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&entropy_cfg,0,sizeof(entropy_cfg));
23928767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("venc_set_entropy_config: CABAC = %u level: %u", enable, i_cabac_level);
239361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
239461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (enable &&(codec_profile.profile != VEN_PROFILE_H264_BASELINE)) {
239561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        entropy_cfg.longentropysel = VEN_ENTROPY_MODEL_CABAC;
239661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
239761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (i_cabac_level == 0) {
239861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            entropy_cfg.cabacmodel = VEN_CABAC_MODEL_0;
239961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
2400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
240261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else {
240361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_HIGH("Invalid model set (%d) defaulting to  model 0",i_cabac_level);
240461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            entropy_cfg.cabacmodel = VEN_CABAC_MODEL_0;
240561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
240661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
2407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
240861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else if (i_cabac_level == 1) {
240961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            entropy_cfg.cabacmodel = VEN_CABAC_MODEL_1;
241061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (i_cabac_level == 2) {
241161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            entropy_cfg.cabacmodel = VEN_CABAC_MODEL_2;
241261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
241361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
2414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
241561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!enable) {
241661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        entropy_cfg.longentropysel = VEN_ENTROPY_MODEL_CAVLC;
241761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
24188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("Invalid Entropy mode for Baseline Profile");
241961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
242061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
242161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
242261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&entropy_cfg;
242361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
242461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
242561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_ENTROPY_CFG,(void*)&ioctl_msg)< 0) {
24268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for setting entropy config failed");
242761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
242861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
242961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
243061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    entropy.longentropysel = entropy_cfg.longentropysel;
243161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    entropy.cabacmodel  = entropy_cfg.cabacmodel;
243261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
243347e37c4428509524ee576920a98381f3e4872493Nick Pelly}
243447e37c4428509524ee576920a98381f3e4872493Nick Pelly
2435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_multislice_cfg(OMX_INDEXTYPE Codec, OMX_U32 nSlicesize) // MB
243647e37c4428509524ee576920a98381f3e4872493Nick Pelly{
243761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL, NULL};
243861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
243961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_multiclicecfg multislice_cfg;
244061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
244161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((Codec != OMX_IndexParamVideoH263)  && (nSlicesize)) {
244261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice_cfg.mslice_mode = VEN_MSLICE_CNT_MB;
244361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice_cfg.mslice_size = nSlicesize;
244461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
244561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice_cfg.mslice_mode = VEN_MSLICE_OFF;
244661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice_cfg.mslice_size = 0;
244761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
244861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
24498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("%s(): mode = %u, size = %u", __func__, multislice_cfg.mslice_mode,
245061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            multislice_cfg.mslice_size);
245161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
245261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&multislice_cfg;
245361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
245461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
245561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd, VEN_IOCTL_SET_MULTI_SLICE_CFG,(void*)&ioctl_msg) < 0) {
24568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for setting multi-slice cfg failed");
245761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        status = false;
245861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
245961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice.mslice_mode = multislice_cfg.mslice_mode;
246061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice.mslice_size = nSlicesize;
246161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
246261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
246361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
2464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_intra_refresh(OMX_VIDEO_INTRAREFRESHTYPE ir_mode, OMX_U32 irMBs)
2467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
246861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL, NULL};
246961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
247061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_intrarefresh intraRefresh_cfg;
247161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
247261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // There is no disabled mode.  Disabled mode is indicated by a 0 count.
247361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (irMBs == 0 || ir_mode == OMX_VIDEO_IntraRefreshMax) {
247461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        intraRefresh_cfg.irmode = VEN_IR_OFF;
247561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        intraRefresh_cfg.mbcount = 0;
247661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if ((ir_mode == OMX_VIDEO_IntraRefreshCyclic) &&
247761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (irMBs < ((m_sVenc_cfg.input_width * m_sVenc_cfg.input_height)>>8))) {
247861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        intraRefresh_cfg.irmode = VEN_IR_CYCLIC;
247961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        intraRefresh_cfg.mbcount = irMBs;
248061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
24818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Invalid IntraRefresh Parameters:"
248261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "mb count: %d, mb mode:%d", irMBs, ir_mode);
248361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
248461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
248561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
248661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&intraRefresh_cfg;
248761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
248861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
248961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_INTRA_REFRESH,(void*)&ioctl_msg) < 0) {
24908767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for setting Intra Refresh failed");
249161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        status = false;
249261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
249361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        intra_refresh.irmode = intraRefresh_cfg.irmode;
249461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        intra_refresh.mbcount = intraRefresh_cfg.mbcount;
249561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
249661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
249761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
2498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_error_resilience(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* error_resilience)
2501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
250261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL, NULL};
250361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
250461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_headerextension hec_cfg;
250561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_multiclicecfg multislice_cfg;
250661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
250761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_sVenc_cfg.codectype == OMX_VIDEO_CodingMPEG4) {
250861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (error_resilience->bEnableHEC) {
250961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            hec_cfg.header_extension = 1;
251061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
251161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            hec_cfg.header_extension = 0;
251261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
251361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
251461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.in = (void*)&hec_cfg;
251561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.out = NULL;
251661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
251761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_HEC,(void*)&ioctl_msg) < 0) {
25188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: Request for setting HEader Error correction failed");
251961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
252061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
252161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
252261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        hec.header_extension = error_resilience->bEnableHEC;
252361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
252461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
252561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (error_resilience->bEnableRVLC) {
25268767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("RVLC is not Supported");
252761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
252861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
252961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
253061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (( m_sVenc_cfg.codectype != OMX_VIDEO_CodingH263) &&
253161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (error_resilience->bEnableDataPartitioning)) {
25328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("DataPartioning are not Supported for MPEG4/H264");
253361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
253461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
253561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
253661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (( m_sVenc_cfg.codectype != OMX_VIDEO_CodingH263) &&
2537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            (error_resilience->nResynchMarkerSpacing)) {
253861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice_cfg.mslice_mode = VEN_MSLICE_CNT_BYTE;
253961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice_cfg.mslice_size = error_resilience->nResynchMarkerSpacing;
254061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_sVenc_cfg.codectype == OMX_VIDEO_CodingH263 &&
2541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            error_resilience->bEnableDataPartitioning) {
254261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice_cfg.mslice_mode = VEN_MSLICE_GOB;
254361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice_cfg.mslice_size = 0;
254461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
2545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        multislice_cfg.mslice_mode = VEN_MSLICE_OFF;
2546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        multislice_cfg.mslice_size = 0;
254761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
254861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
25498767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("%s(): mode = %u, size = %u", __func__, multislice_cfg.mslice_mode,
255061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            multislice_cfg.mslice_size);
255161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&multislice_cfg;
255261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
255361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
255461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_MULTI_SLICE_CFG,(void*)&ioctl_msg) < 0) {
25558767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for setting multi-slice cfg failed");
255661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        status = false;
255761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
255861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice.mslice_mode = multislice_cfg.mslice_mode ;
255961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice.mslice_size = multislice_cfg.mslice_size;
256061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
256161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
256261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
256361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
2564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_inloop_filter(OMX_VIDEO_AVCLOOPFILTERTYPE loopfilter)
2567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
256861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
256961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_dbcfg filter_cfg;
257061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
257161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&filter_cfg, 0, sizeof(filter_cfg));
25728767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("venc_set_inloop_filter: %u",loopfilter);
257361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
257461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (loopfilter == OMX_VIDEO_AVCLoopFilterEnable) {
257561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        filter_cfg.db_mode = VEN_DB_ALL_BLKG_BNDRY;
257661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (loopfilter == OMX_VIDEO_AVCLoopFilterDisable) {
257761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        filter_cfg.db_mode = VEN_DB_DISABLE;
257861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (loopfilter == OMX_VIDEO_AVCLoopFilterDisableSliceBoundary) {
257961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        filter_cfg.db_mode = VEN_DB_SKIP_SLICE_BNDRY;
258061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
258161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
258261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    filter_cfg.slicealpha_offset = filter_cfg.slicebeta_offset = 0;
258361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
258461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&filter_cfg;
258561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
258661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
258761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_DEBLOCKING_CFG,(void*)&ioctl_msg)< 0) {
25888767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for setting inloop filter failed");
258961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
259061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
259161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
259261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    dbkfilter.db_mode = filter_cfg.db_mode;
259361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    dbkfilter.slicealpha_offset = dbkfilter.slicebeta_offset = 0;
259461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
2595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_target_bitrate(OMX_U32 nTargetBitrate, OMX_U32 config)
2598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
259961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL, NULL};
260061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_targetbitrate bitrate_cfg;
260161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
260261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("venc_set_target_bitrate: bitrate = %u",
260361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nTargetBitrate);
260461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bitrate_cfg.target_bitrate = nTargetBitrate ;
260561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&bitrate_cfg;
260661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
260761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
260861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_TARGET_BITRATE,(void*)&ioctl_msg) < 0) {
26098767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for setting bit rate failed");
261061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
2611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
261261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
261361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.targetbitrate = nTargetBitrate;
261461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bitrate.target_bitrate = nTargetBitrate;
261561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
261661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!config) {
261761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_level_set = false;
261861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
261961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (venc_set_profile_level(0, 0)) {
26208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Calling set level (Bitrate) with %d",profile_level.level);
262161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
262261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
262361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
262461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
2625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_encode_framerate(OMX_U32 encode_framerate, OMX_U32 config)
2628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
262961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL, NULL};
263061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_framerate frame_rate_cfg;
263161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
263261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    Q16ToFraction(encode_framerate,frame_rate_cfg.fps_numerator,frame_rate_cfg.fps_denominator);
263361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
263461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("venc_set_encode_framerate: framerate(Q16) = %u, NR: %d, DR: %d",
263561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            encode_framerate,frame_rate_cfg.fps_numerator,frame_rate_cfg.fps_denominator);
263661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
263761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&frame_rate_cfg;
263861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
263961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
264061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(m_nDriver_fd, VEN_IOCTL_SET_FRAME_RATE,
264161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (void*)&ioctl_msg) < 0) {
26428767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for setting framerate failed");
264361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
2644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
264561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
264661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.fps_den = frame_rate_cfg.fps_denominator;
264761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.fps_num = frame_rate_cfg.fps_numerator;
264861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
264961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!config) {
265061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_level_set = false;
265161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
265261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (venc_set_profile_level(0, 0)) {
265361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("Calling set level (Framerate) with %d",profile_level.level);
265461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
265561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
265661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
265761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
265847e37c4428509524ee576920a98381f3e4872493Nick Pelly}
265947e37c4428509524ee576920a98381f3e4872493Nick Pelly
266047e37c4428509524ee576920a98381f3e4872493Nick Pellybool venc_dev::venc_set_color_format(OMX_COLOR_FORMATTYPE color_format)
266147e37c4428509524ee576920a98381f3e4872493Nick Pelly{
266261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL, NULL};
266361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
266461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (color_format == OMX_COLOR_FormatYUV420SemiPlanar) {
2665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
266661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sVenc_cfg.inputformat= VEN_INPUTFMT_NV12_16M2KA;
2667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
266861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sVenc_cfg.inputformat = VEN_INPUTFMT_NV12;
2669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
267061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
26718767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("WARNING: Unsupported Color format [%d]", color_format);
2672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef MAX_RES_1080P
267361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sVenc_cfg.inputformat= VEN_INPUTFMT_NV12_16M2KA;
2674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
267561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sVenc_cfg.inputformat = VEN_INPUTFMT_NV12;
2676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
26778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_HIGH("Default color format YUV420SemiPlanar is set");
267861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
267961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
268061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = (void*)&m_sVenc_cfg;
268161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.out = NULL;
268261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
268361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(m_nDriver_fd, VEN_IOCTL_SET_BASE_CFG, (void*)&ioctl_msg) < 0) {
26848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for setting color format failed");
268561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
268661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
268761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
268861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
268947e37c4428509524ee576920a98381f3e4872493Nick Pelly}
269047e37c4428509524ee576920a98381f3e4872493Nick Pelly
269147e37c4428509524ee576920a98381f3e4872493Nick Pellybool venc_dev::venc_set_intra_vop_refresh(OMX_BOOL intra_vop_refresh)
269247e37c4428509524ee576920a98381f3e4872493Nick Pelly{
26938767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("venc_set_intra_vop_refresh: intra_vop = %uc", intra_vop_refresh);
269461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
269561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (intra_vop_refresh == OMX_TRUE) {
269661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ioctl(m_nDriver_fd, VEN_IOCTL_CMD_REQUEST_IFRAME, NULL) < 0) {
26978767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: Request for setting Intra VOP Refresh failed");
269861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
269961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
270061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
27018767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: VOP Refresh is False, no effect");
270261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
270361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
270461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
270547e37c4428509524ee576920a98381f3e4872493Nick Pelly}
270647e37c4428509524ee576920a98381f3e4872493Nick Pelly
270747e37c4428509524ee576920a98381f3e4872493Nick Pellybool venc_dev::venc_set_ratectrl_cfg(OMX_VIDEO_CONTROLRATETYPE eControlRate)
270847e37c4428509524ee576920a98381f3e4872493Nick Pelly{
270961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
271061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
271161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_ratectrlcfg ratectrl_cfg;
271261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
271361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //rate control
271461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch (eControlRate) {
271561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_Video_ControlRateDisable:
271661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ratectrl_cfg.rcmode = VEN_RC_OFF;
271761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
271861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_Video_ControlRateVariableSkipFrames:
271961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ratectrl_cfg.rcmode = VEN_RC_VBR_VFR;
272061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
272161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_Video_ControlRateVariable:
272261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ratectrl_cfg.rcmode = VEN_RC_VBR_CFR;
272361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
272461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_Video_ControlRateConstantSkipFrames:
272561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ratectrl_cfg.rcmode = VEN_RC_CBR_VFR;
272661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
272761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_Video_ControlRateConstant:
272861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            ratectrl_cfg.rcmode = VEN_RC_CBR_CFR;
272961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
273061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
273161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = false;
273261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
273347e37c4428509524ee576920a98381f3e4872493Nick Pelly    }
273461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
273561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (status) {
273661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.in = (void*)&ratectrl_cfg;
273761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl_msg.out = NULL;
273861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
273961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ioctl (m_nDriver_fd,VEN_IOCTL_SET_RATE_CTRL_CFG,(void*)&ioctl_msg) < 0) {
27408767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: Request for setting rate control failed");
274161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = false;
274261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else
274361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            rate_ctrl.rcmode = ratectrl_cfg.rcmode;
274461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
274561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
274661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
274747e37c4428509524ee576920a98381f3e4872493Nick Pelly}
274847e37c4428509524ee576920a98381f3e4872493Nick Pelly
274947e37c4428509524ee576920a98381f3e4872493Nick Pellybool venc_dev::venc_get_profile_level(OMX_U32 *eProfile,OMX_U32 *eLevel)
275047e37c4428509524ee576920a98381f3e4872493Nick Pelly{
275161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
275261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
275361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eProfile == NULL || eLevel == NULL) {
275461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
275547e37c4428509524ee576920a98381f3e4872493Nick Pelly    }
275661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
275761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_sVenc_cfg.codectype == VEN_CODEC_MPEG4) {
275861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (codec_profile.profile) {
275961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_PROFILE_MPEG4_SP:
276061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
276161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
276261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_PROFILE_MPEG4_ASP:
276361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
276461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
276561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default:
276661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_MPEG4ProfileMax;
276761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                status = false;
276861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
276961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
277061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
277161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!status) {
277261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return status;
277361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
277461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
277561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        //profile level
277661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (profile_level.level) {
277761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_MPEG4_0:
277861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_MPEG4Level0;
277961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
278061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_MPEG4_1:
278161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_MPEG4Level1;
278261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
278361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_MPEG4_2:
278461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_MPEG4Level2;
278561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
278661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_MPEG4_3:
278761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_MPEG4Level3;
278861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
278961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_MPEG4_4:
279061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_MPEG4Level4a;
279161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
279261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_MPEG4_5:
279361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_MPEG4_6:
279461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_MPEG4Level5;
279561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
279661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default:
279761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_MPEG4LevelMax;
279861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                status =  false;
279961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
280061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
280161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_sVenc_cfg.codectype == VEN_CODEC_H263) {
280261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (codec_profile.profile == VEN_PROFILE_H263_BASELINE) {
280361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            *eProfile = OMX_VIDEO_H263ProfileBaseline;
280461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
280561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            *eProfile = OMX_VIDEO_H263ProfileMax;
280661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
280761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
280861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
280961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (profile_level.level) {
281061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H263_10:
281161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263Level10;
281261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
281361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H263_20:
281461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263Level20;
281561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
281661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H263_30:
281761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263Level30;
281861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
281961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H263_40:
282061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263Level40;
282161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
282261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H263_45:
282361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263Level45;
282461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
282561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H263_50:
282661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263Level50;
282761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
282861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H263_60:
282961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263Level60;
283061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
283161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H263_70:
283261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263Level70;
283361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
283461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default:
283561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263LevelMax;
283661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                status = false;
283761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
283861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
283961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_sVenc_cfg.codectype == VEN_CODEC_H264) {
284061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (codec_profile.profile) {
284161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_PROFILE_H264_BASELINE:
284261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_AVCProfileBaseline;
284361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
284461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_PROFILE_H264_MAIN:
284561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_AVCProfileMain;
284661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
284761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_PROFILE_H264_HIGH:
284861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_AVCProfileHigh;
284961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
285061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default:
285161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_AVCProfileMax;
285261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                status = false;
285361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
285461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
285561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
285661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!status) {
285761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return status;
285861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
285961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
286061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (profile_level.level) {
286161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H264_1:
286261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel1;
286361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
286461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H264_1b:
286561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel1b;
286661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
286761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H264_1p1:
286861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel11;
286961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
287061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H264_1p2:
287161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel12;
287261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
287361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H264_1p3:
287461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel13;
287561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
287661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H264_2:
287761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel2;
287861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
287961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H264_2p1:
288061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel21;
288161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
288261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H264_2p2:
288361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel22;
288461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
288561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H264_3:
288661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel3;
288761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
288861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H264_3p1:
288961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel31;
289061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
289161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H264_3p2:
289261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel32;
289361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
289461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H264_4:
289561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel4;
289661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
289761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default :
289861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevelMax;
289961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                status = false;
290061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
290161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
290261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
290361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
290461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
290547e37c4428509524ee576920a98381f3e4872493Nick Pelly}
290647e37c4428509524ee576920a98381f3e4872493Nick Pelly
290747e37c4428509524ee576920a98381f3e4872493Nick Pellybool venc_dev::venc_validate_profile_level(OMX_U32 *eProfile, OMX_U32 *eLevel)
290847e37c4428509524ee576920a98381f3e4872493Nick Pelly{
290961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 new_profile = 0, new_level = 0;
291061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned const int *profile_tbl = NULL;
291161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 mb_per_frame, mb_per_sec;
291261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool profile_level_found = false;
291361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
29148767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan    DEBUG_PRINT_LOW("Init profile table for respective codec");
291561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
291661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //validate the ht,width,fps,bitrate and set the appropriate profile and level
291761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_sVenc_cfg.codectype == VEN_CODEC_MPEG4) {
291861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eProfile == 0) {
291961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!m_profile_set) {
292061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
292161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
292261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                switch (codec_profile.profile) {
292361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    case VEN_PROFILE_MPEG4_ASP:
292461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        *eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
292561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
292661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    case VEN_PROFILE_MPEG4_SP:
292761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
292861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
292961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    default:
29308767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_LOW("%s(): Unknown Error", __func__);
293161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
293261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
293361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
293447e37c4428509524ee576920a98381f3e4872493Nick Pelly        }
293561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
293661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eLevel == 0 && !m_level_set) {
293761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            *eLevel = OMX_VIDEO_MPEG4LevelMax;
293861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
293961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
294061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eProfile == OMX_VIDEO_MPEG4ProfileSimple) {
294161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_tbl = (unsigned int const *)mpeg4_profile_level_table;
294261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (*eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple) {
294361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_tbl = (unsigned int const *)
294461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (&mpeg4_profile_level_table[MPEG4_ASP_START]);
294561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
29468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Unsupported MPEG4 profile type %lu", *eProfile);
294747e37c4428509524ee576920a98381f3e4872493Nick Pelly            return false;
294847e37c4428509524ee576920a98381f3e4872493Nick Pelly        }
294961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_sVenc_cfg.codectype == VEN_CODEC_H264) {
295061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eProfile == 0) {
295161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!m_profile_set) {
295261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_AVCProfileBaseline;
295361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
295461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                switch (codec_profile.profile) {
295561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    case VEN_PROFILE_H264_BASELINE:
295661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        *eProfile = OMX_VIDEO_AVCProfileBaseline;
295761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
2958e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifndef _MSM8610_
295961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    case VEN_PROFILE_H264_MAIN:
296061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        *eProfile = OMX_VIDEO_AVCProfileMain;
296161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
296261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    case VEN_PROFILE_H264_HIGH:
296361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        *eProfile = OMX_VIDEO_AVCProfileHigh;
296461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
2965e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif
296661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    default:
2967e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        DEBUG_PRINT_LOW("%s(): Unsupported profile %x", __func__, codec_profile.profile);
296861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
296961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
297061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
297147e37c4428509524ee576920a98381f3e4872493Nick Pelly        }
297261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
297361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eLevel == 0 && !m_level_set) {
297461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            *eLevel = OMX_VIDEO_AVCLevelMax;
297561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
297661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
297761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eProfile == OMX_VIDEO_AVCProfileBaseline) {
297861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_tbl = (unsigned int const *)h264_profile_level_table;
297961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (*eProfile == OMX_VIDEO_AVCProfileHigh) {
298061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_tbl = (unsigned int const *)
298161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (&h264_profile_level_table[H264_HP_START]);
298261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (*eProfile == OMX_VIDEO_AVCProfileMain) {
298361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_tbl = (unsigned int const *)
298461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (&h264_profile_level_table[H264_MP_START]);
298561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
29868767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Unsupported AVC profile type %lu", *eProfile);
298747e37c4428509524ee576920a98381f3e4872493Nick Pelly            return false;
298847e37c4428509524ee576920a98381f3e4872493Nick Pelly        }
298961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_sVenc_cfg.codectype == VEN_CODEC_H263) {
299061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eProfile == 0) {
299161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!m_profile_set) {
299261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_H263ProfileBaseline;
299361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
299461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                switch (codec_profile.profile) {
299561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    case VEN_PROFILE_H263_BASELINE:
299661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        *eProfile = OMX_VIDEO_H263ProfileBaseline;
299761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
299861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    default:
29998767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                        DEBUG_PRINT_LOW("%s(): Unknown Error", __func__);
300061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
300161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
300261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
300347e37c4428509524ee576920a98381f3e4872493Nick Pelly        }
300461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
300561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eLevel == 0 && !m_level_set) {
300661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            *eLevel = OMX_VIDEO_H263LevelMax;
300761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
300861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
300961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eProfile == OMX_VIDEO_H263ProfileBaseline) {
301061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_tbl = (unsigned int const *)h263_profile_level_table;
301161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
30128767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan            DEBUG_PRINT_LOW("Unsupported H.263 profile type %lu", *eProfile);
301347e37c4428509524ee576920a98381f3e4872493Nick Pelly            return false;
301447e37c4428509524ee576920a98381f3e4872493Nick Pelly        }
301561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
30168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("Invalid codec type");
301747e37c4428509524ee576920a98381f3e4872493Nick Pelly        return false;
301861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
301961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
302061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    mb_per_frame = ((m_sVenc_cfg.input_height + 15) >> 4)*
302161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ((m_sVenc_cfg.input_width + 15)>> 4);
302261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
302361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((mb_per_frame >= 3600) && (m_sVenc_cfg.codectype == VEN_CODEC_MPEG4)) {
302461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (codec_profile.profile == VEN_PROFILE_MPEG4_ASP)
302561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_level.level = VEN_LEVEL_MPEG4_5;
302661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
302761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (codec_profile.profile == VEN_PROFILE_MPEG4_SP)
302861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_level.level = VEN_LEVEL_MPEG4_6;
302961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
303047e37c4428509524ee576920a98381f3e4872493Nick Pelly        {
303161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            new_level = profile_level.level;
303261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            new_profile = codec_profile.profile;
303361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return true;
303461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
303561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
303661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
303761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    mb_per_sec = mb_per_frame * m_sVenc_cfg.fps_num / m_sVenc_cfg.fps_den;
303861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
303961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    do {
304061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (mb_per_frame <= (int)profile_tbl[0]) {
304161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (mb_per_sec <= (int)profile_tbl[1]) {
304261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_sVenc_cfg.targetbitrate <= (int)profile_tbl[2]) {
304361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    new_level = (int)profile_tbl[3];
304461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    new_profile = (int)profile_tbl[4];
304561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    profile_level_found = true;
30468767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan                    DEBUG_PRINT_LOW("Appropriate profile/level found %d/%d", new_profile, new_level);
304761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
304861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
304961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
305047e37c4428509524ee576920a98381f3e4872493Nick Pelly        }
305161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
305261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        profile_tbl = profile_tbl + 5;
305361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } while (profile_tbl[0] != 0);
305461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
305561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (profile_level_found != true) {
30568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        DEBUG_PRINT_LOW("ERROR: Unsupported profile/level");
305761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
305861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
305961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
306061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((*eLevel == OMX_VIDEO_MPEG4LevelMax) || (*eLevel == OMX_VIDEO_AVCLevelMax)
306161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            || (*eLevel == OMX_VIDEO_H263LevelMax)) {
306261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *eLevel = new_level;
306361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
306461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
306561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("%s: Returning with eProfile = %lu"
306661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            "Level = %lu", __func__, *eProfile, *eLevel);
306761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
306861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
306947e37c4428509524ee576920a98381f3e4872493Nick Pelly}
3070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_max_allowed_bitrate_check(OMX_U32 nTargetBitrate)
307247e37c4428509524ee576920a98381f3e4872493Nick Pelly{
307361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned const int *profile_tbl = NULL;
307461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
307561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch (m_sVenc_cfg.codectype) {
307661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VEN_CODEC_MPEG4:
307761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
307861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_eProfile == OMX_VIDEO_MPEG4ProfileSimple) {
307961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profile_tbl = (unsigned int const *)mpeg4_profile_level_table;
308061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (m_eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple) {
308161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profile_tbl = (unsigned int const *)
308261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (&mpeg4_profile_level_table[MPEG4_ASP_START]);
308361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
308461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Unsupported MPEG4 profile type %lu", m_eProfile);
308561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return false;
308661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
308761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
308861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
308961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VEN_CODEC_H264:
309061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
309161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_eProfile == OMX_VIDEO_AVCProfileBaseline) {
309261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profile_tbl = (unsigned int const *)h264_profile_level_table;
309361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (m_eProfile == OMX_VIDEO_AVCProfileHigh) {
309461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profile_tbl = (unsigned int const *)
309561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (&h264_profile_level_table[H264_HP_START]);
309661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (m_eProfile == OMX_VIDEO_AVCProfileMain) {
309761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profile_tbl = (unsigned int const *)
309861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (&h264_profile_level_table[H264_MP_START]);
309961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
310061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Unsupported AVC profile type %lu", m_eProfile);
310161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return false;
310261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
310361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
310461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
310561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case VEN_CODEC_H263:
310661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
310761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (m_eProfile == OMX_VIDEO_H263ProfileBaseline) {
310861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                profile_tbl = (unsigned int const *)h263_profile_level_table;
310961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
311061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Unsupported H.263 profile type %lu", m_eProfile);
311161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return false;
311261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
311361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
311461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
311561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
311661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("%s: unknown codec type", __func__);
311761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
311847e37c4428509524ee576920a98381f3e4872493Nick Pelly    }
311961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
312061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (profile_tbl[0] != 0) {
312161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (profile_tbl[3] == m_eLevel) {
312261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (nTargetBitrate > profile_tbl[2]) {
312361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Max. supported bitrate for Profile[%d] & Level[%d]"
312461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        " is %u", m_eProfile, m_eLevel, profile_tbl[2]);
312561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return false;
312661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
312761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
312861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
312961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        profile_tbl += 5;
313061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
313161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
313261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
3133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_
3136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_meta_mode(bool mode)
3137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
313861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_ioctl_msg ioctl_msg = {NULL,NULL};
313961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ioctl_msg.in = &mode;
314061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("Set meta buffer mode: %d", mode);
314161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
314261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(m_nDriver_fd,VEN_IOCTL_SET_METABUFFER_MODE,&ioctl_msg) < 0) {
314361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR(" Set meta buffer mode failed");
314461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
314561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
314661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
314761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
314847e37c4428509524ee576920a98381f3e4872493Nick Pelly}
3149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3150