1826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*--------------------------------------------------------------------------
2dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandCopyright (c) 2012, Code Aurora Forum. All rights reserved.
3826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRedistribution and use in source and binary forms, with or without
5826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevmodification, are permitted provided that the following conditions are met:
6826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    * Redistributions of source code must retain the above copyright
7826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      notice, this list of conditions and the following disclaimer.
8826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    * Redistributions in binary form must reproduce the above copyright
9826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      notice, this list of conditions and the following disclaimer in the
10826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      documentation and/or other materials provided with the distribution.
11dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    * Neither the name of Code Aurora nor
12826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      the names of its contributors may be used to endorse or promote
13826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      products derived from this software without specific prior written
14826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      permission.
15826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
16826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevIMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevNON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev--------------------------------------------------------------------------*/
28826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include<string.h>
29826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/ioctl.h>
30826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/prctl.h>
31dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#include<unistd.h>
32826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <fcntl.h>
33dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#include "video_encoder_device_copper.h"
34826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include "omx_video_encoder.h"
35826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
36278952ff92fab2da0c47b912daeb662130676be1Haynes Mathew George#include <linux/msm_ion.h>
3717a028aa01f5fb339a32c13bb65e1b129c024796Deva Ramasubramanian#else
3817a028aa01f5fb339a32c13bb65e1b129c024796Deva Ramasubramanian#include <linux/android_pmem.h>
39826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
40826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
41826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MPEG4_SP_START 0
42826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MPEG4_ASP_START (MPEG4_SP_START + 8)
43826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MPEG4_720P_LEVEL 6
44826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define H263_BP_START 0
45826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define H264_BP_START 0
46826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define H264_HP_START (H264_BP_START + 13)
47826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define H264_MP_START (H264_BP_START + 26)
48826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
49826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* MPEG4 profile and level table*/
50826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic const unsigned int mpeg4_profile_level_table[][5]=
51826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
52826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*max mb per frame, max mb per sec, max bitrate, level, profile*/
53826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,64000,OMX_VIDEO_MPEG4Level0,OMX_VIDEO_MPEG4ProfileSimple},
54826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,64000,OMX_VIDEO_MPEG4Level1,OMX_VIDEO_MPEG4ProfileSimple},
55826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,5940,128000,OMX_VIDEO_MPEG4Level2,OMX_VIDEO_MPEG4ProfileSimple},
56826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,384000,OMX_VIDEO_MPEG4Level3,OMX_VIDEO_MPEG4ProfileSimple},
57826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1200,36000,4000000,OMX_VIDEO_MPEG4Level4a,OMX_VIDEO_MPEG4ProfileSimple},
58826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1620,40500,8000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple},
59826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {3600,108000,12000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple},
60826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {0,0,0,0,0},
61826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
62826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,128000,OMX_VIDEO_MPEG4Level0,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
63826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,128000,OMX_VIDEO_MPEG4Level1,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
64826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,5940,384000,OMX_VIDEO_MPEG4Level2,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
65826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,768000,OMX_VIDEO_MPEG4Level3,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
66826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {792,23760,3000000,OMX_VIDEO_MPEG4Level4,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
67826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1620,48600,8000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
68826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {0,0,0,0,0},
69826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev};
70826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
71826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* H264 profile and level table*/
72826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic const unsigned int h264_profile_level_table[][5]=
73826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
74826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     /*max mb per frame, max mb per sec, max bitrate, level, profile*/
75826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,64000,OMX_VIDEO_AVCLevel1,OMX_VIDEO_AVCProfileBaseline},
76826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,128000,OMX_VIDEO_AVCLevel1b,OMX_VIDEO_AVCProfileBaseline},
77826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,3000,192000,OMX_VIDEO_AVCLevel11,OMX_VIDEO_AVCProfileBaseline},
78826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,6000,384000,OMX_VIDEO_AVCLevel12,OMX_VIDEO_AVCProfileBaseline},
79826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,768000,OMX_VIDEO_AVCLevel13,OMX_VIDEO_AVCProfileBaseline},
80826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,2000000,OMX_VIDEO_AVCLevel2,OMX_VIDEO_AVCProfileBaseline},
81826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {792,19800,4000000,OMX_VIDEO_AVCLevel21,OMX_VIDEO_AVCProfileBaseline},
82826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1620,20250,4000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileBaseline},
83826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1620,40500,10000000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileBaseline},
84826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {3600,108000,14000000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileBaseline},
85826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {5120,216000,20000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileBaseline},
86826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {8192,245760,20000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileBaseline},
87826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {0,0,0,0,0},
88826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
89826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,64000,OMX_VIDEO_AVCLevel1,OMX_VIDEO_AVCProfileHigh},
90826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,160000,OMX_VIDEO_AVCLevel1b,OMX_VIDEO_AVCProfileHigh},
91826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,3000,240000,OMX_VIDEO_AVCLevel11,OMX_VIDEO_AVCProfileHigh},
92826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,6000,480000,OMX_VIDEO_AVCLevel12,OMX_VIDEO_AVCProfileHigh},
93826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,960000,OMX_VIDEO_AVCLevel13,OMX_VIDEO_AVCProfileHigh},
94826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,2500000,OMX_VIDEO_AVCLevel2,OMX_VIDEO_AVCProfileHigh},
95826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {792,19800,5000000,OMX_VIDEO_AVCLevel21,OMX_VIDEO_AVCProfileHigh},
96826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1620,20250,5000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileHigh},
97826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1620,40500,12500000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileHigh},
98826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {3600,108000,17500000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileHigh},
99826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {5120,216000,25000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileHigh},
100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {8192,245760,25000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileHigh},
101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {0,0,0,0,0},
102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,64000,OMX_VIDEO_AVCLevel1,OMX_VIDEO_AVCProfileMain},
104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,128000,OMX_VIDEO_AVCLevel1b,OMX_VIDEO_AVCProfileMain},
105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,3000,192000,OMX_VIDEO_AVCLevel11,OMX_VIDEO_AVCProfileMain},
106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,6000,384000,OMX_VIDEO_AVCLevel12,OMX_VIDEO_AVCProfileMain},
107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,768000,OMX_VIDEO_AVCLevel13,OMX_VIDEO_AVCProfileMain},
108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,2000000,OMX_VIDEO_AVCLevel2,OMX_VIDEO_AVCProfileMain},
109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {792,19800,4000000,OMX_VIDEO_AVCLevel21,OMX_VIDEO_AVCProfileMain},
110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1620,20250,4000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileMain},
111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1620,40500,10000000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileMain},
112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {3600,108000,14000000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileMain},
113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {5120,216000,20000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileMain},
114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {8192,245760,20000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileMain},
115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {0,0,0,0,0}
116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev};
118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* H263 profile and level table*/
120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic const unsigned int h263_profile_level_table[][5]=
121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*max mb per frame, max mb per sec, max bitrate, level, profile*/
123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,64000,OMX_VIDEO_H263Level10,OMX_VIDEO_H263ProfileBaseline},
124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,5940,128000,OMX_VIDEO_H263Level20,OMX_VIDEO_H263ProfileBaseline},
125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,384000,OMX_VIDEO_H263Level30,OMX_VIDEO_H263ProfileBaseline},
126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,2048000,OMX_VIDEO_H263Level40,OMX_VIDEO_H263ProfileBaseline},
127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,128000,OMX_VIDEO_H263Level45,OMX_VIDEO_H263ProfileBaseline},
128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,19800,4096000,OMX_VIDEO_H263Level50,OMX_VIDEO_H263ProfileBaseline},
129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {810,40500,8192000,OMX_VIDEO_H263Level60,OMX_VIDEO_H263ProfileBaseline},
130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1620,81000,16384000,OMX_VIDEO_H263Level70,OMX_VIDEO_H263ProfileBaseline},
131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {0,0,0,0,0}
132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev};
133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Log2(number, power)  { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) &&  power < 16) { temp >>=0x1; power++; } }
135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power);  num = q >> power; den = 0x1 << (16 - power); }
136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *inputBufferFile1;
139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar inputfilename [] = "/data/input.yuv";
140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *outputBufferFile1;
143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar outputfilename [] = "/data/output-bitstream.\0\0\0\0";
144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//constructor
146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvenc_dev::venc_dev(class omx_venc *venc_class)
147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
148dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand//nothing to do
149dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandvenc_handle = venc_class;
150dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandetb_count=0;
151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvenc_dev::~venc_dev()
154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //nothing to do
156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid* async_venc_message_thread (void *input)
159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct venc_timeout timeout;
161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct venc_msg venc_msg;
162dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   omx_video* omx_venc_base = NULL;
163dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   omx_venc *omx = reinterpret_cast<omx_venc*>(input);
164dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   omx_venc_base = reinterpret_cast<omx_video*>(input);
165dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   OMX_BUFFERHEADERTYPE* omxhdr = NULL;
1666eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  prctl(PR_SET_NAME, (unsigned long)"VideoEncCallBackThread", 0, 0, 0);
169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  timeout.millisec = VEN_TIMEOUT_INFINITE;
170dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct v4l2_plane plane;
171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct pollfd pfd;
172dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct v4l2_buffer v4l2_buf ={0};
173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct v4l2_event dqevent;
174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pfd.events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI;
175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pfd.fd = omx->handle->m_nDriver_fd;
176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int error_code = 0,rc=0;
177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while(1)
178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
179dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    	rc = poll(&pfd, 1, TIMEOUT);
180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		if (!rc) {
181dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			printf("Poll timedout\n");
182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			break;
183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		} else if (rc < 0) {
184dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			printf("Error while polling: %d\n", rc);
185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			break;
186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		if ((pfd.revents & POLLIN) || (pfd.revents & POLLRDNORM)) {
188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			v4l2_buf.memory = V4L2_MEMORY_USERPTR;
190dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			v4l2_buf.length = 1;
191dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			v4l2_buf.m.planes = &plane;
192dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			rc = ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf);
193dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			if (rc) {
194dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand				printf("Failed to dequeue buf: %d from capture capability\n", rc);
195dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand				break;
196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			}
197dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			venc_msg.msgcode=VEN_MSG_OUTPUT_BUFFER_DONE;
198dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			venc_msg.statuscode=VEN_S_SUCCESS;
199dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                        omxhdr=omx_venc_base->m_out_mem_ptr+v4l2_buf.index;
200dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			venc_msg.buf.len= v4l2_buf.m.planes->bytesused;
201dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                        venc_msg.buf.offset = v4l2_buf.m.planes->reserved[1];
202dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                	venc_msg.buf.ptrbuffer = (OMX_U8 *)omx_venc_base->m_pOutput_pmem[v4l2_buf.index].buffer;
203dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
204dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			venc_msg.buf.clientdata=(void*)omxhdr;
205dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		} else if((pfd.revents & POLLOUT) || (pfd.revents & POLLWRNORM)) {
206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			v4l2_buf.memory = V4L2_MEMORY_USERPTR;
208dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			v4l2_buf.m.planes = &plane;
209dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			rc = ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf);
210dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			if (rc) {
211dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand				printf("Failed to dequeue buf: %d from output capability\n", rc);
212dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand				break;
213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			}
214dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                        venc_msg.msgcode=VEN_MSG_INPUT_BUFFER_DONE;
215dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			venc_msg.statuscode=VEN_S_SUCCESS;
216dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                        omxhdr=omx_venc_base->m_inp_mem_ptr+v4l2_buf.index;
217dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                        venc_msg.buf.clientdata=(void*)omxhdr;
218dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		} else if (pfd.revents & POLLPRI){
219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			rc = ioctl(pfd.fd, VIDIOC_DQEVENT, &dqevent);
220dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			printf("\n Data Recieved = %d \n",dqevent.u.data[0]);
221dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			if(dqevent.u.data[0] == MSM_VIDC_CLOSE_DONE){
222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				break;
223dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			}
224dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		} else {
22561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan			/*TODO: How to handle this case */
226dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			continue;
227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
228b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand
229dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		if(omx->async_message_process(input,&venc_msg) < 0)
230dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		{
231dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			DEBUG_PRINT_ERROR("\nERROR: Wrong ioctl message");
232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			break;
233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
235dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT_HIGH("omx_venc: Async Thread exit\n");
236dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return NULL;
237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_open(OMX_U32 codec)
240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int r;
242dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  unsigned int   alignment = 0,buffer_size = 0, temp =0;
243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_nDriver_fd = open ("/dev/video33",O_RDWR);
245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_nDriver_fd == 0)
246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("ERROR: Got fd as 0 for msm_vidc_enc, Opening again\n");
248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_nDriver_fd = open ("/dev/video33",O_RDWR);
249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if((int)m_nDriver_fd < 0)
252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("ERROR: Omx_venc::Comp Init Returning failure\n");
254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\nm_nDriver_fd = %d\n", m_nDriver_fd);
258dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#ifdef SINGLE_ENCODER_INSTANCE
259dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  OMX_U32 num_instances = 0;
260dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if(/*ioctl (m_nDriver_fd, VEN_IOCTL_GET_NUMBER_INSTANCES, (void*)&ioctl_msg) < */0 )
261dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
262dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_ERROR("\nERROR: Request number of encoder instances failed");
263dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
264dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  else if (num_instances > 1)
265dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
266dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_ERROR("\nSecond encoder instance rejected!");
267dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    venc_close();
268dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return false;
269dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
270dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#endif
271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  // set the basic configuration of the video encoder driver
272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_sVenc_cfg.input_width = OMX_CORE_QCIF_WIDTH;
273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_sVenc_cfg.input_height= OMX_CORE_QCIF_HEIGHT;
274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_sVenc_cfg.dvs_width = OMX_CORE_QCIF_WIDTH;
275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_sVenc_cfg.dvs_height = OMX_CORE_QCIF_HEIGHT;
276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_sVenc_cfg.fps_num = 30;
277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_sVenc_cfg.fps_den = 1;
278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_sVenc_cfg.targetbitrate = 64000;
279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_sVenc_cfg.inputformat= V4L2_PIX_FMT_NV12;
280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(codec == OMX_VIDEO_CodingMPEG4)
281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_sVenc_cfg.codectype = V4L2_PIX_FMT_MPEG4;
283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    codec_profile.profile = V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE;
284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    profile_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_2;
285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    strcat(outputfilename, "m4v");
287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(codec == OMX_VIDEO_CodingH263)
290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_sVenc_cfg.codectype = V4L2_PIX_FMT_H263;
292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    codec_profile.profile = VEN_PROFILE_H263_BASELINE;
293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    profile_level.level = VEN_LEVEL_H263_20;
294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    strcat(outputfilename, "263");
296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(codec == OMX_VIDEO_CodingAVC)
299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_sVenc_cfg.codectype = V4L2_PIX_FMT_H264;
301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    codec_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE;
302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    profile_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_0;
303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    strcat(outputfilename, "264");
305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
307dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_BASE_CFG,(void*)&ioctl_msg) < */0 )
308dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
309dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_ERROR("\nERROR: Request for setting base configuration failed");
310dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return false;
311dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  inputBufferFile1 = fopen (inputfilename, "ab");
314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  outputBufferFile1 = fopen (outputfilename, "ab");
317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
31861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan	int ret;
319dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	struct v4l2_event_subscription sub;
320dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	sub.type=V4L2_EVENT_ALL;
321dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	ret = ioctl(m_nDriver_fd, VIDIOC_SUBSCRIBE_EVENT, &sub);
322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (ret) {
323dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("\n Subscribe Event Failed \n");
324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_capability cap;
327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_fmtdesc fdesc;
328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_format fmt;
329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_requestbuffers bufreq;
330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		ret = ioctl(m_nDriver_fd, VIDIOC_QUERYCAP, &cap);
332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		if (ret) {
333dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		  printf("Failed to query capabilities\n");
334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		} else {
335dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		  printf("Capabilities: driver_name = %s, card = %s, bus_info = %s,"
336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				" version = %d, capabilities = %x\n", cap.driver, cap.card,
337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				cap.bus_info, cap.version, cap.capabilities);
338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
339dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		//printf(" \n VIDIOC_QUERYCAP Successful  \n ");
340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		ret=0;
341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fdesc.index=0;
343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		while (ioctl(m_nDriver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
344dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			printf("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description,
345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					fdesc.pixelformat, fdesc.flags);
346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			fdesc.index++;
347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
348dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		//printf("\n VIDIOC_ENUM_FMT CAPTURE Successful  \n ");
349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fdesc.index=0;
351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		while (ioctl(m_nDriver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
352dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
353dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			printf("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description,
354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					fdesc.pixelformat, fdesc.flags);
355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			fdesc.index++;
356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
357dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		//printf(" \n VIDIOC_ENUM_FMT OUTPUT Successful \n ");
35861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_sOutput_buff_property.alignment=m_sInput_buff_property.alignment=4096;
360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
361b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand		fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
364b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand		fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV12;
36561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		ret = ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt);
367dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		//printf(" \n VIDIOC_S_FMT OUTPUT Successful \n ");
368b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand		m_sInput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
369dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		//printf("m_sInput_buff_property.datasize = %d\n",m_sInput_buff_property.datasize);
370dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
371dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
372dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
373dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
374dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_H264;
37561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
376dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		ret = ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt);
377dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		//printf(" \n VIDIOC_S_FMT CAPTURE Successful \n ");
378dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		m_sOutput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
379dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		//printf("m_sOutput_buff_property.datasize = %d\n",m_sOutput_buff_property.datasize);
38061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan//		struct v4l2_requestbuffers bufreq;
381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		bufreq.memory = V4L2_MEMORY_USERPTR;
383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		bufreq.count = 2;
384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		ret = ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq);
387dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		m_sInput_buff_property.mincount=m_sInput_buff_property.maxcount=m_sInput_buff_property.actualcount=bufreq.count;
388dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		//printf(" \n VIDIOC_REQBUFS OUTPUT Successful \n ");
389dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		//printf("m_sInput_buff_property.datasize = %d\n",m_sInput_buff_property.datasize);
390dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		//printf("m_sInput_buff_property.mincount = %d\n",m_sInput_buff_property.mincount);
391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		bufreq.count = 2;
393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		ret = ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq);
394dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		m_sOutput_buff_property.mincount=m_sOutput_buff_property.maxcount=m_sOutput_buff_property.actualcount=bufreq.count;
395dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		//printf(" \n VIDIOC_REQBUFS CAPTURE Successful  \n ");
396dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		//printf("m_sInput_buff_property.mincount = %d\n",m_sOutput_buff_property.mincount);
397b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand
398dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if(/*ioctl (m_nDriver_fd,VEN_IOCTL_GET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < */0)
399dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
400dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_ERROR("\nERROR: Request for getting i/p buffer requirement failed");
401dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return false;
402dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
403dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if(/*ioctl (m_nDriver_fd,VEN_IOCTL_GET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < */0)
404dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
405dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_ERROR("\nERROR: Request for getting o/p buffer requirement failed");
406dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return false;
407dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
408dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	///printf("\n \n Setting Profile and Level \n \n ");
409dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  //m_profile_set = false;
410dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  //m_level_set = false;
411dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if(/*venc_set_profile_level(0, 0)*/0)
412dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
413dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_HIGH("\n %s(): Init Profile/Level setting success",
414dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        __func__);
415dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
416dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  recon_buffers_count = MAX_RECON_BUFFERS;
417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid venc_dev::venc_close()
421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\nvenc_close: fd = %d", m_nDriver_fd);
423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if((int)m_nDriver_fd >= 0)
424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
425dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_HIGH("\n venc_close(): Calling VEN_IOCTL_CMD_STOP_READ_MSG");
426dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    //(void)ioctl(m_nDriver_fd, VEN_IOCTL_CMD_STOP_READ_MSG,
427dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      //  NULL);
428dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_LOW("\nCalling close()\n");
429dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
430dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         int rc=0;
431dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	 enum v4l2_buf_type btype;
432dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	 btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
433dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	 rc = ioctl(m_nDriver_fd, VIDIOC_STREAMOFF, &btype);
434dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	 if (rc) {
43561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan		/* STREAMOFF will never fail */
436dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("\n Failed to call streamoff on OUTPUT Port \n");
437dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		}
438dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	 btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
43961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
440dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	 rc = ioctl(m_nDriver_fd, VIDIOC_STREAMOFF, &btype);
441dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	 if (rc) {
44261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan		/* STREAMOFF will never fail */
443dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("\n Failed to call streamoff on CAPTURE Port \n");
444dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		}
445dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        struct v4l2_event_subscription sub;
446dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	sub.type=V4L2_EVENT_ALL;
447dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	rc = ioctl(m_nDriver_fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
448dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	if (rc) {
449dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("Failed to get control\n");
450dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		return ;
451dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	}
452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    close(m_nDriver_fd);
453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_nDriver_fd = -1;
454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  fclose (inputBufferFile1);
457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  fclose (outputBufferFile1);
460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_buf_req(unsigned long *min_buff_count,
464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                unsigned long *actual_buff_count,
465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                unsigned long *buff_size,
466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                unsigned long port)
467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
4686eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned long temp_count = 0;
470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(port == 0)
472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(*actual_buff_count > m_sInput_buff_property.mincount)
474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      temp_count = m_sInput_buff_property.actualcount;
476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_sInput_buff_property.actualcount = *actual_buff_count;
477dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < */0)
478dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      {
479dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT_ERROR("\nERROR: Request for setting i/p buffer requirement failed");
480dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        m_sInput_buff_property.actualcount = temp_count;
481dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        return false;
482dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n I/P Count set to %lu\n", *actual_buff_count);
484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(*actual_buff_count > m_sOutput_buff_property.mincount)
489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  temp_count = m_sOutput_buff_property.actualcount;
491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_sOutput_buff_property.actualcount = *actual_buff_count;
492dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < */0)
493dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      {
494dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT_ERROR("\nERROR: Request for setting o/p buffer requirement failed");
495dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		m_sOutput_buff_property.actualcount = temp_count;
496dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        return false;
497dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n O/P Count set to %lu\n", *actual_buff_count);
499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_loaded_start()
507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_loaded_stop()
512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_loaded_start_done()
517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_loaded_stop_done()
522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_get_seq_hdr(void *buffer,
527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    unsigned buffer_size, unsigned *header_len)
528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_get_buf_req(unsigned long *min_buff_count,
533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                unsigned long *actual_buff_count,
534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                unsigned long *buff_size,
535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                unsigned long port)
536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_format fmt;
538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_requestbuffers bufreq;
539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int ret;
540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(port == 0)
541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
542dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if(/*ioctl (m_nDriver_fd,VEN_IOCTL_GET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < */0)
543dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
544dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT_ERROR("\nERROR: Request for getting i/p buffer requirement failed");
545dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      return false;
546dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
547dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV12;
552dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		ret = ioctl(m_nDriver_fd, VIDIOC_G_FMT, &fmt);
553dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		//printf(" \n VIDIOC_S_FMT OUTPUT Successful \n ");
554dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		m_sInput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
555dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
556dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandbufreq.memory = V4L2_MEMORY_USERPTR;
557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		bufreq.count = 2;
558dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
559dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
560dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		ret = ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq);
561dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		m_sInput_buff_property.mincount=m_sInput_buff_property.maxcount=m_sInput_buff_property.actualcount=bufreq.count;
56261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
563dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *min_buff_count = m_sInput_buff_property.mincount;
565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *actual_buff_count = m_sInput_buff_property.actualcount;
566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
567dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    // For ION memory allocations of the allocated buffer size
568dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    // must be 4k aligned, hence aligning the input buffer
569dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    // size to 4k.
570dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    m_sInput_buff_property.datasize = (m_sInput_buff_property.datasize + 4095)
571dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                                       & (~4095);
572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
573dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    *buff_size = m_sInput_buff_property.datasize;
574dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
575dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  else
576dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
577dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if(/*ioctl (m_nDriver_fd,VEN_IOCTL_GET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < */0)
578dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
579dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT_ERROR("\nERROR: Request for getting o/p buffer requirement failed");
580dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      return false;
581dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
582dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
586dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_H264;
58761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		ret = ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt);
589dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		//printf(" \n VIDIOC_S_FMT CAPTURE Successful \n ");
590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_sOutput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
594dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_H264;
59561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		ret = ioctl(m_nDriver_fd, VIDIOC_G_FMT, &fmt);
597dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		//printf(" \n VIDIOC_S_FMT CAPTURE Successful \n ");
598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_sOutput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
599dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
600dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
601dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    *min_buff_count = m_sOutput_buff_property.mincount;
602dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    *actual_buff_count = m_sOutput_buff_property.actualcount;
603dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    *buff_size = m_sOutput_buff_property.datasize;
604dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
605dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
606dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return true;
607dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_param(void *paramData,OMX_INDEXTYPE index )
611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("venc_set_param:: venc-720p\n");
613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  switch(index)
614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_IndexParamPortDefinition:
616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamPortDefinition\n");
620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(portDefn->nPortIndex == PORT_INDEX_IN)
621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_color_format(portDefn->format.video.eColorFormat))
623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(m_sVenc_cfg.input_height != portDefn->format.video.nFrameHeight ||
627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_sVenc_cfg.input_width != portDefn->format.video.nFrameWidth)
628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("\n Basic parameter has changed");
630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_sVenc_cfg.input_height = portDefn->format.video.nFrameHeight;
631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_sVenc_cfg.input_width = portDefn->format.video.nFrameWidth;
632dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
633dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_BASE_CFG,(void*)&ioctl_msg) < */0)
634dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          {
635dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            DEBUG_PRINT_ERROR("\nERROR: Request for setting base config failed");
636dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            return false;
637dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          }
638dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
639dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          DEBUG_PRINT_LOW("\n Updating the buffer count/size for the new resolution");
640dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          if(/*ioctl (m_nDriver_fd, VEN_IOCTL_GET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < */0)
641dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          {
642dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            DEBUG_PRINT_ERROR("\nERROR: Request for getting i/p bufreq failed");
643dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            return false;
644dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          }
645dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          DEBUG_PRINT_LOW("\n Got updated m_sInput_buff_property values: "
646dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      "datasize = %u, maxcount = %u, actualcnt = %u, "
647dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      "mincount = %u", m_sInput_buff_property.datasize,
648dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      m_sInput_buff_property.maxcount, m_sInput_buff_property.actualcount,
649dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      m_sInput_buff_property.mincount);
650dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
651dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          if(/*ioctl (m_nDriver_fd, VEN_IOCTL_GET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < */0)
652dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          {
653dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            DEBUG_PRINT_ERROR("\nERROR: Request for getting o/p bufreq failed");
654dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            return false;
655dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          }
656dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
657dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          DEBUG_PRINT_LOW("\n Got updated m_sOutput_buff_property values: "
658dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      "datasize = %u, maxcount = %u, actualcnt = %u, "
659dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      "mincount = %u", m_sOutput_buff_property.datasize,
660dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      m_sOutput_buff_property.maxcount, m_sOutput_buff_property.actualcount,
661dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      m_sOutput_buff_property.mincount);
662dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          if(/*ioctl (m_nDriver_fd, VEN_IOCTL_SET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) <*/ 0)
663dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          {
664dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            DEBUG_PRINT_ERROR("\nERROR: Request for setting o/p bufreq failed");
665dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            return false;
666dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          }
667dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
668dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          if((portDefn->nBufferCountActual >= m_sInput_buff_property.mincount) &&
669dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           (portDefn->nBufferCountActual <= m_sInput_buff_property.maxcount))
670dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          {
671dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            m_sInput_buff_property.actualcount = portDefn->nBufferCountActual;
672dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            if(/*ioctl(m_nDriver_fd,VEN_IOCTL_SET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < */0)
673dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            {
674dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              DEBUG_PRINT_ERROR("\nERROR: Request for setting i/p buffer requirements failed");
675dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              return false;
676dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            }
677dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          }
678dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          if(m_sInput_buff_property.datasize != portDefn->nBufferSize)
679dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          {
680dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            DEBUG_PRINT_ERROR("\nWARNING: Requested i/p bufsize[%u],"
681dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                              "Driver's updated i/p bufsize = %u", portDefn->nBufferSize,
682dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                              m_sInput_buff_property.datasize);
683dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          }
684dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          m_level_set = false;
685dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          if(venc_set_profile_level(0, 0))
686dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          {
687dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            DEBUG_PRINT_HIGH("\n %s(): Profile/Level setting success", __func__);
688dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          }
689dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        }
690dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        else
691dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        {
692dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          if((portDefn->nBufferCountActual >= m_sInput_buff_property.mincount) &&
693dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand           (m_sInput_buff_property.maxcount >= portDefn->nBufferCountActual) &&
694dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            (m_sInput_buff_property.datasize == portDefn->nBufferSize))
695dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          {
696dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            m_sInput_buff_property.actualcount = portDefn->nBufferCountActual;
697dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < */0)
698dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            {
699dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              DEBUG_PRINT_ERROR("\nERROR: ioctl VEN_IOCTL_SET_INPUT_BUFFER_REQ failed");
700dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand              return false;
701dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            }
702dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          }
703dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          else
704dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          {
705dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            DEBUG_PRINT_ERROR("\nERROR: Setting Input buffer requirements failed");
706dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            return false;
707dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          }
708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(portDefn->nPortIndex == PORT_INDEX_OUT)
711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
712dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        if(!venc_set_encode_framerate(portDefn->format.video.xFramerate, 0))
713dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        {
714dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          return false;
715dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        }
716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_target_bitrate(portDefn->format.video.nBitrate, 0))
718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
722dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        if( (portDefn->nBufferCountActual >= m_sOutput_buff_property.mincount)
723dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            &&
724dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            (m_sOutput_buff_property.maxcount >= portDefn->nBufferCountActual)
725dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            &&
726dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            (m_sOutput_buff_property.datasize == portDefn->nBufferSize)
727dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          )
728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_sOutput_buff_property.actualcount = portDefn->nBufferCountActual;
730dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < */0)
731dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          {
732dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            DEBUG_PRINT_ERROR("\nERROR: ioctl VEN_IOCTL_SET_OUTPUT_BUFFER_REQ failed");
733dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            return false;
734dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          }
735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Setting Output buffer requirements failed");
739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamPortDefinition");
745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_IndexParamVideoPortFormat:
749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt;
751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portFmt =(OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoPortFormat\n");
753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(portFmt->nPortIndex == (OMX_U32) PORT_INDEX_IN)
755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_color_format(portFmt->eColorFormat))
757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(portFmt->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_encode_framerate(portFmt->xFramerate, 0))
764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoPortFormat");
771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_IndexParamVideoBitrate:
775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_VIDEO_PARAM_BITRATETYPE* pParam;
777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pParam = (OMX_VIDEO_PARAM_BITRATETYPE*)paramData;
778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoBitrate\n");
779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_target_bitrate(pParam->nTargetBitrate, 0))
783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Target Bit Rate setting failed");
785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_ratectrl_cfg(pParam->eControlRate))
788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Rate Control setting failed");
790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoBitrate");
796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_IndexParamVideoMpeg4:
800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_VIDEO_PARAM_MPEG4TYPE* pParam;
802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_U32 bFrames = 0;
803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pParam = (OMX_VIDEO_PARAM_MPEG4TYPE*)paramData;
805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoMpeg4\n");
806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_voptiming_cfg(pParam->nTimeIncRes))
809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Request for setting vop_timing failed");
811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_profile_set = false;
814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_level_set = false;
815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_profile_level (pParam->eProfile, pParam->eLevel))
816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating Profile and level");
818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else {
821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(pParam->eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple)
822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(pParam->nBFrames)
824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              bFrames = 1;
827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(pParam->nBFrames)
832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("Warning: B frames not supported\n");
834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              bFrames = 0;
835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_intra_period (pParam->nPFrames,bFrames))
839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_multislice_cfg(OMX_IndexParamVideoMpeg4,pParam->nSliceHeaderSpacing))
844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating slice_config");
846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoMpeg4");
852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_IndexParamVideoH263:
856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_VIDEO_PARAM_H263TYPE* pParam = (OMX_VIDEO_PARAM_H263TYPE*)paramData;
858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoH263\n");
859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_U32 bFrames = 0;
860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_profile_set = false;
863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_level_set = false;
864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_profile_level (pParam->eProfile, pParam->eLevel))
865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating Profile and level");
867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (pParam->nBFrames)
870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nWARNING: B frame not supported for H.263");
871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(venc_set_intra_period (pParam->nPFrames, bFrames) == false)
873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoH263");
881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_IndexParamVideoAvc:
885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoAvc\n");
887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_VIDEO_PARAM_AVCTYPE* pParam = (OMX_VIDEO_PARAM_AVCTYPE*)paramData;
888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_U32 bFrames = 0;
889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("pParam->eProfile :%d ,pParam->eLevel %d\n",
893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pParam->eProfile,pParam->eLevel);
894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_profile_set = false;
896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_level_set = false;
897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_profile_level (pParam->eProfile,pParam->eLevel))
899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating Profile and level %d, %d",
901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            pParam->eProfile, pParam->eLevel);
902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else {
905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(pParam->eProfile != OMX_VIDEO_AVCProfileBaseline)
906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(pParam->nBFrames)
908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              bFrames = 1;
911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(pParam->nBFrames)
916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("Warning: B frames not supported\n");
918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              bFrames = 0;
919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_intra_period (pParam->nPFrames, bFrames))
923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_entropy_config (pParam->bEntropyCodingCABAC, pParam->nCabacInitIdc))
928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Request for setting Entropy failed");
930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_inloop_filter (pParam->eLoopFilterMode))
933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Request for setting Inloop filter failed");
935dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		  printf("\n \n Returned here line line 903 \n \n ");
936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_multislice_cfg(OMX_IndexParamVideoAvc, pParam->nSliceHeaderSpacing))
939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nWARNING: Unsuccessful in updating slice_config");
941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoAvc");
947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //TBD, lot of other variables to be updated, yet to decide
949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_IndexParamVideoIntraRefresh:
952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoIntraRefresh\n");
954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_VIDEO_PARAM_INTRAREFRESHTYPE *intra_refresh =
955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (OMX_VIDEO_PARAM_INTRAREFRESHTYPE *)paramData;
956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(intra_refresh->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
958dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        if(/*venc_set_intra_refresh(intra_refresh->eRefreshMode, intra_refresh->nCirMBs) == */false)
959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Setting Intra refresh failed");
961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoIntraRefresh");
967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_IndexParamVideoErrorCorrection:
971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoErrorCorrection\n");
973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *error_resilience =
974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)paramData;
975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(error_resilience->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(venc_set_error_resilience(error_resilience) == false)
978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Setting Intra refresh failed");
980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoErrorCorrection");
986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_IndexParamVideoProfileLevelCurrent:
990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoProfileLevelCurrent\n");
992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_VIDEO_PARAM_PROFILELEVELTYPE *profile_level =
993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData;
994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(profile_level->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_profile_set = false;
997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_level_set = false;
998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_profile_level (profile_level->eProfile,
999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                   profile_level->eLevel))
1000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nWARNING: Unsuccessful in updating Profile and level");
1002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
1003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
1006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoProfileLevelCurrent");
1008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_IndexParamVideoQuantization:
1012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoQuantization\n");
1014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_VIDEO_PARAM_QUANTIZATIONTYPE *session_qp =
1015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (OMX_VIDEO_PARAM_QUANTIZATIONTYPE *)paramData;
1016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(session_qp->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
1017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(venc_set_session_qp (session_qp->nQpI,
1019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                session_qp->nQpP,
1020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				session_qp->nQpB) == false)
1021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Setting Session QP failed");
1023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
1024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
1027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoQuantization");
1029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_IndexParamVideoSliceFMO:
1033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  default:
1034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  DEBUG_PRINT_ERROR("\nERROR: Unsupported parameter in venc_set_param: %u",
1035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      index);
1036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
1037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //case
1038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
1041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_config(void *configData, OMX_INDEXTYPE index)
1044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Inside venc_set_config");
1047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  switch(index)
1049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_IndexConfigVideoBitrate:
1051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_VIDEO_CONFIG_BITRATETYPE *bit_rate = (OMX_VIDEO_CONFIG_BITRATETYPE *)
1053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        configData;
1054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n venc_set_config: OMX_IndexConfigVideoBitrate");
1055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(bit_rate->nPortIndex == (OMX_U32)PORT_INDEX_OUT)
1056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(venc_set_target_bitrate(bit_rate->nEncodeBitrate, 1) == false)
1058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Setting Target Bit rate failed");
1060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
1061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
1064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexConfigVideoBitrate");
1066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_IndexConfigVideoFramerate:
1070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_CONFIG_FRAMERATETYPE *frame_rate = (OMX_CONFIG_FRAMERATETYPE *)
1072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        configData;
1073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n venc_set_config: OMX_IndexConfigVideoFramerate");
1074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(frame_rate->nPortIndex == (OMX_U32)PORT_INDEX_OUT)
1075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(venc_set_encode_framerate(frame_rate->xEncodeFramerate, 1) == false)
1077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Setting Encode Framerate failed");
1079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
1080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
1083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexConfigVideoFramerate");
1085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case QOMX_IndexConfigVideoIntraperiod:
1089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("venc_set_param:QOMX_IndexConfigVideoIntraperiod\n");
1091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      QOMX_VIDEO_INTRAPERIODTYPE *intraperiod =
1092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      (QOMX_VIDEO_INTRAPERIODTYPE *)configData;
1093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(intraperiod->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
1094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(venc_set_intra_period(intraperiod->nPFrames, intraperiod->nBFrames) == false)
1096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
1098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
1099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_IndexConfigVideoIntraVOPRefresh:
1104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_CONFIG_INTRAREFRESHVOPTYPE *intra_vop_refresh = (OMX_CONFIG_INTRAREFRESHVOPTYPE *)
1106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        configData;
1107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n venc_set_config: OMX_IndexConfigVideoIntraVOPRefresh");
1108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(intra_vop_refresh->nPortIndex == (OMX_U32)PORT_INDEX_OUT)
1109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(venc_set_intra_vop_refresh(intra_vop_refresh->IntraRefreshVOP) == false)
1111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Setting Encode Framerate failed");
1113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
1114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
1117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexConfigVideoFramerate");
1119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_IndexConfigCommonRotate:
1123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_CONFIG_ROTATIONTYPE *config_rotation =
1125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         reinterpret_cast<OMX_CONFIG_ROTATIONTYPE*>(configData);
1126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_U32 nFrameWidth;
1127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("\nvenc_set_config: updating the new Dims");
1129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      nFrameWidth = m_sVenc_cfg.input_width;
1130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_sVenc_cfg.input_width  = m_sVenc_cfg.input_height;
1131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_sVenc_cfg.input_height = nFrameWidth;
1132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_BASE_CFG,(void*)&ioctl_msg) < */0) {
1133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Dimension Change for Rotation failed");
1134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
1135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  default:
1139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n Unsupported config index = %u", index);
1140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
1141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
1144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned venc_dev::venc_stop( void)
1147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1148dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    pmem_free();
1149dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return 0;
1150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned venc_dev::venc_pause(void)
1153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return 0;
1155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned venc_dev::venc_resume(void)
1158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return 0;
1160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned venc_dev::venc_start_done(void)
1163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct venc_msg venc_msg;
1165dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  venc_msg.msgcode=VEN_MSG_START;
1166dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  venc_msg.statuscode=VEN_S_SUCCESS;
1167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  venc_handle->async_message_process(venc_handle,&venc_msg);
1168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return 0;
1169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned venc_dev::venc_stop_done(void)
1172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct venc_msg venc_msg;
1174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  venc_msg.msgcode=VEN_MSG_STOP;
1175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  venc_msg.statuscode=VEN_S_SUCCESS;
1176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  venc_handle->async_message_process(venc_handle,&venc_msg);
1177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return 0;
1178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned venc_dev::venc_start(void)
1181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	enum v4l2_buf_type buf_type;
1183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int ret,r;
1184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("\n %s(): Check Profile/Level set in driver before start",
1185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        __func__);
1186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!venc_set_profile_level(0, 0))
1187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n ERROR: %s(): Driver Profile/Level is NOT SET",
1189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      __func__);
1190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
1192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n %s(): Driver Profile[%lu]/Level[%lu] successfully SET",
1194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      __func__, codec_profile.profile, profile_level.level);
1195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  venc_config_print();
1197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1198dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1199dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if((codec_profile.profile == V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE) ||
1200dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     (codec_profile.profile == V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE) ||
1201dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     (codec_profile.profile == VEN_PROFILE_H263_BASELINE))
1202dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    recon_buffers_count = MAX_RECON_BUFFERS - 2;
1203dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  else
1204dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    recon_buffers_count = MAX_RECON_BUFFERS;
1205dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1206dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1207dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
1208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	ret=ioctl(m_nDriver_fd, VIDIOC_STREAMON,&buf_type);
1210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1211dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	if (ret) {
1212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return -1;
1213dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	}
1214dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	else {
1215dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		return 0;
1216dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	}
1217dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
1218dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1219dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandOMX_U32 venc_dev::pmem_allocate(OMX_U32 size, OMX_U32 alignment, OMX_U32 count)
1220dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
1221dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  OMX_U32 pmem_fd = -1;
1222dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  OMX_U32 width, height;
1223dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  void *buf_addr = NULL;
1224dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct pmem_allocation allocation;
1225dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_recon_addr recon_addr;
1226dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  int rc = 0;
1227dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1228dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#ifdef USE_ION
1229dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  recon_buff[count].ion_device_fd = open (MEM_DEVICE,O_RDONLY|O_DSYNC);
1230dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if(recon_buff[count].ion_device_fd < 0)
1231dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
1232dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT_ERROR("\nERROR: ION Device open() Failed");
1233dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      return -1;
1234dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
1235dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1236dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  recon_buff[count].alloc_data.len = size;
1237dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  recon_buff[count].alloc_data.flags = 0x1 << MEM_HEAP_ID;
1238dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  recon_buff[count].alloc_data.align = clip2(alignment);
1239dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (recon_buff[count].alloc_data.align != 8192)
1240dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    recon_buff[count].alloc_data.align = 8192;
1241dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1242dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  rc = ioctl(recon_buff[count].ion_device_fd,ION_IOC_ALLOC,&recon_buff[count].alloc_data);
1243dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if(rc || !recon_buff[count].alloc_data.handle) {
1244dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         DEBUG_PRINT_ERROR("\n ION ALLOC memory failed ");
1245dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         recon_buff[count].alloc_data.handle=NULL;
1246dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         return -1;
1247dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
1248dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1249dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  recon_buff[count].ion_alloc_fd.handle = recon_buff[count].alloc_data.handle;
1250dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  rc = ioctl(recon_buff[count].ion_device_fd,ION_IOC_MAP,&recon_buff[count].ion_alloc_fd);
1251dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if(rc) {
1252dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT_ERROR("\n ION MAP failed ");
1253dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        recon_buff[count].ion_alloc_fd.fd =-1;
1254dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        recon_buff[count].ion_alloc_fd.fd =-1;
1255dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        return -1;
1256dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
1257dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  pmem_fd = recon_buff[count].ion_alloc_fd.fd;
1258dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#else
1259dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  pmem_fd = open(MEM_DEVICE, O_RDWR);
1260dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1261dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if ((int)(pmem_fd) < 0)
1262dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
1263dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	DEBUG_PRINT_ERROR("\n Failed to get an pmem handle");
1264dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	return -1;
1265dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
1266dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1267dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  allocation.size = size;
1268dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  allocation.align = clip2(alignment);
1269dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1270dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (allocation.align != 8192)
1271dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    allocation.align = 8192;
1272dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1273dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0)
1274dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
1275dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_ERROR("\n Aligment(%u) failed with pmem driver Sz(%lu)",
1276dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      allocation.align, allocation.size);
1277dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return -1;
1278dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
1279dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#endif
1280dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  buf_addr = mmap(NULL, size,
1281dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand               PROT_READ | PROT_WRITE,
1282dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand               MAP_SHARED, pmem_fd, 0);
1283dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1284dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (buf_addr == (void*) MAP_FAILED)
1285dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
1286dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    close(pmem_fd);
1287dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    pmem_fd = -1;
1288dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_ERROR("Error returned in allocating recon buffers buf_addr: %p\n",buf_addr);
1289dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#ifdef USE_ION
1290dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if(ioctl(recon_buff[count].ion_device_fd,ION_IOC_FREE,
1291dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand       &recon_buff[count].alloc_data.handle)) {
1292dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT_ERROR("ion recon buffer free failed");
1293dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
1294dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    recon_buff[count].alloc_data.handle = NULL;
1295dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    recon_buff[count].ion_alloc_fd.fd =-1;
1296dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    close(recon_buff[count].ion_device_fd);
1297dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    recon_buff[count].ion_device_fd =-1;
1298dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#endif
1299dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return -1;
1300dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
1301dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1302dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT_HIGH("\n Allocated virt:%p, FD: %d of size %d \n", buf_addr, pmem_fd, size);
1303dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1304dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  recon_addr.buffer_size = size;
1305dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  recon_addr.pmem_fd = pmem_fd;
1306dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  recon_addr.offset = 0;
1307dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  recon_addr.pbuffer = (unsigned char *)buf_addr;
1308dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1309dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1310dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_RECON_BUFFER, (void*)&ioctl_msg) < */0)
1311dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
1312dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_ERROR("Failed to set the Recon_buffers\n");
1313dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return -1;
1314dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
1315dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1316dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  recon_buff[count].virtual_address = (unsigned char *) buf_addr;
1317dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  recon_buff[count].size = size;
1318dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  recon_buff[count].offset = 0;
1319dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  recon_buff[count].pmem_fd = pmem_fd;
1320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1321dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT_ERROR("\n Allocated virt:%p, FD: %d of size %d at index: %d\n", recon_buff[count].virtual_address,
1322dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                     recon_buff[count].pmem_fd, recon_buff[count].size, count);
1323dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return 0;
1324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1326dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandOMX_U32 venc_dev::pmem_free()
1327dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
1328dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  int cnt = 0;
1329dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_recon_addr recon_addr;
1330dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  for (cnt = 0; cnt < recon_buffers_count; cnt++)
1331dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
1332dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if(recon_buff[cnt].pmem_fd)
1333dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
1334dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      recon_addr.pbuffer = recon_buff[cnt].virtual_address;
1335dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      recon_addr.offset = recon_buff[cnt].offset;
1336dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      recon_addr.pmem_fd = recon_buff[cnt].pmem_fd;
1337dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      recon_addr.buffer_size = recon_buff[cnt].size;
1338dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      if(/*ioctl(m_nDriver_fd, VEN_IOCTL_FREE_RECON_BUFFER ,&ioctl_msg) < */0)
1339dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT_ERROR("VEN_IOCTL_FREE_RECON_BUFFER failed");
1340dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      munmap(recon_buff[cnt].virtual_address, recon_buff[cnt].size);
1341dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      close(recon_buff[cnt].pmem_fd);
1342dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#ifdef USE_ION
1343dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      if(ioctl(recon_buff[cnt].ion_device_fd,ION_IOC_FREE,
1344dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         &recon_buff[cnt].alloc_data.handle)) {
1345dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        DEBUG_PRINT_ERROR("ion recon buffer free failed");
1346dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
1347dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      recon_buff[cnt].alloc_data.handle = NULL;
1348dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      recon_buff[cnt].ion_alloc_fd.fd =-1;
1349dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      close(recon_buff[cnt].ion_device_fd);
1350dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      recon_buff[cnt].ion_device_fd =-1;
1351dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#endif
1352dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT_LOW("\n cleaning Index %d of size %d \n",cnt,recon_buff[cnt].size);
1353dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      recon_buff[cnt].pmem_fd = -1;
1354dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      recon_buff[cnt].virtual_address = NULL;
1355dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      recon_buff[cnt].offset = 0;
1356dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      recon_buff[cnt].alignment = 0;
1357dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      recon_buff[cnt].size = 0;
1358dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
1359dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
1360dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return 0;
1361dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
1362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid venc_dev::venc_config_print()
1363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1365dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT_HIGH("\nENC_CONFIG: Codec: %d, Profile %d, level : %d",
1366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   m_sVenc_cfg.codectype, codec_profile.profile, profile_level.level);
1367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1368dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT_HIGH("\n ENC_CONFIG: Width: %d, Height:%d, Fps: %d",
1369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   m_sVenc_cfg.input_width, m_sVenc_cfg.input_height,
1370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   m_sVenc_cfg.fps_num/m_sVenc_cfg.fps_den);
1371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1372dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT_HIGH("\nENC_CONFIG: Bitrate: %d, RC: %d, I-Period: %d",
1373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   bitrate.target_bitrate, rate_ctrl.rcmode, intra_period.num_pframes);
1374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1375dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT_HIGH("\nENC_CONFIG: qpI: %d, qpP: %d, qpb: %d",
1376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   session_qp.iframeqp, session_qp.pframqp,session_qp.bframqp);
1377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1378dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT_HIGH("\nENC_CONFIG: VOP_Resolution: %d, Slice-Mode: %d, Slize_Size: %d",
1379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   voptimecfg.voptime_resolution, multislice.mslice_mode,
1380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   multislice.mslice_size);
1381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1382dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT_HIGH("\nENC_CONFIG: EntropyMode: %d, CabacModel: %d",
1383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   entropy.longentropysel, entropy.cabacmodel);
1384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1385dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT_HIGH("\nENC_CONFIG: DB-Mode: %d, alpha: %d, Beta: %d\n",
1386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   dbkfilter.db_mode, dbkfilter.slicealpha_offset,
1387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   dbkfilter.slicebeta_offset);
1388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1389dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT_HIGH("\nENC_CONFIG: IntraMB/Frame: %d, HEC: %d\n",
1390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   intra_refresh.mbcount, hec.header_extension);
1391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned venc_dev::venc_flush( unsigned port)
1394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1395dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_bufferflush buffer_index;
1396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1397dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if(port == PORT_INDEX_IN)
1398dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
1399dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	 int rc=0;
1400dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	 enum v4l2_buf_type btype;
1401dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	 btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1402dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	 rc = ioctl(m_nDriver_fd, VIDIOC_STREAMOFF, &btype);
1403dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	 if (rc) {
140461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan		/* STREAMOFF should never fail */
1405dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("\n Failed to call streamoff on OUTPUT Port \n");
1406dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		return -1;
1407dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		}
1408b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand
1409dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return 0;
1410dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
1411dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  else if(port == PORT_INDEX_OUT)
1412dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
1413dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	 int rc=0;
1414dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	 enum v4l2_buf_type btype;
1415dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	 btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1416dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	 rc = ioctl(m_nDriver_fd, VIDIOC_STREAMOFF, &btype);
1417dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	 if (rc) {
141861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan		/* STREAMOFF should never fail  */
1419dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("\n Failed to call streamoff on OUTPUT Port \n");
1420dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		return -1;
1421dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		}
1422dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1423dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return 0;
1424dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1425dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
1426dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  else
1427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return -1;
1429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//allocating I/P memory from pmem and register with the device
1433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_use_buf(void *buf_addr, unsigned port,unsigned index)
1436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1438dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct pmem *pmem_tmp;
1439dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1440dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand struct v4l2_buffer buf;
1441dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand struct v4l2_plane plane;
1442dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	int rc=0;
14436eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
1444dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  pmem_tmp = (struct pmem *)buf_addr;
14456eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
1446dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT_LOW("\n venc_use_buf:: pmem_tmp = %p", pmem_tmp);
14476eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
1448dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if(port == PORT_INDEX_IN)
1449dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
1450dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1451dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     buf.index = index;
1452dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1453dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     buf.memory = V4L2_MEMORY_USERPTR;
1454dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     plane.length = pmem_tmp->size;
1455dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     plane.m.userptr = (unsigned long)pmem_tmp->buffer;
1456dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     plane.reserved[0] = pmem_tmp->fd;
1457dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     plane.reserved[1] = 0;
1458dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     plane.data_offset = pmem_tmp->offset;
1459dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     buf.m.planes = &plane;
1460dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     buf.length = 1;
1461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1463dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	 rc = ioctl(m_nDriver_fd, VIDIOC_PREPARE_BUF, &buf);
14646eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
1465dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	if (rc) {
1466dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("VIDIOC_PREPARE_BUF Failed at line 1387 \n");
1467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1468dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1469dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_INPUT_BUFFER,&ioctl_msg) < */0)
1470dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
1471dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT_ERROR("\nERROR: venc_use_buf:set input buffer failed ");
1472dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      return false;
1473dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
1474dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
1475dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  else if(port == PORT_INDEX_OUT)
1476dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
1477dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1478dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     buf.index = index;
1479dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1480dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     buf.memory = V4L2_MEMORY_USERPTR;
1481dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     plane.length = pmem_tmp->size;
1482dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     plane.m.userptr = (unsigned long)pmem_tmp->buffer;
1483dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     plane.reserved[0] = pmem_tmp->fd;
1484dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     plane.reserved[1] = 0;
1485dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     plane.data_offset = pmem_tmp->offset;
1486dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     buf.m.planes = &plane;
1487dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     buf.length = 1;
1488dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1489dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	rc = ioctl(m_nDriver_fd, VIDIOC_PREPARE_BUF, &buf);
1490dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1491dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	if (rc) {
1492dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("VIDIOC_PREPARE_BUF Failed at line 1414 \n");
1493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1494dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1495dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_OUTPUT_BUFFER,&ioctl_msg) < */0)
1496dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
1497dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT_ERROR("\nERROR: venc_use_buf:set output buffer failed ");
1498dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      return false;
1499dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
1500dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
1501dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  else
1502dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
1503dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_ERROR("\nERROR: venc_use_buf:Invalid Port Index ");
1504dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return false;
1505dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
1506dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1507dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return true;
1508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_free_buf(void *buf_addr, unsigned port)
1511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct pmem *pmem_tmp;
1513dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_bufferpayload dev_buffer = {0};
1514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pmem_tmp = (struct pmem *)buf_addr;
1516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1517dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  DEBUG_PRINT_LOW("\n venc_use_buf:: pmem_tmp = %p", pmem_tmp);
1518dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(port == PORT_INDEX_IN)
1520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
1522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    dev_buffer.fd  = pmem_tmp->fd;
1523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    dev_buffer.maped_size = pmem_tmp->size;
1524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    dev_buffer.sz = pmem_tmp->size;
1525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    dev_buffer.offset = pmem_tmp->offset;
1526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n venc_free_buf:pbuffer = %x,fd = %x, offset = %d, maped_size = %d", \
1527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                dev_buffer.pbuffer, \
1528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                dev_buffer.fd, \
1529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                dev_buffer.offset, \
1530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                dev_buffer.maped_size);
1531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1532dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if(/*ioctl (m_nDriver_fd,VEN_IOCTL_CMD_FREE_INPUT_BUFFER,&ioctl_msg) < */0)
1533dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
1534dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT_ERROR("\nERROR: venc_free_buf: free input buffer failed ");
1535dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      return false;
1536dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
1537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(port == PORT_INDEX_OUT)
1539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
1541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    dev_buffer.fd  = pmem_tmp->fd;
1542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    dev_buffer.sz = pmem_tmp->size;
1543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    dev_buffer.maped_size = pmem_tmp->size;
1544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    dev_buffer.offset = pmem_tmp->offset;
1545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n venc_free_buf:pbuffer = %x,fd = %x, offset = %d, maped_size = %d", \
1547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                dev_buffer.pbuffer, \
1548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                dev_buffer.fd, \
1549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                dev_buffer.offset, \
1550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                dev_buffer.maped_size);
1551dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1552dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if(/*ioctl (m_nDriver_fd,VEN_IOCTL_CMD_FREE_OUTPUT_BUFFER,&ioctl_msg) < */0)
1553dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
1554dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT_ERROR("\nERROR: venc_free_buf: free output buffer failed ");
1555dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      return false;
1556dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
1557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
1559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR: venc_free_buf:Invalid Port Index ");
1561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
1562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1563dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
1565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1567dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandbool venc_dev::venc_empty_buf(void *buffer, void *pmem_data_buf,unsigned index,unsigned fd)
1568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct pmem *temp_buffer;
1570dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1571dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand struct v4l2_buffer buf;
1572dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand struct v4l2_plane plane;
1573dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	int rc=0;
1574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct OMX_BUFFERHEADERTYPE *bufhdr;
15756eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
1576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  temp_buffer = (struct pmem *)buffer;
15776eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
1578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(buffer == NULL)
1580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR: venc_etb: buffer is NULL");
1582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
1583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bufhdr = (OMX_BUFFERHEADERTYPE *)buffer;
1585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1586dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandDEBUG_PRINT_LOW("\n Input buffer length %d",bufhdr->nFilledLen);
1587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(pmem_data_buf)
1589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Internal PMEM addr for i/p Heap UseBuf: %p", pmem_data_buf);
1591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    plane.m.userptr = (unsigned long)pmem_data_buf;
1592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
1594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Shared PMEM addr for i/p PMEM UseBuf/AllocateBuf: %p", bufhdr->pBuffer);
1596dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    plane.m.userptr = (unsigned long)bufhdr->pBuffer;
1597dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
1598dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1599dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     buf.index = index;
1600dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1601dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     buf.memory = V4L2_MEMORY_USERPTR;
1602dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     plane.length = bufhdr->nAllocLen;
1603dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     plane.bytesused = bufhdr->nFilledLen;
1604dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     plane.reserved[0] = fd;
1605dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     plane.reserved[1] = 0;
1606dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     plane.data_offset = bufhdr->nOffset;
1607dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     buf.m.planes = &plane;
1608dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     buf.length = 1;
1609dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1610dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1611dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  rc = ioctl(m_nDriver_fd, VIDIOC_QBUF, &buf);
1612dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	if (rc) {
1613dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("Failed to qbuf to driver");
1614dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		return false;
1615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1616dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1617dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	etb_count++;
1618dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1619dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	if(etb_count == 1)
1620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	{
1621dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	enum v4l2_buf_type buf_type;
1622dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1623dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		int ret;
1624dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	ret = ioctl(m_nDriver_fd, VIDIOC_STREAMON, &buf_type);
1625dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	if (ret) {
1626dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("Failed to call streamon\n");
1627dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	}
162861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
1629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1631dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if(/*ioctl(m_nDriver_fd,VEN_IOCTL_CMD_ENCODE_FRAME,&ioctl_msg) < */0)
1632dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
1633dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    /*Generate an async error and move to invalid state*/
1634dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return false;
1635b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand  }
1636dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#ifdef INPUT_BUFFER_LOG
1637dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1638dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  int y_size = 0;
1639dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  int c_offset = 0;
1640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1641dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  y_size = m_sVenc_cfg.input_width * m_sVenc_cfg.input_height;
1642dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  //chroma offset is y_size aligned to the 2k boundary
1643dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  c_offset= (y_size + 2047) & (~(2047));
1644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1645dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if(inputBufferFile1)
1646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1647dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    fwrite((const char *)frameinfo.ptrbuffer, y_size, 1,inputBufferFile1);
1648dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    fwrite((const char *)(frameinfo.ptrbuffer + c_offset), (y_size>>1), 1,inputBufferFile1);
1649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1651dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
1653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_fill_buf(void *buffer, void *pmem_data_buf,unsigned index,unsigned fd)
1655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1657dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct pmem *temp_buffer = NULL;
1658dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_buffer  frameinfo;
1659dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct v4l2_buffer buf;
1660dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct v4l2_plane plane;
1661dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  int rc=0;
1662dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct OMX_BUFFERHEADERTYPE *bufhdr;
1663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1664dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if(buffer == NULL)
1665dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
1666dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return false;
1667dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
1668dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bufhdr = (OMX_BUFFERHEADERTYPE *)buffer;
1669dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1670dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandif(pmem_data_buf)
1671dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
1672dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_LOW("\n Internal PMEM addr for o/p Heap UseBuf: %p", pmem_data_buf);
1673dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    plane.m.userptr = (unsigned long)pmem_data_buf;
1674dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
1675dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  else
1676dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
1677dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_LOW("\n Shared PMEM addr for o/p PMEM UseBuf/AllocateBuf: %p", bufhdr->pBuffer);
1678dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    plane.m.userptr = (unsigned long)bufhdr->pBuffer;
1679dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
1680dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1681dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     buf.index = index;
1682dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1683dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     buf.memory = V4L2_MEMORY_USERPTR;
1684dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     plane.length = bufhdr->nAllocLen;
1685dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     plane.bytesused = bufhdr->nFilledLen;
1686dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     plane.reserved[0] = fd;
1687dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     plane.reserved[1] = 0;
1688dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     plane.data_offset = bufhdr->nOffset;
1689dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     buf.m.planes = &plane;
1690dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     buf.length = 1;
1691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_QBUF, &buf);
1693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
1694dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("Failed to qbuf to driver");
1695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
1696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1699dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if(/*ioctl (m_nDriver_fd,VEN_IOCTL_CMD_FILL_OUTPUT_BUFFER,&ioctl_msg) < */0)
1700dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
1701dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_ERROR("\nERROR: ioctl VEN_IOCTL_CMD_FILL_OUTPUT_BUFFER failed");
1702dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return false;
1703dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
1704dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
1705dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return true;
1706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_session_qp(OMX_U32 i_frame_qp, OMX_U32 p_frame_qp,OMX_U32 b_frame_qp)
1709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int rc;
1711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_control control;
1712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.id = V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP;
1714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.value = i_frame_qp;
1715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1716dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
1717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
1718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
1719dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("Failed to set control\n");
1720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
1721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1722dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
1723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	session_qp.iframeqp = control.value;
1724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.id = V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP;
1726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.value = p_frame_qp;
1727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1728dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
1729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
1730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
1731dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("Failed to set control\n");
1732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
1733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1734dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
1735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	session_qp.pframqp = control.value;
1737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if((codec_profile.profile == V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) ||
1739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     (codec_profile.profile == V4L2_MPEG_VIDEO_H264_PROFILE_HIGH))
1740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	{
1741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.id = V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP;
1743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.value = b_frame_qp;
1744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1745dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
1746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
1747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
1748dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("Failed to set control\n");
1749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
1750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1751dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
1752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	session_qp.bframqp = control.value;
1754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1756dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_SESSION_QP,(void*)&ioctl_msg)< */0)
1757dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
1758dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_ERROR("\nERROR: Request for setting session qp failed");
1759dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return false;
1760dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
1761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
1762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_profile_level(OMX_U32 eProfile,OMX_U32 eLevel)
1765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1766dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_profile requested_profile;
1767dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct ven_profilelevel requested_level;
1768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned const int *profile_tbl = NULL;
1769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned long mb_per_frame = 0, mb_per_sec = 0;
1770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("venc_set_profile_level:: eProfile = %d, Level = %d",
1771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eProfile, eLevel);
1772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  mb_per_frame = ((m_sVenc_cfg.input_height + 15) >> 4)*
1773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  ((m_sVenc_cfg.input_width + 15) >> 4);
1774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if((eProfile == 0) && (eLevel == 0) && m_profile_set && m_level_set)
1775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Profile/Level setting complete before venc_start");
1777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return true;
1778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Validating Profile/Level from table");
1781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!venc_validate_profile_level(&eProfile, &eLevel))
1782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\nERROR: Profile/Level validation failed");
1784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
1785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4)
1788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("eProfile = %d, OMX_VIDEO_MPEG4ProfileSimple = %d and "
1790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "OMX_VIDEO_MPEG4ProfileAdvancedSimple = %d", eProfile,
1791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4ProfileAdvancedSimple);
1792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(eProfile == OMX_VIDEO_MPEG4ProfileSimple)
1793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_profile.profile = V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE;
1795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      profile_tbl = (unsigned int const *)
1796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (&mpeg4_profile_level_table[MPEG4_SP_START]);
1797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      profile_tbl += MPEG4_720P_LEVEL*5;
1798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple)
1800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_profile.profile = V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE;
1802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      profile_tbl = (unsigned int const *)
1803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (&mpeg4_profile_level_table[MPEG4_ASP_START]);
1804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      profile_tbl += MPEG4_720P_LEVEL*5;
1805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
1807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\nERROR: Unsupported MPEG4 profile = %u",
1809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eProfile);
1810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return false;
1811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("eLevel = %d, OMX_VIDEO_MPEG4Level0 = %d, OMX_VIDEO_MPEG4Level1 = %d,"
1814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "OMX_VIDEO_MPEG4Level2 = %d, OMX_VIDEO_MPEG4Level3 = %d, OMX_VIDEO_MPEG4Level4 = %d,"
1815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "OMX_VIDEO_MPEG4Level5 = %d", eLevel, OMX_VIDEO_MPEG4Level0, OMX_VIDEO_MPEG4Level1,
1816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_VIDEO_MPEG4Level2, OMX_VIDEO_MPEG4Level3, OMX_VIDEO_MPEG4Level4, OMX_VIDEO_MPEG4Level5);
1817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(mb_per_frame >= 3600)
1819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(requested_profile.profile == V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE)
1821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
1822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(requested_profile.profile == V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE)
1823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
1824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
1826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      switch(eLevel)
1828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_VIDEO_MPEG4Level0:
1830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_0;
1831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
1832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		case OMX_VIDEO_MPEG4Level0b:
1833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_0B;
1834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
1835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_VIDEO_MPEG4Level1:
1836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_1;
1837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
1838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_VIDEO_MPEG4Level2:
1839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_2;
1840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
1841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_VIDEO_MPEG4Level3:
1842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_3;
1843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
1844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_VIDEO_MPEG4Level4a:
1845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_4;
1846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
1847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_VIDEO_MPEG4Level5:
1848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        mb_per_sec = mb_per_frame * (m_sVenc_cfg.fps_num / m_sVenc_cfg.fps_den);
1849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		if((requested_profile.profile == V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE) && (mb_per_frame >= profile_tbl[0]) &&
1850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           (mb_per_sec >= profile_tbl[1]))
1851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("\nMPEG4 Level 6 is set for 720p resolution");
1853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
1854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
1856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("\nMPEG4 Level 5 is set for non-720p resolution");
1858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
1859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
1861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      default:
1862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return false;
1863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // TODO update corresponding levels for MPEG4_LEVEL_3b,MPEG4_LEVEL_6
1864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
1865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263)
1869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1870dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if(eProfile == OMX_VIDEO_H263ProfileBaseline)
1871dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
1872dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      requested_profile.profile = VEN_PROFILE_H263_BASELINE;
1873dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
1874dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    else
1875dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
1876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\nERROR: Unsupported H.263 profile = %u",
1877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        requested_profile.profile);
1878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return false;
1879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //profile level
1881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    switch(eLevel)
1882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_H263Level10:
1884dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      requested_level.level = VEN_LEVEL_H263_10;
1885dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      break;
1886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_H263Level20:
1887dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      requested_level.level = VEN_LEVEL_H263_20;
1888dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      break;
1889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_H263Level30:
1890dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      requested_level.level = VEN_LEVEL_H263_30;
1891dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      break;
1892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_H263Level40:
1893dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      requested_level.level = VEN_LEVEL_H263_40;
1894dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      break;
1895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_H263Level45:
1896dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      requested_level.level = VEN_LEVEL_H263_45;
1897dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      break;
1898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_H263Level50:
1899dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      requested_level.level = VEN_LEVEL_H263_50;
1900dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      break;
1901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_H263Level60:
1902dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      requested_level.level = VEN_LEVEL_H263_60;
1903dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      break;
1904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_H263Level70:
1905dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      requested_level.level = VEN_LEVEL_H263_70;
1906dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      break;
1907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    default:
1908dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      return false;
1909dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      break;
1910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264)
1913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(eProfile == OMX_VIDEO_AVCProfileBaseline)
1915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE;
1917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(eProfile == OMX_VIDEO_AVCProfileMain)
1919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_MAIN;
1921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else if(eProfile == OMX_VIDEO_AVCProfileExtended)
1923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED;
1925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(eProfile == OMX_VIDEO_AVCProfileHigh)
1927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH;
1929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else if(eProfile == OMX_VIDEO_AVCProfileHigh10)
1931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10;
1933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else if(eProfile == OMX_VIDEO_AVCProfileHigh422)
1935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422;
1937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else if(eProfile == OMX_VIDEO_AVCProfileHigh444)
1939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE;
1941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
1943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\nERROR: Unsupported H.264 profile = %u",
1945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        requested_profile.profile);
1946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return false;
1947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //profile level
1949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    switch(eLevel)
1950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_AVCLevel1:
1952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_0;
1953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_AVCLevel1b:
1955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1B;
1956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_AVCLevel11:
1958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_1;
1959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_AVCLevel12:
1961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_2;
1962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_AVCLevel13:
1964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_3;
1965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_AVCLevel2:
1967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_2_0;
1968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_AVCLevel21:
1970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_2_1;
1971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_AVCLevel22:
1973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_2_2;
1974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_AVCLevel3:
1976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_3_0;
1977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_AVCLevel31:
1979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_3_1;
1980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_AVCLevel32:
1982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_3_2;
1983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_AVCLevel4:
1985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_4_0;
1986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_AVCLevel41:
1988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_4_1;
1989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_AVCLevel42:
1991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_4_2;
1992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_AVCLevel5:
1994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_5_0;
1995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_AVCLevel51:
1997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_5_1;
1998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    default :
2000dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT_ERROR("\nERROR: Unsupported H.264 level= %u",
2001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        requested_level.level);
2002dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      return false;
2003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!m_profile_set)
2007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int rc;
2009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_control control;
2010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2011dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	control.id = V4L2_CID_MPEG_VIDEO_H264_PROFILE;
2012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.value = requested_profile.profile;
2013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2014dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
2015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
2017dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("Failed to set control\n");
2018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
2019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2020dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
2021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2022dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
2023dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_CODEC_PROFILE,(void*)&ioctl_msg)< */0)
2024dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
2025dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT_ERROR("\nERROR: Request for setting profile failed");
2026dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      return false;
2027dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
2028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    codec_profile.profile = control.value;
2029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_profile_set = true;
2030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!m_level_set)
2033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int rc;
2035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_control control;
2036dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	control.id = V4L2_CID_MPEG_VIDEO_H264_LEVEL;
2037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.value = requested_level.level;
2038dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
2039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
2041dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("Failed to set control\n");
2042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
2043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2044dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
2045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2046dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_PROFILE_LEVEL,(void*)&ioctl_msg)< */0)
2047dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
2048dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT_ERROR("\nERROR: Request for setting profile level failed");
2049dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      return false;
2050dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
2051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    profile_level.level = control.value;
2052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_level_set = true;
2053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
2056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_voptiming_cfg( OMX_U32 TimeIncRes)
2059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct venc_voptimingcfg vop_timing_cfg;
2062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n venc_set_voptiming_cfg: TimeRes = %u",
2064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    TimeIncRes);
2065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  vop_timing_cfg.voptime_resolution = TimeIncRes;
2067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2068dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_VOP_TIMING_CFG,(void*)&ioctl_msg)< */0)
2069dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
2070dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_ERROR("\nERROR: Request for setting Vop Timing failed");
2071dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return false;
2072dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
2073dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
2074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  voptimecfg.voptime_resolution = vop_timing_cfg.voptime_resolution;
2075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
2076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_intra_period(OMX_U32 nPFrames, OMX_U32 nBFrames)
2079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n venc_set_intra_period: nPFrames = %u",
2082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nPFrames);
2083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int rc;
2084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_control control;
2085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if((codec_profile.profile != V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE) &&
2086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     (codec_profile.profile != V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) &&
2087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     (codec_profile.profile != V4L2_MPEG_VIDEO_H264_PROFILE_HIGH))
2088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  nBFrames=0;
2090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_P_FRAMES;
2093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.value = nPFrames;
2094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
2097dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("Failed to set control\n");
2098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
2099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2100dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
2101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        intra_period.num_pframes = control.value;
2103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_B_FRAMES;
2104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.value = nBFrames;
2105dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
2106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
2108dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("Failed to set control\n");
2109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
2110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2111dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
2112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2114dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_INTRA_PERIOD,(void*)&ioctl_msg)< */0)
2115dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
2116dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
2117dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return false;
2118dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
2119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  intra_period.num_bframes = control.value;
2120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
2121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_entropy_config(OMX_BOOL enable, OMX_U32 i_cabac_level)
2124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2125dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  //struct venc_entropycfg entropy_cfg;
2126dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
2127dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand // memset(&entropy_cfg,0,sizeof(entropy_cfg));
2128dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	int rc;
2129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_control control;
2130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n venc_set_entropy_config: CABAC = %u level: %u", enable, i_cabac_level);
2132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(enable &&(codec_profile.profile != V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE)){
2134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control.value = V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC;
2136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control.id = V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE;
2137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2138dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	  printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
2139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
2141dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("Failed to set control\n");
2142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
2143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2144dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
2145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	entropy.longentropysel = control.value;
2146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  if (i_cabac_level == 0) {
2147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         control.value = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_0;
2148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (i_cabac_level == 1) {
2150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         control.value = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_1;
2151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (i_cabac_level == 2) {
2153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         control.value = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_2;
2154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control.id = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL;
2157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  //control.value = entropy_cfg.cabacmodel;
2158dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
2159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
2161dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("Failed to set control\n");
2162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
2163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2164dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
2165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	entropy.longentropysel=control.value;
2166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(!enable){
2168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    control.value =  V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC;
2169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.id = V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE;
2170dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
2171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
2173dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("Failed to set control\n");
2174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
2175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2176dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
2177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	entropy.longentropysel=control.value;
2178dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	//entropy_cfg.longentropysel = control.value;
2179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else{
2181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nInvalid Entropy mode for Baseline Profile");
2182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
2183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2185dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_ENTROPY_CFG,(void*)&ioctl_msg)< */0)
2186dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
2187dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_ERROR("\nERROR: Request for setting entropy config failed");
2188dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return false;
2189dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
2190dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  //entropy.longentropysel = entropy_cfg.longentropysel;
2191dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  //entropy.cabacmodel  = entropy_cfg.cabacmodel;
2192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
2193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_multislice_cfg(OMX_INDEXTYPE Codec, OMX_U32 nSlicesize) // MB
2196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int rc;
2198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_control control;
2199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool status = true;
2200dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  //struct venc_multiclicecfg multislice_cfg;
2201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if((Codec != OMX_IndexParamVideoH263)  && (nSlicesize)){
2203dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   // multislice_cfg.mslice_mode = VEN_MSLICE_CNT_MB;
2204dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    //multislice_cfg.mslice_size = nSlicesize;
2205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control.value =  V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_MB;
2206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else{
2208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   control.value =  V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE;
2209dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   //multislice_cfg.mslice_mode = VEN_MSLICE_OFF;
2210dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    //multislice_cfg.mslice_size = 0;
2211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE;
2213dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
2214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
2216dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("Failed to set control\n");
2217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
2218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2219dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
2220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	multislice.mslice_mode=control.value;
2221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if(multislice.mslice_mode!=V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE){
2223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB;
2225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.value = nSlicesize;
2226dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
2227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
2229dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("Failed to set control\n");
2230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
2231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2232dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
2233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	multislice.mslice_size=control.value;
2234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2236dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
2237dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
2238dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if(/*ioctl (m_nDriver_fd, VEN_IOCTL_SET_MULTI_SLICE_CFG,(void*)&ioctl_msg) < */0)
2239dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
2240dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_ERROR("\nERROR: Request for setting multi-slice cfg failed");
2241dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    status = false;
2242dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
2243dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  else
2244dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
2245dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    //multislice.mslice_mode = multislice_cfg.mslice_mode;
2246dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    //multislice.mslice_size = nSlicesize;
2247dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
2248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return status;
2249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_intra_refresh(OMX_VIDEO_INTRAREFRESHTYPE ir_mode, OMX_U32 irMBs)
2252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool status = true;
2254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int rc;
2255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct v4l2_control control_mode,control_mbs;
2256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   control_mode.id = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_MODE;
2257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  // There is no disabled mode.  Disabled mode is indicated by a 0 count.
2258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (irMBs == 0 || ir_mode == OMX_VIDEO_IntraRefreshMax)
2259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_NONE;
2261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if ((ir_mode == OMX_VIDEO_IntraRefreshCyclic) &&
2263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           (irMBs < ((m_sVenc_cfg.input_width * m_sVenc_cfg.input_height)>>8)))
2264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_CYCLIC;
2266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control_mbs.id=V4L2_CID_MPEG_VIDC_VIDEO_CIR_MBS;
2267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control_mbs.value=irMBs;
2268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if ((ir_mode == OMX_VIDEO_IntraRefreshAdaptive) &&
2270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           (irMBs < ((m_sVenc_cfg.input_width * m_sVenc_cfg.input_height)>>8)))
2271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_ADAPTIVE;
2273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control_mbs.id=V4L2_CID_MPEG_VIDC_VIDEO_AIR_MBS;
2274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control_mbs.value=irMBs;
2275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if ((ir_mode == OMX_VIDEO_IntraRefreshBoth) &&
2277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           (irMBs < ((m_sVenc_cfg.input_width * m_sVenc_cfg.input_height)>>8)))
2278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_CYCLIC_ADAPTIVE;
2280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
2282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR: Invalid IntraRefresh Parameters:"
2284dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                      "mb count: %d, mb mode:%d", irMBs, ir_mode);
2285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
2286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2288dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Calling IOCTL set control for id=%d, val=%d\n", control_mode.id, control_mode.value);
2289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control_mode);
2290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
2291dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("Failed to set control\n");
2292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
2293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2294dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Success IOCTL set control for id=%d, value=%d\n", control_mode.id, control_mode.value);
2295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2296dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Calling IOCTL set control for id=%d, val=%d\n", control_mbs.id, control_mbs.value);
2297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control_mbs);
2298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
2299dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("Failed to set control\n");
2300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
2301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2302dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Success IOCTL set control for id=%d, value=%d\n", control_mbs.id, control_mbs.value);
2303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2304dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_INTRA_REFRESH,(void*)&ioctl_msg) < */0)
2305dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
2306dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_ERROR("\nERROR: Request for setting Intra Refresh failed");
2307dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    status = false;
2308dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
2309dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  else
2310dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
2311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    intra_refresh.irmode = control_mode.value;
2312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    intra_refresh.mbcount = control_mbs.value;
2313dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
2314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return status;
2315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_error_resilience(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* error_resilience)
2318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2319dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   bool status = true;
2320dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   struct venc_headerextension hec_cfg;
2321dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   struct venc_multiclicecfg multislice_cfg;
2322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2323dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) {
2324dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      if (error_resilience->bEnableHEC) {
2325dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         hec_cfg.header_extension = 1;
2326dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
2327dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      else {
2328dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         hec_cfg.header_extension = 0;
2329dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
2330b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand
2331dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      if (/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_HEC,(void*)&ioctl_msg) < */0) {
2332dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         DEBUG_PRINT_ERROR("\nERROR: Request for setting HEader Error correction failed");
2333dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand         return false;
2334dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
2335dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      hec.header_extension = error_resilience->bEnableHEC;
2336dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   }
2337dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
2338dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   if (error_resilience->bEnableRVLC) {
2339dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     DEBUG_PRINT_ERROR("\n RVLC is not Supported");
2340dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     return false;
2341dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   }
2342dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
2343dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   if (( m_sVenc_cfg.codectype != OMX_VIDEO_CodingH263) &&
2344dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand       (error_resilience->bEnableDataPartitioning)) {
2345dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     DEBUG_PRINT_ERROR("\n DataPartioning are not Supported for MPEG4/H264");
2346dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     return false;
2347dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     }
2348dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
2349dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   if (( m_sVenc_cfg.codectype != OMX_VIDEO_CodingH263) &&
2350dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            (error_resilience->nResynchMarkerSpacing)) {
2351dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     multislice_cfg.mslice_mode = VEN_MSLICE_CNT_BYTE;
2352dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand       multislice_cfg.mslice_size = error_resilience->nResynchMarkerSpacing;
2353dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     }
2354dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   else if (m_sVenc_cfg.codectype == OMX_VIDEO_CodingH263 &&
2355dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand            error_resilience->bEnableDataPartitioning) {
2356dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      multislice_cfg.mslice_mode = VEN_MSLICE_GOB;
2357dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      multislice_cfg.mslice_size = 0;
2358dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      }
2359dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      else {
2360dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        multislice_cfg.mslice_mode = VEN_MSLICE_OFF;
2361dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        multislice_cfg.mslice_size = 0;
2362dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        }
2363dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   DEBUG_PRINT_LOW("\n %s(): mode = %u, size = %u", __func__, multislice_cfg.mslice_mode,
2364dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                   multislice_cfg.mslice_size);
2365dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   if (/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_MULTI_SLICE_CFG,(void*)&ioctl_msg) < */0) {
2366dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT_ERROR("\nERROR: Request for setting multi-slice cfg failed");
2367dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      status = false;
2368dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   }
2369dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   else
2370dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   {
2371dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     multislice.mslice_mode = multislice_cfg.mslice_mode ;
2372dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand     multislice.mslice_size = multislice_cfg.mslice_size;
2373dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
2374dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   }
2375dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand   return status;
2376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_inloop_filter(OMX_VIDEO_AVCLOOPFILTERTYPE loopfilter)
2379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int rc;
2381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_control control;
2382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.id=V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE;
2383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (loopfilter == OMX_VIDEO_AVCLoopFilterEnable){
2384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control.value=V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_ENABLED;
2385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(loopfilter == OMX_VIDEO_AVCLoopFilterDisable){
2387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control.value=V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED;
2388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(loopfilter == OMX_VIDEO_AVCLoopFilterDisableSliceBoundary){
2390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control.value=V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED_AT_SLICE_BOUNDARY;
2391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2393dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	  printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
2394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
2396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
2397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2398dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
2399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	dbkfilter.db_mode=control.value;
2401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.id=V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA;
2403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.value=0;
2404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2405dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
2406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
2408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
2409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2410dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
2411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.id=V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA;
2412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.value=0;
2413dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
2414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
2416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
2417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2418dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
2419dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
2420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2421dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_DEBLOCKING_CFG,(void*)&ioctl_msg)< */0)
2422dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
2423dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_ERROR("\nERROR: Request for setting inloop filter failed");
2424dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return false;
2425dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
2426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  dbkfilter.slicealpha_offset = dbkfilter.slicebeta_offset = 0;
2428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
2429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_target_bitrate(OMX_U32 nTargetBitrate, OMX_U32 config)
2432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n venc_set_target_bitrate: bitrate = %u",
2434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nTargetBitrate);
2435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_control control;
2436dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	int rc;
2437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.id = V4L2_CID_MPEG_VIDEO_BITRATE;
2438dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	control.value = nTargetBitrate/1000;
2439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2440dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
2441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
2443dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("Failed to set control\n");
2444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
2445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2446dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
2447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2449dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_TARGET_BITRATE,(void*)&ioctl_msg) < */0)
2450dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
2451dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_ERROR("\nERROR: Request for setting bit rate failed");
2452dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return false;
2453dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
2454dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  m_sVenc_cfg.targetbitrate = control.value*1000;
2455dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bitrate.target_bitrate = control.value*1000;
2456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!config)
2457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_level_set = false;
2459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(venc_set_profile_level(0, 0))
2460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2461dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT_HIGH("Calling set level (Bitrate) with %d\n",profile_level.level);
2462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
2465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_encode_framerate(OMX_U32 encode_framerate, OMX_U32 config)
2468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2469dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
2470dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	struct v4l2_control control;
2471dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	int rc;
2472dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	control.id = V4L2_CID_MPEG_VIDC_VIDEO_FRAME_RATE;
2473dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	control.value = encode_framerate;
2474dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
2475dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2476dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	if (rc) {
2477dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("Failed to set control\n");
2478dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		return false;
2479dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	}
2480dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
2481dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if(//ioctl(m_nDriver_fd, VEN_IOCTL_SET_FRAME_RATE,
2482dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      /*(void*)&ioctl_msg) < */0)
2483dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
2484dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_ERROR("\nERROR: Request for setting framerate failed");
2485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
2486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2487dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
2488dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  m_sVenc_cfg.fps_den = 1;
2489dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  m_sVenc_cfg.fps_num = control.value;
2490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!config)
2491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_level_set = false;
2493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(venc_set_profile_level(0, 0))
2494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2495dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT_HIGH("Calling set level (Framerate) with %d\n",profile_level.level);
2496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
2499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_color_format(OMX_COLOR_FORMATTYPE color_format)
2502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n venc_set_color_format: color_format = %u ", color_format);
2504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(color_format == OMX_COLOR_FormatYUV420SemiPlanar)
2506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_sVenc_cfg.inputformat= VEN_INPUTFMT_NV12_16M2KA;
2508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
2510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nWARNING: Unsupported Color format [%d]", color_format);
2512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_sVenc_cfg.inputformat= VEN_INPUTFMT_NV12_16M2KA;
2513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Default color format YUV420SemiPlanar is set");
2514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2515dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if (/*ioctl(m_nDriver_fd, VEN_IOCTL_SET_BASE_CFG, (void*)&ioctl_msg) < */0)
2516dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
2517dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_ERROR("\nERROR: Request for setting color format failed");
2518dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return false;
2519dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
2520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
2521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_intra_vop_refresh(OMX_BOOL intra_vop_refresh)
2524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n venc_set_intra_vop_refresh: intra_vop = %uc", intra_vop_refresh);
2526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(intra_vop_refresh == OMX_TRUE)
2527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2528dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if(/*ioctl(m_nDriver_fd, VEN_IOCTL_CMD_REQUEST_IFRAME, NULL) < */0)
2529dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
2530dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT_ERROR("\nERROR: Request for setting Intra VOP Refresh failed");
2531dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      return false;
2532dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
2533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
2535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR: VOP Refresh is False, no effect");
2537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
2539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_ratectrl_cfg(OMX_VIDEO_CONTROLRATETYPE eControlRate)
2542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool status = true;
2544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_control control;
2545dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	int rc;
2546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.id = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL;
2547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  switch(eControlRate)
2548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_Video_ControlRateDisable:
2550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_OFF;
2551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
2552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_Video_ControlRateVariableSkipFrames:
2553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_VBR_VFR;
2554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
2555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_Video_ControlRateVariable:
2556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_VBR_CFR;
2557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
2558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_Video_ControlRateConstantSkipFrames:
2559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	    control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_CBR_VFR;
2560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
2561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_Video_ControlRateConstant:
2562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	    control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_CBR_CFR;
2563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
2564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  default:
2565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    status = false;
2566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
2567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(status)
2570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2572dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	  printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
2573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
2575dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		printf("Failed to set control\n");
2576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
2577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2578dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
2579dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
2580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2581dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_RATE_CTRL_CFG,(void*)&ioctl_msg) < */0)
2582dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    {
2583dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      DEBUG_PRINT_ERROR("\nERROR: Request for setting rate control failed");
2584dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      status = false;
2585dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    }
2586dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    else
2587dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      rate_ctrl.rcmode = control.value;
2588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return status;
2590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_get_profile_level(OMX_U32 *eProfile,OMX_U32 *eLevel)
2593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool status = true;
2595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(eProfile == NULL || eLevel == NULL)
2596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
2598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4)
2601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    switch(codec_profile.profile)
2603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE:
2605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
2606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE:
2608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
2609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    default:
2611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eProfile = OMX_VIDEO_MPEG4ProfileMax;
2612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      status = false;
2613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(!status)
2617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return status;
2619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //profile level
2622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    switch(profile_level.level)
2623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_MPEG4_LEVEL_0:
2625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_MPEG4Level0;
2626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  case V4L2_MPEG_VIDEO_MPEG4_LEVEL_0B:
2628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_MPEG4Level0b;
2629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_MPEG4_LEVEL_1:
2631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_MPEG4Level1;
2632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_MPEG4_LEVEL_2:
2634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_MPEG4Level2;
2635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_MPEG4_LEVEL_3:
2637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_MPEG4Level3;
2638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_MPEG4_LEVEL_4:
2640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_MPEG4Level4;
2641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_MPEG4_LEVEL_5:
2643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_MPEG4Level5;
2644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    default:
2646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_MPEG4LevelMax;
2647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      status =  false;
2648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263)
2652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(codec_profile.profile == VEN_PROFILE_H263_BASELINE)
2654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eProfile = OMX_VIDEO_H263ProfileBaseline;
2656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
2658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eProfile = OMX_VIDEO_H263ProfileMax;
2660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return false;
2661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    switch(profile_level.level)
2663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case VEN_LEVEL_H263_10:
2665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_H263Level10;
2666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case VEN_LEVEL_H263_20:
2668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_H263Level20;
2669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case VEN_LEVEL_H263_30:
2671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_H263Level30;
2672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case VEN_LEVEL_H263_40:
2674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_H263Level40;
2675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case VEN_LEVEL_H263_45:
2677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_H263Level45;
2678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case VEN_LEVEL_H263_50:
2680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_H263Level50;
2681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case VEN_LEVEL_H263_60:
2683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_H263Level60;
2684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case VEN_LEVEL_H263_70:
2686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_H263Level70;
2687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    default:
2689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_H263LevelMax;
2690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      status = false;
2691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264)
2695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    switch(codec_profile.profile)
2697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
2699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eProfile = OMX_VIDEO_AVCProfileBaseline;
2700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
2702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eProfile = OMX_VIDEO_AVCProfileMain;
2703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
2705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eProfile = OMX_VIDEO_AVCProfileHigh;
2706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED:
2708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eProfile = OMX_VIDEO_AVCProfileExtended;
2709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10:
2711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eProfile = OMX_VIDEO_AVCProfileHigh10;
2712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422:
2714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eProfile = OMX_VIDEO_AVCProfileHigh422;
2715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE:
2717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eProfile = OMX_VIDEO_AVCProfileHigh444;
2718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    default:
2720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eProfile = OMX_VIDEO_AVCProfileMax;
2721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      status = false;
2722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(!status)
2726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return status;
2728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    switch(profile_level.level)
2731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_H264_LEVEL_1_0:
2733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_AVCLevel1;
2734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_H264_LEVEL_1B:
2736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_AVCLevel1b;
2737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_H264_LEVEL_1_1:
2739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_AVCLevel11;
2740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_H264_LEVEL_1_2:
2742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_AVCLevel12;
2743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_H264_LEVEL_1_3:
2745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_AVCLevel13;
2746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_H264_LEVEL_2_0:
2748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_AVCLevel2;
2749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_H264_LEVEL_2_1:
2751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_AVCLevel21;
2752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_H264_LEVEL_2_2:
2754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_AVCLevel22;
2755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_H264_LEVEL_3_0:
2757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_AVCLevel3;
2758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_H264_LEVEL_3_1:
2760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_AVCLevel31;
2761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_H264_LEVEL_3_2:
2763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_AVCLevel32;
2764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_H264_LEVEL_4_0:
2766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_AVCLevel4;
2767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	case V4L2_MPEG_VIDEO_H264_LEVEL_4_1:
2769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_AVCLevel41;
2770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	case V4L2_MPEG_VIDEO_H264_LEVEL_4_2:
2772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_AVCLevel42;
2773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	case V4L2_MPEG_VIDEO_H264_LEVEL_5_0:
2775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_AVCLevel5;
2776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	case V4L2_MPEG_VIDEO_H264_LEVEL_5_1:
2778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_AVCLevel51;
2779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	default :
2781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_AVCLevelMax;
2782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      status = false;
2783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return status;
2787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_validate_profile_level(OMX_U32 *eProfile, OMX_U32 *eLevel)
2790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 new_profile = 0, new_level = 0;
2792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned const int *profile_tbl = NULL;
2793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 mb_per_frame, mb_per_sec;
2794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool profile_level_found = false;
2795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Init profile table for respective codec");
2797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //validate the ht,width,fps,bitrate and set the appropriate profile and level
2798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4)
2799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(*eProfile == 0)
2801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!m_profile_set)
2803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
2805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
2807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          switch(codec_profile.profile)
2809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
2810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          case V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE:
2811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              *eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
2812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
2813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          case V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE:
2814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
2815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
2816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          default:
2817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("\n %s(): Unknown Error", __func__);
2818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return false;
2819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
2820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(*eLevel == 0 && !m_level_set)
2824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *eLevel = OMX_VIDEO_MPEG4LevelMax;
2826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(*eProfile == OMX_VIDEO_MPEG4ProfileSimple)
2829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profile_tbl = (unsigned int const *)mpeg4_profile_level_table;
2831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(*eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple)
2833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profile_tbl = (unsigned int const *)
2835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (&mpeg4_profile_level_table[MPEG4_ASP_START]);
2836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
2838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Unsupported MPEG4 profile type %lu", *eProfile);
2840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return false;
2841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264)
2844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(*eProfile == 0)
2846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!m_profile_set)
2848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          *eProfile = OMX_VIDEO_AVCProfileBaseline;
2850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
2852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          switch(codec_profile.profile)
2854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
2855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
2856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            *eProfile = OMX_VIDEO_AVCProfileBaseline;
2857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
2858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
2859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            *eProfile = OMX_VIDEO_AVCProfileMain;
2860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
2861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          case V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED:
2862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            *eProfile = OMX_VIDEO_AVCProfileExtended;
2863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
2864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		  case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
2865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            *eProfile = OMX_VIDEO_AVCProfileHigh;
2866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
2867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		  case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10:
2868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            *eProfile = OMX_VIDEO_AVCProfileHigh10;
2869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
2870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		  case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422:
2871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            *eProfile = OMX_VIDEO_AVCProfileHigh422;
2872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
2873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		  case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE:
2874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            *eProfile = OMX_VIDEO_AVCProfileHigh444;
2875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
2876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		  default:
2877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("\n %s(): Unknown Error", __func__);
2878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return false;
2879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
2880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(*eLevel == 0 && !m_level_set)
2884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *eLevel = OMX_VIDEO_AVCLevelMax;
2886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(*eProfile == OMX_VIDEO_AVCProfileBaseline)
2889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profile_tbl = (unsigned int const *)h264_profile_level_table;
2891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(*eProfile == OMX_VIDEO_AVCProfileHigh)
2893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profile_tbl = (unsigned int const *)
2895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (&h264_profile_level_table[H264_HP_START]);
2896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(*eProfile == OMX_VIDEO_AVCProfileMain)
2898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profile_tbl = (unsigned int const *)
2900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (&h264_profile_level_table[H264_MP_START]);
2901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
2903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Unsupported AVC profile type %lu", *eProfile);
2905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return false;
2906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263)
2909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(*eProfile == 0)
2911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!m_profile_set)
2913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          *eProfile = OMX_VIDEO_H263ProfileBaseline;
2915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
2917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          switch(codec_profile.profile)
2919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
2920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          case VEN_PROFILE_H263_BASELINE:
2921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            *eProfile = OMX_VIDEO_H263ProfileBaseline;
2922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
2923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          default:
2924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("\n %s(): Unknown Error", __func__);
2925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return false;
2926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
2927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(*eLevel == 0 && !m_level_set)
2931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *eLevel = OMX_VIDEO_H263LevelMax;
2933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(*eProfile == OMX_VIDEO_H263ProfileBaseline)
2936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profile_tbl = (unsigned int const *)h263_profile_level_table;
2938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
2940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Unsupported H.263 profile type %lu", *eProfile);
2942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return false;
2943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
2946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Invalid codec type");
2948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
2949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  mb_per_frame = ((m_sVenc_cfg.input_height + 15) >> 4)*
2952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   ((m_sVenc_cfg.input_width + 15)>> 4);
2953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2954dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if((mb_per_frame >= 3600) && (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4))
2955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2956dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if(codec_profile.profile == V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE)
2957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      profile_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
2958dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    if(codec_profile.profile == V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE)
2959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      profile_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
2960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      new_level = profile_level.level;
2962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      new_profile = codec_profile.profile;
2963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return true;
2964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  mb_per_sec = mb_per_frame * m_sVenc_cfg.fps_num / m_sVenc_cfg.fps_den;
2968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  do{
2970dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      if(mb_per_frame <= (int)profile_tbl[0])
2971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2972dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        if(mb_per_sec <= (int)profile_tbl[1])
2973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2974dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          if(m_sVenc_cfg.targetbitrate <= (int)profile_tbl[2])
2975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
2976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              new_level = (int)profile_tbl[3];
2977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              new_profile = (int)profile_tbl[4];
2978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              profile_level_found = true;
2979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_LOW("\n Appropriate profile/level found %d/%d\n", new_profile, new_level);
2980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              break;
2981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
2982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      profile_tbl = profile_tbl + 5;
2985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }while(profile_tbl[0] != 0);
2986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (profile_level_found != true)
2988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n ERROR: Unsupported profile/level\n");
2990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
2991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if((*eLevel == OMX_VIDEO_MPEG4LevelMax) || (*eLevel == OMX_VIDEO_AVCLevelMax)
2994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     || (*eLevel == OMX_VIDEO_H263LevelMax))
2995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *eLevel = new_level;
2997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("%s: Returning with eProfile = %lu"
2999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "Level = %lu", __func__, *eProfile, *eLevel);
3000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
3002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_
3004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_meta_mode(bool mode)
3005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3006dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  if(/*ioctl(m_nDriver_fd,VEN_IOCTL_SET_METABUFFER_MODE,&ioctl_msg) < */0)
3007dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
3008dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    DEBUG_PRINT_ERROR(" Set meta buffer mode failed");
3009dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    return false;
3010dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
3011dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  return true;
3012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3014