video_encoder_device_v4l2.cpp revision 826ececcbea342f7a0b92ec61847f1c95d384e05
1826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*--------------------------------------------------------------------------
2826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevCopyright (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.
11826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    * 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>
31826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include<unistd.h>
32826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <fcntl.h>
33826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include "video_encoder_device_copper.h"
34826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include "omx_video_encoder.h"
35826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <linux/android_pmem.h>
36826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
37826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <ion_msm.h>
38826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
39826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
40826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MPEG4_SP_START 0
41826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MPEG4_ASP_START (MPEG4_SP_START + 8)
42826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MPEG4_720P_LEVEL 6
43826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define H263_BP_START 0
44826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define H264_BP_START 0
45826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define H264_HP_START (H264_BP_START + 13)
46826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define H264_MP_START (H264_BP_START + 26)
47826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
48826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* MPEG4 profile and level table*/
49826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic const unsigned int mpeg4_profile_level_table[][5]=
50826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
51826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*max mb per frame, max mb per sec, max bitrate, level, profile*/
52826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,64000,OMX_VIDEO_MPEG4Level0,OMX_VIDEO_MPEG4ProfileSimple},
53826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,64000,OMX_VIDEO_MPEG4Level1,OMX_VIDEO_MPEG4ProfileSimple},
54826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,5940,128000,OMX_VIDEO_MPEG4Level2,OMX_VIDEO_MPEG4ProfileSimple},
55826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,384000,OMX_VIDEO_MPEG4Level3,OMX_VIDEO_MPEG4ProfileSimple},
56826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1200,36000,4000000,OMX_VIDEO_MPEG4Level4a,OMX_VIDEO_MPEG4ProfileSimple},
57826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1620,40500,8000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple},
58826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {3600,108000,12000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple},
59826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {0,0,0,0,0},
60826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
61826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,128000,OMX_VIDEO_MPEG4Level0,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
62826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,128000,OMX_VIDEO_MPEG4Level1,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
63826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,5940,384000,OMX_VIDEO_MPEG4Level2,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
64826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,768000,OMX_VIDEO_MPEG4Level3,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
65826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {792,23760,3000000,OMX_VIDEO_MPEG4Level4,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
66826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1620,48600,8000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
67826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {0,0,0,0,0},
68826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev};
69826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
70826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* H264 profile and level table*/
71826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic const unsigned int h264_profile_level_table[][5]=
72826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
73826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     /*max mb per frame, max mb per sec, max bitrate, level, profile*/
74826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,64000,OMX_VIDEO_AVCLevel1,OMX_VIDEO_AVCProfileBaseline},
75826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,128000,OMX_VIDEO_AVCLevel1b,OMX_VIDEO_AVCProfileBaseline},
76826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,3000,192000,OMX_VIDEO_AVCLevel11,OMX_VIDEO_AVCProfileBaseline},
77826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,6000,384000,OMX_VIDEO_AVCLevel12,OMX_VIDEO_AVCProfileBaseline},
78826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,768000,OMX_VIDEO_AVCLevel13,OMX_VIDEO_AVCProfileBaseline},
79826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,2000000,OMX_VIDEO_AVCLevel2,OMX_VIDEO_AVCProfileBaseline},
80826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {792,19800,4000000,OMX_VIDEO_AVCLevel21,OMX_VIDEO_AVCProfileBaseline},
81826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1620,20250,4000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileBaseline},
82826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1620,40500,10000000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileBaseline},
83826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {3600,108000,14000000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileBaseline},
84826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {5120,216000,20000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileBaseline},
85826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {8192,245760,20000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileBaseline},
86826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {0,0,0,0,0},
87826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
88826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,64000,OMX_VIDEO_AVCLevel1,OMX_VIDEO_AVCProfileHigh},
89826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,160000,OMX_VIDEO_AVCLevel1b,OMX_VIDEO_AVCProfileHigh},
90826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,3000,240000,OMX_VIDEO_AVCLevel11,OMX_VIDEO_AVCProfileHigh},
91826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,6000,480000,OMX_VIDEO_AVCLevel12,OMX_VIDEO_AVCProfileHigh},
92826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,960000,OMX_VIDEO_AVCLevel13,OMX_VIDEO_AVCProfileHigh},
93826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,2500000,OMX_VIDEO_AVCLevel2,OMX_VIDEO_AVCProfileHigh},
94826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {792,19800,5000000,OMX_VIDEO_AVCLevel21,OMX_VIDEO_AVCProfileHigh},
95826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1620,20250,5000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileHigh},
96826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1620,40500,12500000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileHigh},
97826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {3600,108000,17500000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileHigh},
98826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {5120,216000,25000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileHigh},
99826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {8192,245760,25000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileHigh},
100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {0,0,0,0,0},
101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,64000,OMX_VIDEO_AVCLevel1,OMX_VIDEO_AVCProfileMain},
103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,128000,OMX_VIDEO_AVCLevel1b,OMX_VIDEO_AVCProfileMain},
104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,3000,192000,OMX_VIDEO_AVCLevel11,OMX_VIDEO_AVCProfileMain},
105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,6000,384000,OMX_VIDEO_AVCLevel12,OMX_VIDEO_AVCProfileMain},
106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,768000,OMX_VIDEO_AVCLevel13,OMX_VIDEO_AVCProfileMain},
107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,2000000,OMX_VIDEO_AVCLevel2,OMX_VIDEO_AVCProfileMain},
108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {792,19800,4000000,OMX_VIDEO_AVCLevel21,OMX_VIDEO_AVCProfileMain},
109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1620,20250,4000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileMain},
110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1620,40500,10000000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileMain},
111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {3600,108000,14000000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileMain},
112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {5120,216000,20000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileMain},
113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {8192,245760,20000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileMain},
114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {0,0,0,0,0}
115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev};
117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* H263 profile and level table*/
119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic const unsigned int h263_profile_level_table[][5]=
120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*max mb per frame, max mb per sec, max bitrate, level, profile*/
122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,64000,OMX_VIDEO_H263Level10,OMX_VIDEO_H263ProfileBaseline},
123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,5940,128000,OMX_VIDEO_H263Level20,OMX_VIDEO_H263ProfileBaseline},
124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,384000,OMX_VIDEO_H263Level30,OMX_VIDEO_H263ProfileBaseline},
125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,2048000,OMX_VIDEO_H263Level40,OMX_VIDEO_H263ProfileBaseline},
126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,128000,OMX_VIDEO_H263Level45,OMX_VIDEO_H263ProfileBaseline},
127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,19800,4096000,OMX_VIDEO_H263Level50,OMX_VIDEO_H263ProfileBaseline},
128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {810,40500,8192000,OMX_VIDEO_H263Level60,OMX_VIDEO_H263ProfileBaseline},
129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1620,81000,16384000,OMX_VIDEO_H263Level70,OMX_VIDEO_H263ProfileBaseline},
130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {0,0,0,0,0}
131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev};
132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Log2(number, power)  { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) &&  power < 16) { temp >>=0x1; power++; } }
134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power);  num = q >> power; den = 0x1 << (16 - power); }
135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *inputBufferFile1;
138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar inputfilename [] = "/data/input.yuv";
139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *outputBufferFile1;
142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar outputfilename [] = "/data/output-bitstream.\0\0\0\0";
143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//constructor
145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvenc_dev::venc_dev(class omx_venc *venc_class)
146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//nothing to do
148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvenc_handle = venc_class;
149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevetb_count=0;
150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvenc_dev::~venc_dev()
153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //nothing to do
155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid* async_venc_message_thread (void *input)
158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct venc_timeout timeout;
160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct venc_msg venc_msg;
161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   omx_video* omx_venc_base = NULL;
162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   omx_venc *omx = reinterpret_cast<omx_venc*>(input);
163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   omx_venc_base = reinterpret_cast<omx_video*>(input);
164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   OMX_BUFFERHEADERTYPE* omxhdr = NULL;
165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  prctl(PR_SET_NAME, (unsigned long)"VideoEncCallBackThread", 0, 0, 0);
168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  timeout.millisec = VEN_TIMEOUT_INFINITE;
169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct v4l2_plane plane;
170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct pollfd pfd;
171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct v4l2_buffer v4l2_buf ={0};
172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct v4l2_event dqevent;
173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pfd.events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI;
174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pfd.fd = omx->handle->m_nDriver_fd;
175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int error_code = 0,rc=0;
176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  while(1)
177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    	rc = poll(&pfd, 1, TIMEOUT);
179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		if (!rc) {
180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			printf("Poll timedout\n");
181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			break;
182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		} else if (rc < 0) {
183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			printf("Error while polling: %d\n", rc);
184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			break;
185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		if ((pfd.revents & POLLIN) || (pfd.revents & POLLRDNORM)) {
187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			v4l2_buf.memory = V4L2_MEMORY_USERPTR;
189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			v4l2_buf.length = 1;
190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			v4l2_buf.m.planes = &plane;
191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			rc = ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf);
192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			if (rc) {
193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				printf("Failed to dequeue buf: %d from capture capability\n", rc);
194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				break;
195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			}
196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			venc_msg.msgcode=VEN_MSG_OUTPUT_BUFFER_DONE;
197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			venc_msg.statuscode=VEN_S_SUCCESS;
198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        omxhdr=omx_venc_base->m_out_mem_ptr+v4l2_buf.index;
199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			venc_msg.buf.len= v4l2_buf.m.planes->bytesused;
200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        venc_msg.buf.offset = v4l2_buf.m.planes->reserved[1];
201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                	venc_msg.buf.ptrbuffer = (OMX_U8 *)omx_venc_base->m_pOutput_pmem[v4l2_buf.index].buffer;
202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			venc_msg.buf.clientdata=(void*)omxhdr;
204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		} else if((pfd.revents & POLLOUT) || (pfd.revents & POLLWRNORM)) {
205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			v4l2_buf.memory = V4L2_MEMORY_USERPTR;
207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			v4l2_buf.m.planes = &plane;
208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			rc = ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf);
209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			if (rc) {
210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				printf("Failed to dequeue buf: %d from output capability\n", rc);
211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				break;
212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			}
213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        venc_msg.msgcode=VEN_MSG_INPUT_BUFFER_DONE;
214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			venc_msg.statuscode=VEN_S_SUCCESS;
215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        omxhdr=omx_venc_base->m_inp_mem_ptr+v4l2_buf.index;
216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        venc_msg.buf.clientdata=(void*)omxhdr;
217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		} else if (pfd.revents & POLLPRI){
218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			rc = ioctl(pfd.fd, VIDIOC_DQEVENT, &dqevent);
219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			printf("\n Data Recieved = %d \n",dqevent.u.data[0]);
220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			if(dqevent.u.data[0] == MSM_VIDC_CLOSE_DONE){
221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				break;
222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			}
223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		} else {
224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			/*TODO: How to handle this case */
225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			continue;
226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		if(omx->async_message_process(input,&venc_msg) < 0)
229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		{
230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			DEBUG_PRINT_ERROR("\nERROR: Wrong ioctl message");
231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			break;
232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("omx_venc: Async Thread exit\n");
235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return NULL;
236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_open(OMX_U32 codec)
239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int r;
241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned int   alignment = 0,buffer_size = 0, temp =0;
242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_nDriver_fd = open ("/dev/video33",O_RDWR);
244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_nDriver_fd == 0)
245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("ERROR: Got fd as 0 for msm_vidc_enc, Opening again\n");
247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_nDriver_fd = open ("/dev/video33",O_RDWR);
248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if((int)m_nDriver_fd < 0)
251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("ERROR: Omx_venc::Comp Init Returning failure\n");
253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\nm_nDriver_fd = %d\n", m_nDriver_fd);
257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef SINGLE_ENCODER_INSTANCE
258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 num_instances = 0;
259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(/*ioctl (m_nDriver_fd, VEN_IOCTL_GET_NUMBER_INSTANCES, (void*)&ioctl_msg) < */0 )
260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR: Request number of encoder instances failed");
262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if (num_instances > 1)
264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nSecond encoder instance rejected!");
266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    venc_close();
267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  // set the basic configuration of the video encoder driver
271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_sVenc_cfg.input_width = OMX_CORE_QCIF_WIDTH;
272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_sVenc_cfg.input_height= OMX_CORE_QCIF_HEIGHT;
273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_sVenc_cfg.dvs_width = OMX_CORE_QCIF_WIDTH;
274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_sVenc_cfg.dvs_height = OMX_CORE_QCIF_HEIGHT;
275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_sVenc_cfg.fps_num = 30;
276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_sVenc_cfg.fps_den = 1;
277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_sVenc_cfg.targetbitrate = 64000;
278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_sVenc_cfg.inputformat= V4L2_PIX_FMT_NV12;
279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(codec == OMX_VIDEO_CodingMPEG4)
280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_sVenc_cfg.codectype = V4L2_PIX_FMT_MPEG4;
282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    codec_profile.profile = V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE;
283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    profile_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_2;
284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    strcat(outputfilename, "m4v");
286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(codec == OMX_VIDEO_CodingH263)
289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_sVenc_cfg.codectype = V4L2_PIX_FMT_H263;
291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    codec_profile.profile = VEN_PROFILE_H263_BASELINE;
292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    profile_level.level = VEN_LEVEL_H263_20;
293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    strcat(outputfilename, "263");
295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(codec == OMX_VIDEO_CodingAVC)
298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_sVenc_cfg.codectype = V4L2_PIX_FMT_H264;
300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    codec_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE;
301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    profile_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_0;
302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    strcat(outputfilename, "264");
304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_BASE_CFG,(void*)&ioctl_msg) < */0 )
307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR: Request for setting base configuration failed");
309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  inputBufferFile1 = fopen (inputfilename, "ab");
313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  outputBufferFile1 = fopen (outputfilename, "ab");
316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int ret;
318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_event_subscription sub;
319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	sub.type=V4L2_EVENT_ALL;
320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	ret = ioctl(m_nDriver_fd, VIDIOC_SUBSCRIBE_EVENT, &sub);
321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (ret) {
322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("\n Subscribe Event Failed \n");
323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_capability cap;
326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_fmtdesc fdesc;
327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_format fmt;
328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_requestbuffers bufreq;
329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		ret = ioctl(m_nDriver_fd, VIDIOC_QUERYCAP, &cap);
331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		if (ret) {
332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		  printf("Failed to query capabilities\n");
333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		} else {
334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		  printf("Capabilities: driver_name = %s, card = %s, bus_info = %s,"
335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				" version = %d, capabilities = %x\n", cap.driver, cap.card,
336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				cap.bus_info, cap.version, cap.capabilities);
337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		//printf(" \n VIDIOC_QUERYCAP Successful  \n ");
339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		ret=0;
340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fdesc.index=0;
342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		while (ioctl(m_nDriver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			printf("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description,
344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					fdesc.pixelformat, fdesc.flags);
345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			fdesc.index++;
346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		//printf("\n VIDIOC_ENUM_FMT CAPTURE Successful  \n ");
348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fdesc.index=0;
350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		while (ioctl(m_nDriver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			printf("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description,
353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev					fdesc.pixelformat, fdesc.flags);
354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev			fdesc.index++;
355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		//printf(" \n VIDIOC_ENUM_FMT OUTPUT Successful \n ");
357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_sOutput_buff_property.alignment=m_sInput_buff_property.alignment=4096;
359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV12;
364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		ret = ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt);
366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		//printf(" \n VIDIOC_S_FMT OUTPUT Successful \n ");
367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_sInput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		//printf("m_sInput_buff_property.datasize = %d\n",m_sInput_buff_property.datasize);
369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_H264;
374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		ret = ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt);
376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		//printf(" \n VIDIOC_S_FMT CAPTURE Successful \n ");
377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_sOutput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		//printf("m_sOutput_buff_property.datasize = %d\n",m_sOutput_buff_property.datasize);
379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//		struct v4l2_requestbuffers bufreq;
380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		bufreq.memory = V4L2_MEMORY_USERPTR;
382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		bufreq.count = 2;
383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		ret = ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq);
386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_sInput_buff_property.mincount=m_sInput_buff_property.maxcount=m_sInput_buff_property.actualcount=bufreq.count;
387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		//printf(" \n VIDIOC_REQBUFS OUTPUT Successful \n ");
388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		//printf("m_sInput_buff_property.datasize = %d\n",m_sInput_buff_property.datasize);
389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		//printf("m_sInput_buff_property.mincount = %d\n",m_sInput_buff_property.mincount);
390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		bufreq.count = 2;
392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		ret = ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq);
393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_sOutput_buff_property.mincount=m_sOutput_buff_property.maxcount=m_sOutput_buff_property.actualcount=bufreq.count;
394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		//printf(" \n VIDIOC_REQBUFS CAPTURE Successful  \n ");
395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		//printf("m_sInput_buff_property.mincount = %d\n",m_sOutput_buff_property.mincount);
396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(/*ioctl (m_nDriver_fd,VEN_IOCTL_GET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < */0)
398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR: Request for getting i/p buffer requirement failed");
400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(/*ioctl (m_nDriver_fd,VEN_IOCTL_GET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < */0)
403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR: Request for getting o/p buffer requirement failed");
405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	///printf("\n \n Setting Profile and Level \n \n ");
408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //m_profile_set = false;
409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //m_level_set = false;
410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(/*venc_set_profile_level(0, 0)*/0)
411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n %s(): Init Profile/Level setting success",
413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        __func__);
414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  recon_buffers_count = MAX_RECON_BUFFERS;
416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid venc_dev::venc_close()
420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\nvenc_close: fd = %d", m_nDriver_fd);
422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if((int)m_nDriver_fd >= 0)
423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n venc_close(): Calling VEN_IOCTL_CMD_STOP_READ_MSG");
425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //(void)ioctl(m_nDriver_fd, VEN_IOCTL_CMD_STOP_READ_MSG,
426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //  NULL);
427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\nCalling close()\n");
428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         int rc=0;
430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	 enum v4l2_buf_type btype;
431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	 btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	 rc = ioctl(m_nDriver_fd, VIDIOC_STREAMOFF, &btype);
433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	 if (rc) {
434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		/* STREAMOFF will never fail */
435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("\n Failed to call streamoff on OUTPUT Port \n");
436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	 btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	 rc = ioctl(m_nDriver_fd, VIDIOC_STREAMOFF, &btype);
440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	 if (rc) {
441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		/* STREAMOFF will never fail */
442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("\n Failed to call streamoff on CAPTURE Port \n");
443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        struct v4l2_event_subscription sub;
445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	sub.type=V4L2_EVENT_ALL;
446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("Failed to get control\n");
449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return ;
450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    close(m_nDriver_fd);
452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_nDriver_fd = -1;
453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  fclose (inputBufferFile1);
456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  fclose (outputBufferFile1);
459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_buf_req(unsigned long *min_buff_count,
463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                unsigned long *actual_buff_count,
464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                unsigned long *buff_size,
465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                unsigned long port)
466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned long temp_count = 0;
469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(port == 0)
471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(*actual_buff_count > m_sInput_buff_property.mincount)
473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      temp_count = m_sInput_buff_property.actualcount;
475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_sInput_buff_property.actualcount = *actual_buff_count;
476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < */0)
477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nERROR: Request for setting i/p buffer requirement failed");
479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_sInput_buff_property.actualcount = temp_count;
480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return false;
481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n I/P Count set to %lu\n", *actual_buff_count);
483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(*actual_buff_count > m_sOutput_buff_property.mincount)
488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  temp_count = m_sOutput_buff_property.actualcount;
490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_sOutput_buff_property.actualcount = *actual_buff_count;
491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < */0)
492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nERROR: Request for setting o/p buffer requirement failed");
494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_sOutput_buff_property.actualcount = temp_count;
495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return false;
496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n O/P Count set to %lu\n", *actual_buff_count);
498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_loaded_start()
506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_loaded_stop()
511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_loaded_start_done()
516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_loaded_stop_done()
521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_get_seq_hdr(void *buffer,
526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    unsigned buffer_size, unsigned *header_len)
527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_get_buf_req(unsigned long *min_buff_count,
532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                unsigned long *actual_buff_count,
533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                unsigned long *buff_size,
534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                unsigned long port)
535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_format fmt;
537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_requestbuffers bufreq;
538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int ret;
539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(port == 0)
540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(/*ioctl (m_nDriver_fd,VEN_IOCTL_GET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < */0)
542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR: Request for getting i/p buffer requirement failed");
544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return false;
545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV12;
551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		ret = ioctl(m_nDriver_fd, VIDIOC_G_FMT, &fmt);
552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		//printf(" \n VIDIOC_S_FMT OUTPUT Successful \n ");
553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_sInput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbufreq.memory = V4L2_MEMORY_USERPTR;
556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		bufreq.count = 2;
557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		ret = ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq);
560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_sInput_buff_property.mincount=m_sInput_buff_property.maxcount=m_sInput_buff_property.actualcount=bufreq.count;
561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *min_buff_count = m_sInput_buff_property.mincount;
564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *actual_buff_count = m_sInput_buff_property.actualcount;
565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // For ION memory allocations of the allocated buffer size
567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // must be 4k aligned, hence aligning the input buffer
568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // size to 4k.
569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_sInput_buff_property.datasize = (m_sInput_buff_property.datasize + 4095)
570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                       & (~4095);
571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *buff_size = m_sInput_buff_property.datasize;
573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(/*ioctl (m_nDriver_fd,VEN_IOCTL_GET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < */0)
577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR: Request for getting o/p buffer requirement failed");
579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return false;
580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_H264;
586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		ret = ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt);
588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		//printf(" \n VIDIOC_S_FMT CAPTURE Successful \n ");
589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_sOutput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_H264;
594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		ret = ioctl(m_nDriver_fd, VIDIOC_G_FMT, &fmt);
596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		//printf(" \n VIDIOC_S_FMT CAPTURE Successful \n ");
597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		m_sOutput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *min_buff_count = m_sOutput_buff_property.mincount;
601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *actual_buff_count = m_sOutput_buff_property.actualcount;
602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *buff_size = m_sOutput_buff_property.datasize;
603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_param(void *paramData,OMX_INDEXTYPE index )
610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("venc_set_param:: venc-720p\n");
612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  switch(index)
613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_IndexParamPortDefinition:
615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamPortDefinition\n");
619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(portDefn->nPortIndex == PORT_INDEX_IN)
620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_color_format(portDefn->format.video.eColorFormat))
622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(m_sVenc_cfg.input_height != portDefn->format.video.nFrameHeight ||
626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_sVenc_cfg.input_width != portDefn->format.video.nFrameWidth)
627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("\n Basic parameter has changed");
629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_sVenc_cfg.input_height = portDefn->format.video.nFrameHeight;
630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_sVenc_cfg.input_width = portDefn->format.video.nFrameWidth;
631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_BASE_CFG,(void*)&ioctl_msg) < */0)
633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\nERROR: Request for setting base config failed");
635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return false;
636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("\n Updating the buffer count/size for the new resolution");
639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(/*ioctl (m_nDriver_fd, VEN_IOCTL_GET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < */0)
640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\nERROR: Request for getting i/p bufreq failed");
642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return false;
643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("\n Got updated m_sInput_buff_property values: "
645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      "datasize = %u, maxcount = %u, actualcnt = %u, "
646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      "mincount = %u", m_sInput_buff_property.datasize,
647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_sInput_buff_property.maxcount, m_sInput_buff_property.actualcount,
648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_sInput_buff_property.mincount);
649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(/*ioctl (m_nDriver_fd, VEN_IOCTL_GET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < */0)
651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\nERROR: Request for getting o/p bufreq failed");
653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return false;
654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("\n Got updated m_sOutput_buff_property values: "
657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      "datasize = %u, maxcount = %u, actualcnt = %u, "
658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      "mincount = %u", m_sOutput_buff_property.datasize,
659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_sOutput_buff_property.maxcount, m_sOutput_buff_property.actualcount,
660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      m_sOutput_buff_property.mincount);
661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(/*ioctl (m_nDriver_fd, VEN_IOCTL_SET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) <*/ 0)
662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\nERROR: Request for setting o/p bufreq failed");
664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return false;
665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if((portDefn->nBufferCountActual >= m_sInput_buff_property.mincount) &&
668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           (portDefn->nBufferCountActual <= m_sInput_buff_property.maxcount))
669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_sInput_buff_property.actualcount = portDefn->nBufferCountActual;
671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(/*ioctl(m_nDriver_fd,VEN_IOCTL_SET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < */0)
672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("\nERROR: Request for setting i/p buffer requirements failed");
674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              return false;
675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(m_sInput_buff_property.datasize != portDefn->nBufferSize)
678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\nWARNING: Requested i/p bufsize[%u],"
680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                              "Driver's updated i/p bufsize = %u", portDefn->nBufferSize,
681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                              m_sInput_buff_property.datasize);
682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_level_set = false;
684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(venc_set_profile_level(0, 0))
685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_HIGH("\n %s(): Profile/Level setting success", __func__);
687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if((portDefn->nBufferCountActual >= m_sInput_buff_property.mincount) &&
692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           (m_sInput_buff_property.maxcount >= portDefn->nBufferCountActual) &&
693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            (m_sInput_buff_property.datasize == portDefn->nBufferSize))
694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            m_sInput_buff_property.actualcount = portDefn->nBufferCountActual;
696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_INPUT_BUFFER_REQ,(void*)&ioctl_msg) < */0)
697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("\nERROR: ioctl VEN_IOCTL_SET_INPUT_BUFFER_REQ failed");
699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              return false;
700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\nERROR: Setting Input buffer requirements failed");
705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return false;
706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(portDefn->nPortIndex == PORT_INDEX_OUT)
710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_encode_framerate(portDefn->format.video.xFramerate, 0))
712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_target_bitrate(portDefn->format.video.nBitrate, 0))
717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if( (portDefn->nBufferCountActual >= m_sOutput_buff_property.mincount)
722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            &&
723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            (m_sOutput_buff_property.maxcount >= portDefn->nBufferCountActual)
724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            &&
725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            (m_sOutput_buff_property.datasize == portDefn->nBufferSize)
726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          )
727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          m_sOutput_buff_property.actualcount = portDefn->nBufferCountActual;
729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_OUTPUT_BUFFER_REQ,(void*)&ioctl_msg) < */0)
730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_ERROR("\nERROR: ioctl VEN_IOCTL_SET_OUTPUT_BUFFER_REQ failed");
732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return false;
733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Setting Output buffer requirements failed");
738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamPortDefinition");
744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_IndexParamVideoPortFormat:
748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt;
750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      portFmt =(OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoPortFormat\n");
752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(portFmt->nPortIndex == (OMX_U32) PORT_INDEX_IN)
754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_color_format(portFmt->eColorFormat))
756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(portFmt->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_encode_framerate(portFmt->xFramerate, 0))
763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoPortFormat");
770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_IndexParamVideoBitrate:
774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_VIDEO_PARAM_BITRATETYPE* pParam;
776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pParam = (OMX_VIDEO_PARAM_BITRATETYPE*)paramData;
777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoBitrate\n");
778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_target_bitrate(pParam->nTargetBitrate, 0))
782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Target Bit Rate setting failed");
784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_ratectrl_cfg(pParam->eControlRate))
787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Rate Control setting failed");
789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoBitrate");
795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_IndexParamVideoMpeg4:
799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_VIDEO_PARAM_MPEG4TYPE* pParam;
801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_U32 bFrames = 0;
802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      pParam = (OMX_VIDEO_PARAM_MPEG4TYPE*)paramData;
804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoMpeg4\n");
805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_voptiming_cfg(pParam->nTimeIncRes))
808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Request for setting vop_timing failed");
810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_profile_set = false;
813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_level_set = false;
814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_profile_level (pParam->eProfile, pParam->eLevel))
815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating Profile and level");
817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else {
820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(pParam->eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple)
821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(pParam->nBFrames)
823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              bFrames = 1;
826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(pParam->nBFrames)
831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("Warning: B frames not supported\n");
833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              bFrames = 0;
834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_intra_period (pParam->nPFrames,bFrames))
838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_multislice_cfg(OMX_IndexParamVideoMpeg4,pParam->nSliceHeaderSpacing))
843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating slice_config");
845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoMpeg4");
851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_IndexParamVideoH263:
855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_VIDEO_PARAM_H263TYPE* pParam = (OMX_VIDEO_PARAM_H263TYPE*)paramData;
857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoH263\n");
858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_U32 bFrames = 0;
859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_profile_set = false;
862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_level_set = false;
863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_profile_level (pParam->eProfile, pParam->eLevel))
864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating Profile and level");
866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if (pParam->nBFrames)
869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nWARNING: B frame not supported for H.263");
870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(venc_set_intra_period (pParam->nPFrames, bFrames) == false)
872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoH263");
880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_IndexParamVideoAvc:
884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoAvc\n");
886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_VIDEO_PARAM_AVCTYPE* pParam = (OMX_VIDEO_PARAM_AVCTYPE*)paramData;
887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_U32 bFrames = 0;
888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("pParam->eProfile :%d ,pParam->eLevel %d\n",
892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pParam->eProfile,pParam->eLevel);
893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_profile_set = false;
895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_level_set = false;
896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_profile_level (pParam->eProfile,pParam->eLevel))
898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating Profile and level %d, %d",
900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            pParam->eProfile, pParam->eLevel);
901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else {
904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(pParam->eProfile != OMX_VIDEO_AVCProfileBaseline)
905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(pParam->nBFrames)
907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              bFrames = 1;
910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            if(pParam->nBFrames)
915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            {
916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR("Warning: B frames not supported\n");
917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              bFrames = 0;
918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_intra_period (pParam->nPFrames, bFrames))
922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_entropy_config (pParam->bEntropyCodingCABAC, pParam->nCabacInitIdc))
927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Request for setting Entropy failed");
929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_inloop_filter (pParam->eLoopFilterMode))
932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Request for setting Inloop filter failed");
934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		  printf("\n \n Returned here line line 903 \n \n ");
935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_multislice_cfg(OMX_IndexParamVideoAvc, pParam->nSliceHeaderSpacing))
938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nWARNING: Unsuccessful in updating slice_config");
940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoAvc");
946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      //TBD, lot of other variables to be updated, yet to decide
948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_IndexParamVideoIntraRefresh:
951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoIntraRefresh\n");
953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_VIDEO_PARAM_INTRAREFRESHTYPE *intra_refresh =
954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (OMX_VIDEO_PARAM_INTRAREFRESHTYPE *)paramData;
955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(intra_refresh->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(/*venc_set_intra_refresh(intra_refresh->eRefreshMode, intra_refresh->nCirMBs) == */false)
958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Setting Intra refresh failed");
960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoIntraRefresh");
966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_IndexParamVideoErrorCorrection:
970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoErrorCorrection\n");
972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *error_resilience =
973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)paramData;
974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(error_resilience->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(venc_set_error_resilience(error_resilience) == false)
977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Setting Intra refresh failed");
979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoErrorCorrection");
985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_IndexParamVideoProfileLevelCurrent:
989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoProfileLevelCurrent\n");
991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_VIDEO_PARAM_PROFILELEVELTYPE *profile_level =
992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData;
993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(profile_level->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_profile_set = false;
996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        m_level_set = false;
997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!venc_set_profile_level (profile_level->eProfile,
998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                   profile_level->eLevel))
999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nWARNING: Unsuccessful in updating Profile and level");
1001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
1002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
1005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoProfileLevelCurrent");
1007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_IndexParamVideoQuantization:
1011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoQuantization\n");
1013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_VIDEO_PARAM_QUANTIZATIONTYPE *session_qp =
1014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        (OMX_VIDEO_PARAM_QUANTIZATIONTYPE *)paramData;
1015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(session_qp->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
1016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(venc_set_session_qp (session_qp->nQpI,
1018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                session_qp->nQpP,
1019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev				session_qp->nQpB) == false)
1020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Setting Session QP failed");
1022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
1023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
1026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoQuantization");
1028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_IndexParamVideoSliceFMO:
1032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  default:
1033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  DEBUG_PRINT_ERROR("\nERROR: Unsupported parameter in venc_set_param: %u",
1034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      index);
1035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
1036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //case
1037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
1040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_config(void *configData, OMX_INDEXTYPE index)
1043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Inside venc_set_config");
1046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  switch(index)
1048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_IndexConfigVideoBitrate:
1050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_VIDEO_CONFIG_BITRATETYPE *bit_rate = (OMX_VIDEO_CONFIG_BITRATETYPE *)
1052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        configData;
1053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n venc_set_config: OMX_IndexConfigVideoBitrate");
1054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(bit_rate->nPortIndex == (OMX_U32)PORT_INDEX_OUT)
1055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(venc_set_target_bitrate(bit_rate->nEncodeBitrate, 1) == false)
1057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Setting Target Bit rate failed");
1059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
1060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
1063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexConfigVideoBitrate");
1065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_IndexConfigVideoFramerate:
1069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_CONFIG_FRAMERATETYPE *frame_rate = (OMX_CONFIG_FRAMERATETYPE *)
1071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        configData;
1072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n venc_set_config: OMX_IndexConfigVideoFramerate");
1073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(frame_rate->nPortIndex == (OMX_U32)PORT_INDEX_OUT)
1074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(venc_set_encode_framerate(frame_rate->xEncodeFramerate, 1) == false)
1076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Setting Encode Framerate failed");
1078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
1079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
1082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexConfigVideoFramerate");
1084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case QOMX_IndexConfigVideoIntraperiod:
1088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("venc_set_param:QOMX_IndexConfigVideoIntraperiod\n");
1090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      QOMX_VIDEO_INTRAPERIODTYPE *intraperiod =
1091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      (QOMX_VIDEO_INTRAPERIODTYPE *)configData;
1092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(intraperiod->nPortIndex == (OMX_U32) PORT_INDEX_OUT)
1093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(venc_set_intra_period(intraperiod->nPFrames, intraperiod->nBFrames) == false)
1095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
1097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
1098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_IndexConfigVideoIntraVOPRefresh:
1103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_CONFIG_INTRAREFRESHVOPTYPE *intra_vop_refresh = (OMX_CONFIG_INTRAREFRESHVOPTYPE *)
1105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        configData;
1106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n venc_set_config: OMX_IndexConfigVideoIntraVOPRefresh");
1107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(intra_vop_refresh->nPortIndex == (OMX_U32)PORT_INDEX_OUT)
1108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(venc_set_intra_vop_refresh(intra_vop_refresh->IntraRefreshVOP) == false)
1110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Setting Encode Framerate failed");
1112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
1113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
1116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexConfigVideoFramerate");
1118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_IndexConfigCommonRotate:
1122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_CONFIG_ROTATIONTYPE *config_rotation =
1124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         reinterpret_cast<OMX_CONFIG_ROTATIONTYPE*>(configData);
1125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_U32 nFrameWidth;
1126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("\nvenc_set_config: updating the new Dims");
1128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      nFrameWidth = m_sVenc_cfg.input_width;
1129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_sVenc_cfg.input_width  = m_sVenc_cfg.input_height;
1130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      m_sVenc_cfg.input_height = nFrameWidth;
1131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_BASE_CFG,(void*)&ioctl_msg) < */0) {
1132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_ERROR("\nERROR: Dimension Change for Rotation failed");
1133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return false;
1134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  default:
1138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n Unsupported config index = %u", index);
1139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
1140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
1143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned venc_dev::venc_stop( void)
1146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pmem_free();
1148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return 0;
1149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned venc_dev::venc_pause(void)
1152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return 0;
1154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned venc_dev::venc_resume(void)
1157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return 0;
1159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned venc_dev::venc_start_done(void)
1162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct venc_msg venc_msg;
1164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  venc_msg.msgcode=VEN_MSG_START;
1165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  venc_msg.statuscode=VEN_S_SUCCESS;
1166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  venc_handle->async_message_process(venc_handle,&venc_msg);
1167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return 0;
1168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned venc_dev::venc_stop_done(void)
1171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct venc_msg venc_msg;
1173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  venc_msg.msgcode=VEN_MSG_STOP;
1174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  venc_msg.statuscode=VEN_S_SUCCESS;
1175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  venc_handle->async_message_process(venc_handle,&venc_msg);
1176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return 0;
1177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned venc_dev::venc_start(void)
1180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	enum v4l2_buf_type buf_type;
1182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int ret,r;
1183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("\n %s(): Check Profile/Level set in driver before start",
1184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        __func__);
1185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (!venc_set_profile_level(0, 0))
1186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n ERROR: %s(): Driver Profile/Level is NOT SET",
1188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      __func__);
1189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
1191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n %s(): Driver Profile[%lu]/Level[%lu] successfully SET",
1193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      __func__, codec_profile.profile, profile_level.level);
1194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  venc_config_print();
1196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if((codec_profile.profile == V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE) ||
1199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     (codec_profile.profile == V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE) ||
1200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     (codec_profile.profile == VEN_PROFILE_H263_BASELINE))
1201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    recon_buffers_count = MAX_RECON_BUFFERS - 2;
1202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
1203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    recon_buffers_count = MAX_RECON_BUFFERS;
1204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
1207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	ret=ioctl(m_nDriver_fd, VIDIOC_STREAMON,&buf_type);
1209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (ret) {
1211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return -1;
1212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else {
1214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return 0;
1215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 venc_dev::pmem_allocate(OMX_U32 size, OMX_U32 alignment, OMX_U32 count)
1219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 pmem_fd = -1;
1221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 width, height;
1222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  void *buf_addr = NULL;
1223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct pmem_allocation allocation;
1224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct venc_recon_addr recon_addr;
1225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int rc = 0;
1226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
1228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  recon_buff[count].ion_device_fd = open (MEM_DEVICE,O_RDONLY|O_DSYNC);
1229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(recon_buff[count].ion_device_fd < 0)
1230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR: ION Device open() Failed");
1232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return -1;
1233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  recon_buff[count].alloc_data.len = size;
1236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  recon_buff[count].alloc_data.flags = 0x1 << MEM_HEAP_ID;
1237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  recon_buff[count].alloc_data.align = clip2(alignment);
1238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (recon_buff[count].alloc_data.align != 8192)
1239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    recon_buff[count].alloc_data.align = 8192;
1240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  rc = ioctl(recon_buff[count].ion_device_fd,ION_IOC_ALLOC,&recon_buff[count].alloc_data);
1242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(rc || !recon_buff[count].alloc_data.handle) {
1243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_ERROR("\n ION ALLOC memory failed ");
1244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         recon_buff[count].alloc_data.handle=NULL;
1245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         return -1;
1246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  recon_buff[count].ion_alloc_fd.handle = recon_buff[count].alloc_data.handle;
1249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  rc = ioctl(recon_buff[count].ion_device_fd,ION_IOC_MAP,&recon_buff[count].ion_alloc_fd);
1250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(rc) {
1251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("\n ION MAP failed ");
1252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        recon_buff[count].ion_alloc_fd.fd =-1;
1253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        recon_buff[count].ion_alloc_fd.fd =-1;
1254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return -1;
1255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pmem_fd = recon_buff[count].ion_alloc_fd.fd;
1257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
1258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pmem_fd = open(MEM_DEVICE, O_RDWR);
1259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if ((int)(pmem_fd) < 0)
1261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	DEBUG_PRINT_ERROR("\n Failed to get an pmem handle");
1263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	return -1;
1264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  allocation.size = size;
1267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  allocation.align = clip2(alignment);
1268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (allocation.align != 8192)
1270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    allocation.align = 8192;
1271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (ioctl(pmem_fd, PMEM_ALLOCATE_ALIGNED, &allocation) < 0)
1273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\n Aligment(%u) failed with pmem driver Sz(%lu)",
1275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      allocation.align, allocation.size);
1276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return -1;
1277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  buf_addr = mmap(NULL, size,
1280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               PROT_READ | PROT_WRITE,
1281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev               MAP_SHARED, pmem_fd, 0);
1282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (buf_addr == (void*) MAP_FAILED)
1284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    close(pmem_fd);
1286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pmem_fd = -1;
1287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Error returned in allocating recon buffers buf_addr: %p\n",buf_addr);
1288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
1289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(ioctl(recon_buff[count].ion_device_fd,ION_IOC_FREE,
1290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       &recon_buff[count].alloc_data.handle)) {
1291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("ion recon buffer free failed");
1292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    recon_buff[count].alloc_data.handle = NULL;
1294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    recon_buff[count].ion_alloc_fd.fd =-1;
1295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    close(recon_buff[count].ion_device_fd);
1296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    recon_buff[count].ion_device_fd =-1;
1297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return -1;
1299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("\n Allocated virt:%p, FD: %d of size %d \n", buf_addr, pmem_fd, size);
1302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  recon_addr.buffer_size = size;
1304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  recon_addr.pmem_fd = pmem_fd;
1305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  recon_addr.offset = 0;
1306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  recon_addr.pbuffer = (unsigned char *)buf_addr;
1307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_RECON_BUFFER, (void*)&ioctl_msg) < */0)
1310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("Failed to set the Recon_buffers\n");
1312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return -1;
1313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  recon_buff[count].virtual_address = (unsigned char *) buf_addr;
1316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  recon_buff[count].size = size;
1317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  recon_buff[count].offset = 0;
1318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  recon_buff[count].pmem_fd = pmem_fd;
1319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_ERROR("\n Allocated virt:%p, FD: %d of size %d at index: %d\n", recon_buff[count].virtual_address,
1321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                     recon_buff[count].pmem_fd, recon_buff[count].size, count);
1322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return 0;
1323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_U32 venc_dev::pmem_free()
1326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int cnt = 0;
1328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct venc_recon_addr recon_addr;
1329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for (cnt = 0; cnt < recon_buffers_count; cnt++)
1330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(recon_buff[cnt].pmem_fd)
1332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      recon_addr.pbuffer = recon_buff[cnt].virtual_address;
1334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      recon_addr.offset = recon_buff[cnt].offset;
1335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      recon_addr.pmem_fd = recon_buff[cnt].pmem_fd;
1336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      recon_addr.buffer_size = recon_buff[cnt].size;
1337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(/*ioctl(m_nDriver_fd, VEN_IOCTL_FREE_RECON_BUFFER ,&ioctl_msg) < */0)
1338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("VEN_IOCTL_FREE_RECON_BUFFER failed");
1339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      munmap(recon_buff[cnt].virtual_address, recon_buff[cnt].size);
1340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      close(recon_buff[cnt].pmem_fd);
1341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
1342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(ioctl(recon_buff[cnt].ion_device_fd,ION_IOC_FREE,
1343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         &recon_buff[cnt].alloc_data.handle)) {
1344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_ERROR("ion recon buffer free failed");
1345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      recon_buff[cnt].alloc_data.handle = NULL;
1347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      recon_buff[cnt].ion_alloc_fd.fd =-1;
1348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      close(recon_buff[cnt].ion_device_fd);
1349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      recon_buff[cnt].ion_device_fd =-1;
1350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\n cleaning Index %d of size %d \n",cnt,recon_buff[cnt].size);
1352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      recon_buff[cnt].pmem_fd = -1;
1353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      recon_buff[cnt].virtual_address = NULL;
1354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      recon_buff[cnt].offset = 0;
1355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      recon_buff[cnt].alignment = 0;
1356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      recon_buff[cnt].size = 0;
1357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return 0;
1360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid venc_dev::venc_config_print()
1362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("\nENC_CONFIG: Codec: %d, Profile %d, level : %d",
1365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   m_sVenc_cfg.codectype, codec_profile.profile, profile_level.level);
1366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("\n ENC_CONFIG: Width: %d, Height:%d, Fps: %d",
1368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   m_sVenc_cfg.input_width, m_sVenc_cfg.input_height,
1369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   m_sVenc_cfg.fps_num/m_sVenc_cfg.fps_den);
1370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("\nENC_CONFIG: Bitrate: %d, RC: %d, I-Period: %d",
1372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   bitrate.target_bitrate, rate_ctrl.rcmode, intra_period.num_pframes);
1373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("\nENC_CONFIG: qpI: %d, qpP: %d, qpb: %d",
1375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   session_qp.iframeqp, session_qp.pframqp,session_qp.bframqp);
1376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("\nENC_CONFIG: VOP_Resolution: %d, Slice-Mode: %d, Slize_Size: %d",
1378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   voptimecfg.voptime_resolution, multislice.mslice_mode,
1379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   multislice.mslice_size);
1380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("\nENC_CONFIG: EntropyMode: %d, CabacModel: %d",
1382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   entropy.longentropysel, entropy.cabacmodel);
1383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("\nENC_CONFIG: DB-Mode: %d, alpha: %d, Beta: %d\n",
1385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   dbkfilter.db_mode, dbkfilter.slicealpha_offset,
1386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   dbkfilter.slicebeta_offset);
1387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("\nENC_CONFIG: IntraMB/Frame: %d, HEC: %d\n",
1389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   intra_refresh.mbcount, hec.header_extension);
1390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned venc_dev::venc_flush( unsigned port)
1393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct venc_bufferflush buffer_index;
1395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(port == PORT_INDEX_IN)
1397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	 int rc=0;
1399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	 enum v4l2_buf_type btype;
1400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	 btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	 rc = ioctl(m_nDriver_fd, VIDIOC_STREAMOFF, &btype);
1402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	 if (rc) {
1403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		/* STREAMOFF should never fail */
1404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("\n Failed to call streamoff on OUTPUT Port \n");
1405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return -1;
1406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
1407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return 0;
1409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(port == PORT_INDEX_OUT)
1411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	 int rc=0;
1413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	 enum v4l2_buf_type btype;
1414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	 btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	 rc = ioctl(m_nDriver_fd, VIDIOC_STREAMOFF, &btype);
1416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	 if (rc) {
1417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		/* STREAMOFF should never fail  */
1418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("\n Failed to call streamoff on OUTPUT Port \n");
1419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return -1;
1420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		}
1421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return 0;
1423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
1426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return -1;
1428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//allocating I/P memory from pmem and register with the device
1432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_use_buf(void *buf_addr, unsigned port,unsigned index)
1435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct pmem *pmem_tmp;
1438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct v4l2_buffer buf;
1440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct v4l2_plane plane;
1441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int rc=0;
1442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pmem_tmp = (struct pmem *)buf_addr;
1444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n venc_use_buf:: pmem_tmp = %p", pmem_tmp);
1446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(port == PORT_INDEX_IN)
1448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf.index = index;
1451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf.memory = V4L2_MEMORY_USERPTR;
1453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     plane.length = pmem_tmp->size;
1454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     plane.m.userptr = (unsigned long)pmem_tmp->buffer;
1455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     plane.reserved[0] = pmem_tmp->fd;
1456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     plane.reserved[1] = 0;
1457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     plane.data_offset = pmem_tmp->offset;
1458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf.m.planes = &plane;
1459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf.length = 1;
1460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	 rc = ioctl(m_nDriver_fd, VIDIOC_PREPARE_BUF, &buf);
1463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
1465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("VIDIOC_PREPARE_BUF Failed at line 1387 \n");
1466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_INPUT_BUFFER,&ioctl_msg) < */0)
1469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR: venc_use_buf:set input buffer failed ");
1471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return false;
1472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(port == PORT_INDEX_OUT)
1475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf.index = index;
1478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf.memory = V4L2_MEMORY_USERPTR;
1480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     plane.length = pmem_tmp->size;
1481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     plane.m.userptr = (unsigned long)pmem_tmp->buffer;
1482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     plane.reserved[0] = pmem_tmp->fd;
1483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     plane.reserved[1] = 0;
1484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     plane.data_offset = pmem_tmp->offset;
1485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf.m.planes = &plane;
1486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf.length = 1;
1487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_PREPARE_BUF, &buf);
1489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
1491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("VIDIOC_PREPARE_BUF Failed at line 1414 \n");
1492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_OUTPUT_BUFFER,&ioctl_msg) < */0)
1495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR: venc_use_buf:set output buffer failed ");
1497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return false;
1498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
1501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR: venc_use_buf:Invalid Port Index ");
1503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
1504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
1507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_free_buf(void *buf_addr, unsigned port)
1510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct pmem *pmem_tmp;
1512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct venc_bufferpayload dev_buffer = {0};
1513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pmem_tmp = (struct pmem *)buf_addr;
1515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n venc_use_buf:: pmem_tmp = %p", pmem_tmp);
1517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(port == PORT_INDEX_IN)
1519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
1521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    dev_buffer.fd  = pmem_tmp->fd;
1522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    dev_buffer.maped_size = pmem_tmp->size;
1523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    dev_buffer.sz = pmem_tmp->size;
1524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    dev_buffer.offset = pmem_tmp->offset;
1525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n venc_free_buf:pbuffer = %x,fd = %x, offset = %d, maped_size = %d", \
1526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                dev_buffer.pbuffer, \
1527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                dev_buffer.fd, \
1528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                dev_buffer.offset, \
1529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                dev_buffer.maped_size);
1530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(/*ioctl (m_nDriver_fd,VEN_IOCTL_CMD_FREE_INPUT_BUFFER,&ioctl_msg) < */0)
1532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR: venc_free_buf: free input buffer failed ");
1534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return false;
1535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(port == PORT_INDEX_OUT)
1538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
1540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    dev_buffer.fd  = pmem_tmp->fd;
1541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    dev_buffer.sz = pmem_tmp->size;
1542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    dev_buffer.maped_size = pmem_tmp->size;
1543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    dev_buffer.offset = pmem_tmp->offset;
1544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n venc_free_buf:pbuffer = %x,fd = %x, offset = %d, maped_size = %d", \
1546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                dev_buffer.pbuffer, \
1547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                dev_buffer.fd, \
1548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                dev_buffer.offset, \
1549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                dev_buffer.maped_size);
1550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(/*ioctl (m_nDriver_fd,VEN_IOCTL_CMD_FREE_OUTPUT_BUFFER,&ioctl_msg) < */0)
1552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR: venc_free_buf: free output buffer failed ");
1554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return false;
1555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
1558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR: venc_free_buf:Invalid Port Index ");
1560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
1561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
1564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_empty_buf(void *buffer, void *pmem_data_buf,unsigned index,unsigned fd)
1567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct pmem *temp_buffer;
1569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct v4l2_buffer buf;
1571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev struct v4l2_plane plane;
1572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int rc=0;
1573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct OMX_BUFFERHEADERTYPE *bufhdr;
1574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  temp_buffer = (struct pmem *)buffer;
1576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(buffer == NULL)
1579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR: venc_etb: buffer is NULL");
1581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
1582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bufhdr = (OMX_BUFFERHEADERTYPE *)buffer;
1584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDEBUG_PRINT_LOW("\n Input buffer length %d",bufhdr->nFilledLen);
1586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(pmem_data_buf)
1588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Internal PMEM addr for i/p Heap UseBuf: %p", pmem_data_buf);
1590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    plane.m.userptr = (unsigned long)pmem_data_buf;
1591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
1593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Shared PMEM addr for i/p PMEM UseBuf/AllocateBuf: %p", bufhdr->pBuffer);
1595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    plane.m.userptr = (unsigned long)bufhdr->pBuffer;
1596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf.index = index;
1599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf.memory = V4L2_MEMORY_USERPTR;
1601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     plane.length = bufhdr->nAllocLen;
1602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     plane.bytesused = bufhdr->nFilledLen;
1603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     plane.reserved[0] = fd;
1604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     plane.reserved[1] = 0;
1605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     plane.data_offset = bufhdr->nOffset;
1606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf.m.planes = &plane;
1607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf.length = 1;
1608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  rc = ioctl(m_nDriver_fd, VIDIOC_QBUF, &buf);
1611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
1612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("Failed to qbuf to driver");
1613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
1614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	etb_count++;
1617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if(etb_count == 1)
1619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	{
1620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	enum v4l2_buf_type buf_type;
1621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		int ret;
1623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	ret = ioctl(m_nDriver_fd, VIDIOC_STREAMON, &buf_type);
1624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (ret) {
1625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("Failed to call streamon\n");
1626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(/*ioctl(m_nDriver_fd,VEN_IOCTL_CMD_ENCODE_FRAME,&ioctl_msg) < */0)
1631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*Generate an async error and move to invalid state*/
1633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
1634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
1636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int y_size = 0;
1638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int c_offset = 0;
1639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  y_size = m_sVenc_cfg.input_width * m_sVenc_cfg.input_height;
1641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //chroma offset is y_size aligned to the 2k boundary
1642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  c_offset= (y_size + 2047) & (~(2047));
1643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(inputBufferFile1)
1645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fwrite((const char *)frameinfo.ptrbuffer, y_size, 1,inputBufferFile1);
1647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    fwrite((const char *)(frameinfo.ptrbuffer + c_offset), (y_size>>1), 1,inputBufferFile1);
1648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
1652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_fill_buf(void *buffer, void *pmem_data_buf,unsigned index,unsigned fd)
1654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct pmem *temp_buffer = NULL;
1657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct venc_buffer  frameinfo;
1658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct v4l2_buffer buf;
1659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct v4l2_plane plane;
1660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int rc=0;
1661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct OMX_BUFFERHEADERTYPE *bufhdr;
1662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(buffer == NULL)
1664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
1666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bufhdr = (OMX_BUFFERHEADERTYPE *)buffer;
1668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevif(pmem_data_buf)
1670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Internal PMEM addr for o/p Heap UseBuf: %p", pmem_data_buf);
1672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    plane.m.userptr = (unsigned long)pmem_data_buf;
1673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
1675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Shared PMEM addr for o/p PMEM UseBuf/AllocateBuf: %p", bufhdr->pBuffer);
1677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    plane.m.userptr = (unsigned long)bufhdr->pBuffer;
1678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf.index = index;
1681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf.memory = V4L2_MEMORY_USERPTR;
1683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     plane.length = bufhdr->nAllocLen;
1684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     plane.bytesused = bufhdr->nFilledLen;
1685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     plane.reserved[0] = fd;
1686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     plane.reserved[1] = 0;
1687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     plane.data_offset = bufhdr->nOffset;
1688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf.m.planes = &plane;
1689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     buf.length = 1;
1690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_QBUF, &buf);
1692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
1693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("Failed to qbuf to driver");
1694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
1695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(/*ioctl (m_nDriver_fd,VEN_IOCTL_CMD_FILL_OUTPUT_BUFFER,&ioctl_msg) < */0)
1699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR: ioctl VEN_IOCTL_CMD_FILL_OUTPUT_BUFFER failed");
1701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
1702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
1705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_session_qp(OMX_U32 i_frame_qp, OMX_U32 p_frame_qp,OMX_U32 b_frame_qp)
1708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int rc;
1710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_control control;
1711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.id = V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP;
1713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.value = i_frame_qp;
1714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
1716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
1717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
1718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("Failed to set control\n");
1719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
1720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
1722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	session_qp.iframeqp = control.value;
1723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.id = V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP;
1725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.value = p_frame_qp;
1726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
1728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
1729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
1730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("Failed to set control\n");
1731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
1732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
1734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	session_qp.pframqp = control.value;
1736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if((codec_profile.profile == V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) ||
1738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     (codec_profile.profile == V4L2_MPEG_VIDEO_H264_PROFILE_HIGH))
1739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	{
1740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.id = V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP;
1742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.value = b_frame_qp;
1743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
1745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
1746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
1747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("Failed to set control\n");
1748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
1749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
1751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	session_qp.bframqp = control.value;
1753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_SESSION_QP,(void*)&ioctl_msg)< */0)
1756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR: Request for setting session qp failed");
1758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
1759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
1761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_profile_level(OMX_U32 eProfile,OMX_U32 eLevel)
1764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
1765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct venc_profile requested_profile;
1766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct ven_profilelevel requested_level;
1767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned const int *profile_tbl = NULL;
1768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned long mb_per_frame = 0, mb_per_sec = 0;
1769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("venc_set_profile_level:: eProfile = %d, Level = %d",
1770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eProfile, eLevel);
1771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  mb_per_frame = ((m_sVenc_cfg.input_height + 15) >> 4)*
1772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  ((m_sVenc_cfg.input_width + 15) >> 4);
1773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if((eProfile == 0) && (eLevel == 0) && m_profile_set && m_level_set)
1774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Profile/Level setting complete before venc_start");
1776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return true;
1777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Validating Profile/Level from table");
1780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!venc_validate_profile_level(&eProfile, &eLevel))
1781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\nERROR: Profile/Level validation failed");
1783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
1784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4)
1787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("eProfile = %d, OMX_VIDEO_MPEG4ProfileSimple = %d and "
1789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "OMX_VIDEO_MPEG4ProfileAdvancedSimple = %d", eProfile,
1790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4ProfileAdvancedSimple);
1791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(eProfile == OMX_VIDEO_MPEG4ProfileSimple)
1792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_profile.profile = V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE;
1794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      profile_tbl = (unsigned int const *)
1795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (&mpeg4_profile_level_table[MPEG4_SP_START]);
1796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      profile_tbl += MPEG4_720P_LEVEL*5;
1797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple)
1799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_profile.profile = V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE;
1801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      profile_tbl = (unsigned int const *)
1802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (&mpeg4_profile_level_table[MPEG4_ASP_START]);
1803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      profile_tbl += MPEG4_720P_LEVEL*5;
1804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
1806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\nERROR: Unsupported MPEG4 profile = %u",
1808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eProfile);
1809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return false;
1810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("eLevel = %d, OMX_VIDEO_MPEG4Level0 = %d, OMX_VIDEO_MPEG4Level1 = %d,"
1813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "OMX_VIDEO_MPEG4Level2 = %d, OMX_VIDEO_MPEG4Level3 = %d, OMX_VIDEO_MPEG4Level4 = %d,"
1814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "OMX_VIDEO_MPEG4Level5 = %d", eLevel, OMX_VIDEO_MPEG4Level0, OMX_VIDEO_MPEG4Level1,
1815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      OMX_VIDEO_MPEG4Level2, OMX_VIDEO_MPEG4Level3, OMX_VIDEO_MPEG4Level4, OMX_VIDEO_MPEG4Level5);
1816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(mb_per_frame >= 3600)
1818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(requested_profile.profile == V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE)
1820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
1821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(requested_profile.profile == V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE)
1822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
1823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
1825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      switch(eLevel)
1827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
1828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_VIDEO_MPEG4Level0:
1829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_0;
1830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
1831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		case OMX_VIDEO_MPEG4Level0b:
1832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_0B;
1833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
1834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_VIDEO_MPEG4Level1:
1835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_1;
1836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
1837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_VIDEO_MPEG4Level2:
1838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_2;
1839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
1840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_VIDEO_MPEG4Level3:
1841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_3;
1842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
1843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_VIDEO_MPEG4Level4a:
1844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_4;
1845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
1846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      case OMX_VIDEO_MPEG4Level5:
1847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        mb_per_sec = mb_per_frame * (m_sVenc_cfg.fps_num / m_sVenc_cfg.fps_den);
1848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		if((requested_profile.profile == V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE) && (mb_per_frame >= profile_tbl[0]) &&
1849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           (mb_per_sec >= profile_tbl[1]))
1850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("\nMPEG4 Level 6 is set for 720p resolution");
1852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
1853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
1855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
1856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT_LOW("\nMPEG4 Level 5 is set for non-720p resolution");
1857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
1858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
1859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
1860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      default:
1861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return false;
1862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // TODO update corresponding levels for MPEG4_LEVEL_3b,MPEG4_LEVEL_6
1863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
1864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
1865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263)
1868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(eProfile == OMX_VIDEO_H263ProfileBaseline)
1870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_profile.profile = VEN_PROFILE_H263_BASELINE;
1872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
1874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\nERROR: Unsupported H.263 profile = %u",
1876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        requested_profile.profile);
1877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return false;
1878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //profile level
1880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    switch(eLevel)
1881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_H263Level10:
1883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = VEN_LEVEL_H263_10;
1884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_H263Level20:
1886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = VEN_LEVEL_H263_20;
1887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_H263Level30:
1889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = VEN_LEVEL_H263_30;
1890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_H263Level40:
1892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = VEN_LEVEL_H263_40;
1893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_H263Level45:
1895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = VEN_LEVEL_H263_45;
1896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_H263Level50:
1898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = VEN_LEVEL_H263_50;
1899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_H263Level60:
1901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = VEN_LEVEL_H263_60;
1902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_H263Level70:
1904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = VEN_LEVEL_H263_70;
1905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    default:
1907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return false;
1908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
1911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264)
1912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
1913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(eProfile == OMX_VIDEO_AVCProfileBaseline)
1914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE;
1916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(eProfile == OMX_VIDEO_AVCProfileMain)
1918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_MAIN;
1920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else if(eProfile == OMX_VIDEO_AVCProfileExtended)
1922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED;
1924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if(eProfile == OMX_VIDEO_AVCProfileHigh)
1926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH;
1928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else if(eProfile == OMX_VIDEO_AVCProfileHigh10)
1930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10;
1932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else if(eProfile == OMX_VIDEO_AVCProfileHigh422)
1934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422;
1936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	else if(eProfile == OMX_VIDEO_AVCProfileHigh444)
1938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE;
1940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
1942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_LOW("\nERROR: Unsupported H.264 profile = %u",
1944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        requested_profile.profile);
1945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return false;
1946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
1947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //profile level
1948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    switch(eLevel)
1949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
1950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_AVCLevel1:
1951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_0;
1952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_AVCLevel1b:
1954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1B;
1955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_AVCLevel11:
1957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_1;
1958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_AVCLevel12:
1960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_2;
1961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_AVCLevel13:
1963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_3;
1964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_AVCLevel2:
1966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_2_0;
1967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_AVCLevel21:
1969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_2_1;
1970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_AVCLevel22:
1972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_2_2;
1973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_AVCLevel3:
1975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_3_0;
1976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_AVCLevel31:
1978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_3_1;
1979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_AVCLevel32:
1981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_3_2;
1982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_AVCLevel4:
1984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_4_0;
1985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_AVCLevel41:
1987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_4_1;
1988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_AVCLevel42:
1990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_4_2;
1991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_AVCLevel5:
1993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_5_0;
1994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case OMX_VIDEO_AVCLevel51:
1996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_5_1;
1997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
1998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    default :
1999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR: Unsupported H.264 level= %u",
2000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        requested_level.level);
2001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return false;
2002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!m_profile_set)
2006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int rc;
2008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_control control;
2009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.id = V4L2_CID_MPEG_VIDEO_H264_PROFILE;
2011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.value = requested_profile.profile;
2012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2013826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
2014826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2015826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
2016826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("Failed to set control\n");
2017826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
2018826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2019826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
2020826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2021826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2022826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_CODEC_PROFILE,(void*)&ioctl_msg)< */0)
2023826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2024826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR: Request for setting profile failed");
2025826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return false;
2026826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2027826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    codec_profile.profile = control.value;
2028826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_profile_set = true;
2029826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2030826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2031826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!m_level_set)
2032826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2033826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int rc;
2034826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_control control;
2035826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.id = V4L2_CID_MPEG_VIDEO_H264_LEVEL;
2036826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.value = requested_level.level;
2037826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
2038826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2039826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
2040826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("Failed to set control\n");
2041826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
2042826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2043826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
2044826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2045826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_PROFILE_LEVEL,(void*)&ioctl_msg)< */0)
2046826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2047826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR: Request for setting profile level failed");
2048826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return false;
2049826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2050826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    profile_level.level = control.value;
2051826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_level_set = true;
2052826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2053826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2054826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
2055826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2056826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2057826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_voptiming_cfg( OMX_U32 TimeIncRes)
2058826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2059826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2060826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct venc_voptimingcfg vop_timing_cfg;
2061826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2062826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n venc_set_voptiming_cfg: TimeRes = %u",
2063826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    TimeIncRes);
2064826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2065826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  vop_timing_cfg.voptime_resolution = TimeIncRes;
2066826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2067826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_VOP_TIMING_CFG,(void*)&ioctl_msg)< */0)
2068826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2069826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR: Request for setting Vop Timing failed");
2070826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
2071826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2072826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2073826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  voptimecfg.voptime_resolution = vop_timing_cfg.voptime_resolution;
2074826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
2075826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2076826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2077826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_intra_period(OMX_U32 nPFrames, OMX_U32 nBFrames)
2078826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2079826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2080826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n venc_set_intra_period: nPFrames = %u",
2081826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nPFrames);
2082826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int rc;
2083826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_control control;
2084826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if((codec_profile.profile != V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE) &&
2085826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     (codec_profile.profile != V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) &&
2086826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     (codec_profile.profile != V4L2_MPEG_VIDEO_H264_PROFILE_HIGH))
2087826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2088826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  nBFrames=0;
2089826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2090826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2091826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_P_FRAMES;
2092826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.value = nPFrames;
2093826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2094826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2095826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
2096826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("Failed to set control\n");
2097826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
2098826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2099826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
2100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        intra_period.num_pframes = control.value;
2102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_B_FRAMES;
2103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.value = nBFrames;
2104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
2105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
2107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("Failed to set control\n");
2108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
2109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
2111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_INTRA_PERIOD,(void*)&ioctl_msg)< */0)
2114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
2116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
2117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  intra_period.num_bframes = control.value;
2119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
2120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_entropy_config(OMX_BOOL enable, OMX_U32 i_cabac_level)
2123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //struct venc_entropycfg entropy_cfg;
2125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev // memset(&entropy_cfg,0,sizeof(entropy_cfg));
2127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int rc;
2128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_control control;
2129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n venc_set_entropy_config: CABAC = %u level: %u", enable, i_cabac_level);
2131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(enable &&(codec_profile.profile != V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE)){
2133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control.value = V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC;
2135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control.id = V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE;
2136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
2138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
2140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("Failed to set control\n");
2141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
2142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
2144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	entropy.longentropysel = control.value;
2145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  if (i_cabac_level == 0) {
2146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         control.value = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_0;
2147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (i_cabac_level == 1) {
2149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         control.value = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_1;
2150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if (i_cabac_level == 2) {
2152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         control.value = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_2;
2153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control.id = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL;
2156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  //control.value = entropy_cfg.cabacmodel;
2157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
2158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
2160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("Failed to set control\n");
2161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
2162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
2164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	entropy.longentropysel=control.value;
2165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(!enable){
2167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    control.value =  V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC;
2168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.id = V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE;
2169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
2170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
2172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("Failed to set control\n");
2173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
2174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
2176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	entropy.longentropysel=control.value;
2177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	//entropy_cfg.longentropysel = control.value;
2178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else{
2180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nInvalid Entropy mode for Baseline Profile");
2181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
2182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_ENTROPY_CFG,(void*)&ioctl_msg)< */0)
2185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR: Request for setting entropy config failed");
2187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
2188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //entropy.longentropysel = entropy_cfg.longentropysel;
2190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //entropy.cabacmodel  = entropy_cfg.cabacmodel;
2191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
2192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_multislice_cfg(OMX_INDEXTYPE Codec, OMX_U32 nSlicesize) // MB
2195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int rc;
2197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_control control;
2198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool status = true;
2199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //struct venc_multiclicecfg multislice_cfg;
2200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if((Codec != OMX_IndexParamVideoH263)  && (nSlicesize)){
2202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   // multislice_cfg.mslice_mode = VEN_MSLICE_CNT_MB;
2203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //multislice_cfg.mslice_size = nSlicesize;
2204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control.value =  V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_MB;
2205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else{
2207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   control.value =  V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE;
2208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   //multislice_cfg.mslice_mode = VEN_MSLICE_OFF;
2209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //multislice_cfg.mslice_size = 0;
2210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE;
2212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
2213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
2215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("Failed to set control\n");
2216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
2217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
2219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	multislice.mslice_mode=control.value;
2220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if(multislice.mslice_mode!=V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE){
2222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB;
2224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.value = nSlicesize;
2225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
2226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
2228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("Failed to set control\n");
2229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
2230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
2232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	multislice.mslice_size=control.value;
2233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(/*ioctl (m_nDriver_fd, VEN_IOCTL_SET_MULTI_SLICE_CFG,(void*)&ioctl_msg) < */0)
2238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR: Request for setting multi-slice cfg failed");
2240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    status = false;
2241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
2243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //multislice.mslice_mode = multislice_cfg.mslice_mode;
2245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //multislice.mslice_size = nSlicesize;
2246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return status;
2248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_intra_refresh(OMX_VIDEO_INTRAREFRESHTYPE ir_mode, OMX_U32 irMBs)
2251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool status = true;
2253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int rc;
2254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  struct v4l2_control control_mode,control_mbs;
2255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   control_mode.id = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_MODE;
2256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  // There is no disabled mode.  Disabled mode is indicated by a 0 count.
2257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (irMBs == 0 || ir_mode == OMX_VIDEO_IntraRefreshMax)
2258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_NONE;
2260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if ((ir_mode == OMX_VIDEO_IntraRefreshCyclic) &&
2262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           (irMBs < ((m_sVenc_cfg.input_width * m_sVenc_cfg.input_height)>>8)))
2263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_CYCLIC;
2265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control_mbs.id=V4L2_CID_MPEG_VIDC_VIDEO_CIR_MBS;
2266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control_mbs.value=irMBs;
2267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if ((ir_mode == OMX_VIDEO_IntraRefreshAdaptive) &&
2269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           (irMBs < ((m_sVenc_cfg.input_width * m_sVenc_cfg.input_height)>>8)))
2270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_ADAPTIVE;
2272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control_mbs.id=V4L2_CID_MPEG_VIDC_VIDEO_AIR_MBS;
2273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control_mbs.value=irMBs;
2274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if ((ir_mode == OMX_VIDEO_IntraRefreshBoth) &&
2276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           (irMBs < ((m_sVenc_cfg.input_width * m_sVenc_cfg.input_height)>>8)))
2277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_CYCLIC_ADAPTIVE;
2279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
2281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR: Invalid IntraRefresh Parameters:"
2283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      "mb count: %d, mb mode:%d", irMBs, ir_mode);
2284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
2285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Calling IOCTL set control for id=%d, val=%d\n", control_mode.id, control_mode.value);
2288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control_mode);
2289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
2290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("Failed to set control\n");
2291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
2292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Success IOCTL set control for id=%d, value=%d\n", control_mode.id, control_mode.value);
2294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Calling IOCTL set control for id=%d, val=%d\n", control_mbs.id, control_mbs.value);
2296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control_mbs);
2297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
2298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("Failed to set control\n");
2299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
2300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Success IOCTL set control for id=%d, value=%d\n", control_mbs.id, control_mbs.value);
2302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_INTRA_REFRESH,(void*)&ioctl_msg) < */0)
2304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR: Request for setting Intra Refresh failed");
2306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    status = false;
2307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
2309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    intra_refresh.irmode = control_mode.value;
2311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    intra_refresh.mbcount = control_mbs.value;
2312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return status;
2314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_error_resilience(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* error_resilience)
2317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   bool status = true;
2319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   struct venc_headerextension hec_cfg;
2320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   struct venc_multiclicecfg multislice_cfg;
2321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) {
2323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (error_resilience->bEnableHEC) {
2324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         hec_cfg.header_extension = 1;
2325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else {
2327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         hec_cfg.header_extension = 0;
2328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_HEC,(void*)&ioctl_msg) < */0) {
2331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         DEBUG_PRINT_ERROR("\nERROR: Request for setting HEader Error correction failed");
2332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         return false;
2333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      hec.header_extension = error_resilience->bEnableHEC;
2335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
2336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if (error_resilience->bEnableRVLC) {
2338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR("\n RVLC is not Supported");
2339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return false;
2340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
2341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if (( m_sVenc_cfg.codectype != OMX_VIDEO_CodingH263) &&
2343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       (error_resilience->bEnableDataPartitioning)) {
2344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     DEBUG_PRINT_ERROR("\n DataPartioning are not Supported for MPEG4/H264");
2345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return false;
2346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
2347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if (( m_sVenc_cfg.codectype != OMX_VIDEO_CodingH263) &&
2349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            (error_resilience->nResynchMarkerSpacing)) {
2350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     multislice_cfg.mslice_mode = VEN_MSLICE_CNT_BYTE;
2351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       multislice_cfg.mslice_size = error_resilience->nResynchMarkerSpacing;
2352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     }
2353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   else if (m_sVenc_cfg.codectype == OMX_VIDEO_CodingH263 &&
2354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            error_resilience->bEnableDataPartitioning) {
2355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      multislice_cfg.mslice_mode = VEN_MSLICE_GOB;
2356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      multislice_cfg.mslice_size = 0;
2357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else {
2359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        multislice_cfg.mslice_mode = VEN_MSLICE_OFF;
2360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        multislice_cfg.mslice_size = 0;
2361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   DEBUG_PRINT_LOW("\n %s(): mode = %u, size = %u", __func__, multislice_cfg.mslice_mode,
2363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   multislice_cfg.mslice_size);
2364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   if (/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_MULTI_SLICE_CFG,(void*)&ioctl_msg) < */0) {
2365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR: Request for setting multi-slice cfg failed");
2366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      status = false;
2367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
2368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   else
2369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   {
2370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     multislice.mslice_mode = multislice_cfg.mslice_mode ;
2371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     multislice.mslice_size = multislice_cfg.mslice_size;
2372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   }
2374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   return status;
2375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_inloop_filter(OMX_VIDEO_AVCLOOPFILTERTYPE loopfilter)
2378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int rc;
2380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_control control;
2381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.id=V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE;
2382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (loopfilter == OMX_VIDEO_AVCLoopFilterEnable){
2383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control.value=V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_ENABLED;
2384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(loopfilter == OMX_VIDEO_AVCLoopFilterDisable){
2386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control.value=V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED;
2387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(loopfilter == OMX_VIDEO_AVCLoopFilterDisableSliceBoundary){
2389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control.value=V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED_AT_SLICE_BOUNDARY;
2390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
2393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
2395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
2396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
2398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	dbkfilter.db_mode=control.value;
2400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.id=V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA;
2402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.value=0;
2403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
2405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
2407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
2408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
2410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.id=V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA;
2411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.value=0;
2412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
2413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
2415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
2416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
2418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_DEBLOCKING_CFG,(void*)&ioctl_msg)< */0)
2421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR: Request for setting inloop filter failed");
2423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
2424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  dbkfilter.slicealpha_offset = dbkfilter.slicebeta_offset = 0;
2427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
2428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_target_bitrate(OMX_U32 nTargetBitrate, OMX_U32 config)
2431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n venc_set_target_bitrate: bitrate = %u",
2433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    nTargetBitrate);
2434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_control control;
2435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int rc;
2436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.id = V4L2_CID_MPEG_VIDEO_BITRATE;
2437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.value = nTargetBitrate/1000;
2438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
2440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
2442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("Failed to set control\n");
2443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
2444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
2446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_TARGET_BITRATE,(void*)&ioctl_msg) < */0)
2449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR: Request for setting bit rate failed");
2451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
2452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_sVenc_cfg.targetbitrate = control.value*1000;
2454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bitrate.target_bitrate = control.value*1000;
2455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!config)
2456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_level_set = false;
2458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(venc_set_profile_level(0, 0))
2459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("Calling set level (Bitrate) with %d\n",profile_level.level);
2461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
2464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_encode_framerate(OMX_U32 encode_framerate, OMX_U32 config)
2467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_control control;
2470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int rc;
2471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.id = V4L2_CID_MPEG_VIDC_VIDEO_FRAME_RATE;
2472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.value = encode_framerate;
2473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
2474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
2476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("Failed to set control\n");
2477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
2478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
2480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(//ioctl(m_nDriver_fd, VEN_IOCTL_SET_FRAME_RATE,
2481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      /*(void*)&ioctl_msg) < */0)
2482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR: Request for setting framerate failed");
2484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
2485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_sVenc_cfg.fps_den = 1;
2488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_sVenc_cfg.fps_num = control.value;
2489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(!config)
2490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_level_set = false;
2492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(venc_set_profile_level(0, 0))
2493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_HIGH("Calling set level (Framerate) with %d\n",profile_level.level);
2495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
2498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_color_format(OMX_COLOR_FORMATTYPE color_format)
2501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n venc_set_color_format: color_format = %u ", color_format);
2503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(color_format == OMX_COLOR_FormatYUV420SemiPlanar)
2505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  m_sVenc_cfg.inputformat= VEN_INPUTFMT_NV12_16M2KA;
2507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
2509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nWARNING: Unsupported Color format [%d]", color_format);
2511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    m_sVenc_cfg.inputformat= VEN_INPUTFMT_NV12_16M2KA;
2512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_HIGH("\n Default color format YUV420SemiPlanar is set");
2513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (/*ioctl(m_nDriver_fd, VEN_IOCTL_SET_BASE_CFG, (void*)&ioctl_msg) < */0)
2515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR: Request for setting color format failed");
2517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
2518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
2520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_intra_vop_refresh(OMX_BOOL intra_vop_refresh)
2523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n venc_set_intra_vop_refresh: intra_vop = %uc", intra_vop_refresh);
2525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(intra_vop_refresh == OMX_TRUE)
2526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(/*ioctl(m_nDriver_fd, VEN_IOCTL_CMD_REQUEST_IFRAME, NULL) < */0)
2528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR: Request for setting Intra VOP Refresh failed");
2530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return false;
2531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
2534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("\nERROR: VOP Refresh is False, no effect");
2536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
2538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_ratectrl_cfg(OMX_VIDEO_CONTROLRATETYPE eControlRate)
2541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool status = true;
2543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	struct v4l2_control control;
2544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	int rc;
2545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	control.id = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL;
2546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  switch(eControlRate)
2547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_Video_ControlRateDisable:
2549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_OFF;
2550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
2551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_Video_ControlRateVariableSkipFrames:
2552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_VBR_VFR;
2553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
2554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_Video_ControlRateVariable:
2555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_VBR_CFR;
2556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
2557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_Video_ControlRateConstantSkipFrames:
2558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	    control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_CBR_VFR;
2559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
2560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  case OMX_Video_ControlRateConstant:
2561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	    control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_CBR_CFR;
2562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
2563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  default:
2564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    status = false;
2565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    break;
2566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(status)
2569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  printf("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
2572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (rc) {
2574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		printf("Failed to set control\n");
2575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		return false;
2576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
2577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	printf("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
2578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_RATE_CTRL_CFG,(void*)&ioctl_msg) < */0)
2581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT_ERROR("\nERROR: Request for setting rate control failed");
2583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      status = false;
2584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
2586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      rate_ctrl.rcmode = control.value;
2587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return status;
2589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_get_profile_level(OMX_U32 *eProfile,OMX_U32 *eLevel)
2592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool status = true;
2594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(eProfile == NULL || eLevel == NULL)
2595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
2597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4)
2600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    switch(codec_profile.profile)
2602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE:
2604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
2605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE:
2607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
2608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    default:
2610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eProfile = OMX_VIDEO_MPEG4ProfileMax;
2611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      status = false;
2612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(!status)
2616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return status;
2618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //profile level
2621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    switch(profile_level.level)
2622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_MPEG4_LEVEL_0:
2624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_MPEG4Level0;
2625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  case V4L2_MPEG_VIDEO_MPEG4_LEVEL_0B:
2627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_MPEG4Level0b;
2628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_MPEG4_LEVEL_1:
2630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_MPEG4Level1;
2631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_MPEG4_LEVEL_2:
2633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_MPEG4Level2;
2634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_MPEG4_LEVEL_3:
2636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_MPEG4Level3;
2637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_MPEG4_LEVEL_4:
2639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_MPEG4Level4;
2640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_MPEG4_LEVEL_5:
2642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_MPEG4Level5;
2643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    default:
2645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_MPEG4LevelMax;
2646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      status =  false;
2647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263)
2651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(codec_profile.profile == VEN_PROFILE_H263_BASELINE)
2653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eProfile = OMX_VIDEO_H263ProfileBaseline;
2655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
2657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eProfile = OMX_VIDEO_H263ProfileMax;
2659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return false;
2660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    switch(profile_level.level)
2662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case VEN_LEVEL_H263_10:
2664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_H263Level10;
2665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case VEN_LEVEL_H263_20:
2667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_H263Level20;
2668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case VEN_LEVEL_H263_30:
2670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_H263Level30;
2671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case VEN_LEVEL_H263_40:
2673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_H263Level40;
2674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case VEN_LEVEL_H263_45:
2676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_H263Level45;
2677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case VEN_LEVEL_H263_50:
2679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_H263Level50;
2680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case VEN_LEVEL_H263_60:
2682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_H263Level60;
2683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case VEN_LEVEL_H263_70:
2685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_H263Level70;
2686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    default:
2688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_H263LevelMax;
2689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      status = false;
2690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264)
2694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    switch(codec_profile.profile)
2696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
2698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eProfile = OMX_VIDEO_AVCProfileBaseline;
2699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
2701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eProfile = OMX_VIDEO_AVCProfileMain;
2702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
2704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eProfile = OMX_VIDEO_AVCProfileHigh;
2705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED:
2707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eProfile = OMX_VIDEO_AVCProfileExtended;
2708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10:
2710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eProfile = OMX_VIDEO_AVCProfileHigh10;
2711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422:
2713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eProfile = OMX_VIDEO_AVCProfileHigh422;
2714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE:
2716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eProfile = OMX_VIDEO_AVCProfileHigh444;
2717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    default:
2719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eProfile = OMX_VIDEO_AVCProfileMax;
2720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      status = false;
2721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(!status)
2725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return status;
2727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    switch(profile_level.level)
2730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_H264_LEVEL_1_0:
2732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_AVCLevel1;
2733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_H264_LEVEL_1B:
2735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_AVCLevel1b;
2736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_H264_LEVEL_1_1:
2738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_AVCLevel11;
2739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_H264_LEVEL_1_2:
2741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_AVCLevel12;
2742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_H264_LEVEL_1_3:
2744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_AVCLevel13;
2745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_H264_LEVEL_2_0:
2747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_AVCLevel2;
2748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_H264_LEVEL_2_1:
2750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_AVCLevel21;
2751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_H264_LEVEL_2_2:
2753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_AVCLevel22;
2754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_H264_LEVEL_3_0:
2756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_AVCLevel3;
2757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_H264_LEVEL_3_1:
2759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_AVCLevel31;
2760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_H264_LEVEL_3_2:
2762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_AVCLevel32;
2763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    case V4L2_MPEG_VIDEO_H264_LEVEL_4_0:
2765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_AVCLevel4;
2766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	case V4L2_MPEG_VIDEO_H264_LEVEL_4_1:
2768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_AVCLevel41;
2769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	case V4L2_MPEG_VIDEO_H264_LEVEL_4_2:
2771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_AVCLevel42;
2772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	case V4L2_MPEG_VIDEO_H264_LEVEL_5_0:
2774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_AVCLevel5;
2775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	case V4L2_MPEG_VIDEO_H264_LEVEL_5_1:
2777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_AVCLevel51;
2778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	default :
2780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      *eLevel = OMX_VIDEO_AVCLevelMax;
2781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      status = false;
2782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
2783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return status;
2786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_validate_profile_level(OMX_U32 *eProfile, OMX_U32 *eLevel)
2789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
2790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 new_profile = 0, new_level = 0;
2791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned const int *profile_tbl = NULL;
2792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_U32 mb_per_frame, mb_per_sec;
2793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  bool profile_level_found = false;
2794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_LOW("\n Init profile table for respective codec");
2796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  //validate the ht,width,fps,bitrate and set the appropriate profile and level
2797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4)
2798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(*eProfile == 0)
2800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!m_profile_set)
2802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
2804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
2806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          switch(codec_profile.profile)
2808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
2809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          case V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE:
2810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              *eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
2811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
2812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          case V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE:
2813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
2814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
2815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          default:
2816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("\n %s(): Unknown Error", __func__);
2817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return false;
2818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
2819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(*eLevel == 0 && !m_level_set)
2823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *eLevel = OMX_VIDEO_MPEG4LevelMax;
2825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(*eProfile == OMX_VIDEO_MPEG4ProfileSimple)
2828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profile_tbl = (unsigned int const *)mpeg4_profile_level_table;
2830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2831826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(*eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple)
2832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profile_tbl = (unsigned int const *)
2834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (&mpeg4_profile_level_table[MPEG4_ASP_START]);
2835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
2837826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Unsupported MPEG4 profile type %lu", *eProfile);
2839826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return false;
2840826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2841826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264)
2843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2844826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(*eProfile == 0)
2845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!m_profile_set)
2847826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2848826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          *eProfile = OMX_VIDEO_AVCProfileBaseline;
2849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
2851826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2852826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          switch(codec_profile.profile)
2853826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
2854826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
2855826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            *eProfile = OMX_VIDEO_AVCProfileBaseline;
2856826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
2857826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
2858826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            *eProfile = OMX_VIDEO_AVCProfileMain;
2859826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
2860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          case V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED:
2861826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            *eProfile = OMX_VIDEO_AVCProfileExtended;
2862826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
2863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		  case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
2864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            *eProfile = OMX_VIDEO_AVCProfileHigh;
2865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
2866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		  case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10:
2867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            *eProfile = OMX_VIDEO_AVCProfileHigh10;
2868826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
2869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		  case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422:
2870826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            *eProfile = OMX_VIDEO_AVCProfileHigh422;
2871826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
2872826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		  case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE:
2873826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            *eProfile = OMX_VIDEO_AVCProfileHigh444;
2874826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
2875826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev		  default:
2876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("\n %s(): Unknown Error", __func__);
2877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return false;
2878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
2879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2880826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(*eLevel == 0 && !m_level_set)
2883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *eLevel = OMX_VIDEO_AVCLevelMax;
2885826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(*eProfile == OMX_VIDEO_AVCProfileBaseline)
2888826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2889826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profile_tbl = (unsigned int const *)h264_profile_level_table;
2890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(*eProfile == OMX_VIDEO_AVCProfileHigh)
2892826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profile_tbl = (unsigned int const *)
2894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (&h264_profile_level_table[H264_HP_START]);
2895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else if(*eProfile == OMX_VIDEO_AVCProfileMain)
2897826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2898826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profile_tbl = (unsigned int const *)
2899826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (&h264_profile_level_table[H264_MP_START]);
2900826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2901826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
2902826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2903826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Unsupported AVC profile type %lu", *eProfile);
2904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return false;
2905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2907826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263)
2908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(*eProfile == 0)
2910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!m_profile_set)
2912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          *eProfile = OMX_VIDEO_H263ProfileBaseline;
2914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
2916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2917826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          switch(codec_profile.profile)
2918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
2919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          case VEN_PROFILE_H263_BASELINE:
2920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            *eProfile = OMX_VIDEO_H263ProfileBaseline;
2921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            break;
2922826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          default:
2923826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT_LOW("\n %s(): Unknown Error", __func__);
2924826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return false;
2925826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
2926826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2929826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(*eLevel == 0 && !m_level_set)
2930826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2931826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *eLevel = OMX_VIDEO_H263LevelMax;
2932826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2933826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2934826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(*eProfile == OMX_VIDEO_H263ProfileBaseline)
2935826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2936826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        profile_tbl = (unsigned int const *)h263_profile_level_table;
2937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
2939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT_LOW("\n Unsupported H.263 profile type %lu", *eProfile);
2941826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return false;
2942826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2943826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2944826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
2945826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2946826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n Invalid codec type");
2947826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
2948826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2949826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2950826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  mb_per_frame = ((m_sVenc_cfg.input_height + 15) >> 4)*
2951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   ((m_sVenc_cfg.input_width + 15)>> 4);
2952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2953826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if((mb_per_frame >= 3600) && (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4))
2954826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2955826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(codec_profile.profile == V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE)
2956826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      profile_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
2957826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(codec_profile.profile == V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE)
2958826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      profile_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
2959826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
2960826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      new_level = profile_level.level;
2961826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      new_profile = codec_profile.profile;
2962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return true;
2963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
2964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  mb_per_sec = mb_per_frame * m_sVenc_cfg.fps_num / m_sVenc_cfg.fps_den;
2967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2968826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  do{
2969826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(mb_per_frame <= (int)profile_tbl[0])
2970826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
2971826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(mb_per_sec <= (int)profile_tbl[1])
2972826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
2973826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(m_sVenc_cfg.targetbitrate <= (int)profile_tbl[2])
2974826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
2975826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              new_level = (int)profile_tbl[3];
2976826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              new_profile = (int)profile_tbl[4];
2977826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              profile_level_found = true;
2978826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_LOW("\n Appropriate profile/level found %d/%d\n", new_profile, new_level);
2979826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              break;
2980826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
2981826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
2982826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
2983826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      profile_tbl = profile_tbl + 5;
2984826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }while(profile_tbl[0] != 0);
2985826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2986826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (profile_level_found != true)
2987826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2988826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_LOW("\n ERROR: Unsupported profile/level\n");
2989826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
2990826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2991826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2992826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if((*eLevel == OMX_VIDEO_MPEG4LevelMax) || (*eLevel == OMX_VIDEO_AVCLevelMax)
2993826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     || (*eLevel == OMX_VIDEO_H263LevelMax))
2994826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
2995826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *eLevel = new_level;
2996826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
2997826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT_HIGH("%s: Returning with eProfile = %lu"
2998826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      "Level = %lu", __func__, *eProfile, *eLevel);
2999826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3000826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
3001826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3002826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_
3003826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_meta_mode(bool mode)
3004826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
3005826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(/*ioctl(m_nDriver_fd,VEN_IOCTL_SET_METABUFFER_MODE,&ioctl_msg) < */0)
3006826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
3007826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR(" Set meta buffer mode failed");
3008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return false;
3009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
3010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return true;
3011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3012826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
3013