1826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*--------------------------------------------------------------------------
26eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalCopyright (c) 2010-2013, The Linux Foundation. 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.
116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    * Neither the name of The Linux Foundation 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--------------------------------------------------------------------------*/
286eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
2961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#include <string.h>
30826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/ioctl.h>
31826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/prctl.h>
326eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#include <unistd.h>
33826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <fcntl.h>
346eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#include "video_encoder_device_v4l2.h"
35826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include "omx_video_encoder.h"
3661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#include <linux/android_pmem.h>
37826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef USE_ION
38278952ff92fab2da0c47b912daeb662130676be1Haynes Mathew George#include <linux/msm_ion.h>
39826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
406eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#include <media/msm_media_info.h>
416eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#include <cutils/properties.h>
426eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
439ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan#ifdef _ANDROID_
449ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan#include <media/hardware/HardwareAPI.h>
459ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan#include <gralloc_priv.h>
469ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan#endif
479ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan
486eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define EXTRADATA_IDX(__num_planes) (__num_planes  - 1)
49826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
50826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define MPEG4_SP_START 0
5161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#define MPEG4_ASP_START (MPEG4_SP_START + 10)
52826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define H263_BP_START 0
53826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define H264_BP_START 0
546eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define H264_HP_START (H264_BP_START + 17)
556eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define H264_MP_START (H264_BP_START + 34)
566eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#define POLL_TIMEOUT 1000
5761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#define MAX_SUPPORTED_SLICES_PER_FRAME 28 /* Max supported slices with 32 output buffers */
58826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
59826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* MPEG4 profile and level table*/
6061a2c6a19dbd06a317a419623020e02056661876Praveen Chavanstatic const unsigned int mpeg4_profile_level_table[][5]= {
61826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*max mb per frame, max mb per sec, max bitrate, level, profile*/
62826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,64000,OMX_VIDEO_MPEG4Level0,OMX_VIDEO_MPEG4ProfileSimple},
63826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,64000,OMX_VIDEO_MPEG4Level1,OMX_VIDEO_MPEG4ProfileSimple},
64826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,5940,128000,OMX_VIDEO_MPEG4Level2,OMX_VIDEO_MPEG4ProfileSimple},
65826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,384000,OMX_VIDEO_MPEG4Level3,OMX_VIDEO_MPEG4ProfileSimple},
66826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1200,36000,4000000,OMX_VIDEO_MPEG4Level4a,OMX_VIDEO_MPEG4ProfileSimple},
67826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1620,40500,8000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple},
68826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {3600,108000,12000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple},
696eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    {32400,972000,20000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple},
706eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    {34560,1036800,20000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple},
71826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {0,0,0,0,0},
72826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
73826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,128000,OMX_VIDEO_MPEG4Level0,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
74826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,128000,OMX_VIDEO_MPEG4Level1,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
75826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,5940,384000,OMX_VIDEO_MPEG4Level2,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
76826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,768000,OMX_VIDEO_MPEG4Level3,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
77826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {792,23760,3000000,OMX_VIDEO_MPEG4Level4,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
78826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1620,48600,8000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
796eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    {32400,972000,20000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
806eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    {34560,1036800,20000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileAdvancedSimple},
81826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {0,0,0,0,0},
82826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev};
83826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
84826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* H264 profile and level table*/
8561a2c6a19dbd06a317a419623020e02056661876Praveen Chavanstatic const unsigned int h264_profile_level_table[][5]= {
8661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*max mb per frame, max mb per sec, max bitrate, level, profile*/
87826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,64000,OMX_VIDEO_AVCLevel1,OMX_VIDEO_AVCProfileBaseline},
88826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,128000,OMX_VIDEO_AVCLevel1b,OMX_VIDEO_AVCProfileBaseline},
89826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,3000,192000,OMX_VIDEO_AVCLevel11,OMX_VIDEO_AVCProfileBaseline},
90826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,6000,384000,OMX_VIDEO_AVCLevel12,OMX_VIDEO_AVCProfileBaseline},
91826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,768000,OMX_VIDEO_AVCLevel13,OMX_VIDEO_AVCProfileBaseline},
92826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,2000000,OMX_VIDEO_AVCLevel2,OMX_VIDEO_AVCProfileBaseline},
93826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {792,19800,4000000,OMX_VIDEO_AVCLevel21,OMX_VIDEO_AVCProfileBaseline},
94826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1620,20250,4000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileBaseline},
95826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1620,40500,10000000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileBaseline},
96826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {3600,108000,14000000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileBaseline},
97826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {5120,216000,20000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileBaseline},
98826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {8192,245760,20000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileBaseline},
996eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    {8192,245760,50000000,OMX_VIDEO_AVCLevel41,OMX_VIDEO_AVCProfileBaseline},
1006eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    {8704,522240,50000000,OMX_VIDEO_AVCLevel42,OMX_VIDEO_AVCProfileBaseline},
1016eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    {22080,589824,135000000,OMX_VIDEO_AVCLevel5,OMX_VIDEO_AVCProfileBaseline},
1026eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    {36864,983040,240000000,OMX_VIDEO_AVCLevel51,OMX_VIDEO_AVCProfileBaseline},
103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {0,0,0,0,0},
104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,64000,OMX_VIDEO_AVCLevel1,OMX_VIDEO_AVCProfileHigh},
106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,160000,OMX_VIDEO_AVCLevel1b,OMX_VIDEO_AVCProfileHigh},
107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,3000,240000,OMX_VIDEO_AVCLevel11,OMX_VIDEO_AVCProfileHigh},
108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,6000,480000,OMX_VIDEO_AVCLevel12,OMX_VIDEO_AVCProfileHigh},
109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,960000,OMX_VIDEO_AVCLevel13,OMX_VIDEO_AVCProfileHigh},
110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,2500000,OMX_VIDEO_AVCLevel2,OMX_VIDEO_AVCProfileHigh},
111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {792,19800,5000000,OMX_VIDEO_AVCLevel21,OMX_VIDEO_AVCProfileHigh},
112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1620,20250,5000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileHigh},
113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1620,40500,12500000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileHigh},
114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {3600,108000,17500000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileHigh},
115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {5120,216000,25000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileHigh},
116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {8192,245760,25000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileHigh},
1176eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    {8192,245760,50000000,OMX_VIDEO_AVCLevel41,OMX_VIDEO_AVCProfileHigh},
1186eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    {8704,522240,50000000,OMX_VIDEO_AVCLevel42,OMX_VIDEO_AVCProfileHigh},
1196eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    {22080,589824,135000000,OMX_VIDEO_AVCLevel5,OMX_VIDEO_AVCProfileHigh},
1206eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    {36864,983040,240000000,OMX_VIDEO_AVCLevel51,OMX_VIDEO_AVCProfileHigh},
121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {0,0,0,0,0},
122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,64000,OMX_VIDEO_AVCLevel1,OMX_VIDEO_AVCProfileMain},
124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,128000,OMX_VIDEO_AVCLevel1b,OMX_VIDEO_AVCProfileMain},
125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,3000,192000,OMX_VIDEO_AVCLevel11,OMX_VIDEO_AVCProfileMain},
126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,6000,384000,OMX_VIDEO_AVCLevel12,OMX_VIDEO_AVCProfileMain},
127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,768000,OMX_VIDEO_AVCLevel13,OMX_VIDEO_AVCProfileMain},
128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,2000000,OMX_VIDEO_AVCLevel2,OMX_VIDEO_AVCProfileMain},
129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {792,19800,4000000,OMX_VIDEO_AVCLevel21,OMX_VIDEO_AVCProfileMain},
130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1620,20250,4000000,OMX_VIDEO_AVCLevel22,OMX_VIDEO_AVCProfileMain},
131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1620,40500,10000000,OMX_VIDEO_AVCLevel3,OMX_VIDEO_AVCProfileMain},
132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {3600,108000,14000000,OMX_VIDEO_AVCLevel31,OMX_VIDEO_AVCProfileMain},
133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {5120,216000,20000000,OMX_VIDEO_AVCLevel32,OMX_VIDEO_AVCProfileMain},
134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {8192,245760,20000000,OMX_VIDEO_AVCLevel4,OMX_VIDEO_AVCProfileMain},
1356eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    {8192,245760,50000000,OMX_VIDEO_AVCLevel41,OMX_VIDEO_AVCProfileMain},
1366eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    {8704,522240,50000000,OMX_VIDEO_AVCLevel42,OMX_VIDEO_AVCProfileMain},
1376eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    {22080,589824,135000000,OMX_VIDEO_AVCLevel5,OMX_VIDEO_AVCProfileMain},
1386eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    {36864,983040,240000000,OMX_VIDEO_AVCLevel51,OMX_VIDEO_AVCProfileMain},
139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {0,0,0,0,0}
140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev};
142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* H263 profile and level table*/
14461a2c6a19dbd06a317a419623020e02056661876Praveen Chavanstatic const unsigned int h263_profile_level_table[][5]= {
145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    /*max mb per frame, max mb per sec, max bitrate, level, profile*/
146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,64000,OMX_VIDEO_H263Level10,OMX_VIDEO_H263ProfileBaseline},
147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,5940,128000,OMX_VIDEO_H263Level20,OMX_VIDEO_H263ProfileBaseline},
148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,384000,OMX_VIDEO_H263Level30,OMX_VIDEO_H263ProfileBaseline},
149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,11880,2048000,OMX_VIDEO_H263Level40,OMX_VIDEO_H263ProfileBaseline},
150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {99,1485,128000,OMX_VIDEO_H263Level45,OMX_VIDEO_H263ProfileBaseline},
151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {396,19800,4096000,OMX_VIDEO_H263Level50,OMX_VIDEO_H263ProfileBaseline},
152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {810,40500,8192000,OMX_VIDEO_H263Level60,OMX_VIDEO_H263ProfileBaseline},
153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {1620,81000,16384000,OMX_VIDEO_H263Level70,OMX_VIDEO_H263ProfileBaseline},
1546eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    {32400,972000,20000000,OMX_VIDEO_H263Level70,OMX_VIDEO_H263ProfileBaseline},
1556eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    {34560,1036800,20000000,OMX_VIDEO_H263Level70,OMX_VIDEO_H263ProfileBaseline},
156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {0,0,0,0,0}
157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev};
158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Log2(number, power)  { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) &&  power < 16) { temp >>=0x1; power++; } }
160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power);  num = q >> power; den = 0x1 << (16 - power); }
161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *inputBufferFile1;
164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar inputfilename [] = "/data/input.yuv";
165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFILE *outputBufferFile1;
168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevchar outputfilename [] = "/data/output-bitstream.\0\0\0\0";
169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
1706eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//constructor
172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvenc_dev::venc_dev(class omx_venc *venc_class)
173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
17461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //nothing to do
17561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int i = 0;
17661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_handle = venc_class;
17761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    etb = ebd = ftb = fbd = 0;
17861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
17961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (i = 0; i < MAX_PORT; i++)
18061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        streaming[i] = false;
18161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
182773c10f6a275692d878cc65b05510e993c9a6c49Praveen Chavan    stopped = 1;
18361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    paused = false;
18461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    async_thread_created = false;
18561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    color_format = 0;
18661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_init(&pause_resume_mlock, NULL);
18761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_cond_init(&pause_resume_cond, NULL);
18861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&extradata_info, 0, sizeof(extradata_info));
18961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&idrperiod, 0, sizeof(idrperiod));
19061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&multislice, 0, sizeof(multislice));
19161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset (&slice_mode, 0 , sizeof(slice_mode));
19261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&m_sVenc_cfg, 0, sizeof(m_sVenc_cfg));
19361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&rate_ctrl, 0, sizeof(rate_ctrl));
19461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&bitrate, 0, sizeof(bitrate));
19561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&intra_period, 0, sizeof(intra_period));
19661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&codec_profile, 0, sizeof(codec_profile));
19761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&set_param, 0, sizeof(set_param));
19861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&time_inc, 0, sizeof(time_inc));
19961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&m_sInput_buff_property, 0, sizeof(m_sInput_buff_property));
20061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&m_sOutput_buff_property, 0, sizeof(m_sOutput_buff_property));
20161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&session_qp, 0, sizeof(session_qp));
20261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&entropy, 0, sizeof(entropy));
20361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&dbkfilter, 0, sizeof(dbkfilter));
20461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&intra_refresh, 0, sizeof(intra_refresh));
20561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&hec, 0, sizeof(hec));
20661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&voptimecfg, 0, sizeof(voptimecfg));
20761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&capability, 0, sizeof(capability));
208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvenc_dev::~venc_dev()
211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
21261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //nothing to do
213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2156eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalvoid* venc_dev::async_venc_message_thread (void *input)
216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
21761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_msg venc_msg;
21861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx_video* omx_venc_base = NULL;
21961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx_venc *omx = reinterpret_cast<omx_venc*>(input);
22061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    omx_venc_base = reinterpret_cast<omx_video*>(input);
22161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE* omxhdr = NULL;
22261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
22361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    prctl(PR_SET_NAME, (unsigned long)"VideoEncCallBackThread", 0, 0, 0);
22461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_plane plane[VIDEO_MAX_PLANES];
22561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct pollfd pfd;
22661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer v4l2_buf;
22761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_event dqevent;
22861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pfd.events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI;
22961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pfd.fd = omx->handle->m_nDriver_fd;
23061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int error_code = 0,rc=0;
23161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
23261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&v4l2_buf, 0, sizeof(v4l2_buf));
23361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
23461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (1) {
23561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_lock(&omx->handle->pause_resume_mlock);
23661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
23761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (omx->handle->paused) {
23861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            venc_msg.msgcode = VEN_MSG_PAUSE;
23961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            venc_msg.statuscode = VEN_S_SUCCESS;
24061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
24161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (omx->async_message_process(input, &venc_msg) < 0) {
24261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("\nERROR: Failed to process pause msg");
24361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pthread_mutex_unlock(&omx->handle->pause_resume_mlock);
24461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
24561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
24661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
24761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            /* Block here until the IL client resumes us again */
24861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pthread_cond_wait(&omx->handle->pause_resume_cond,
24961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    &omx->handle->pause_resume_mlock);
25061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
25161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            venc_msg.msgcode = VEN_MSG_RESUME;
25261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            venc_msg.statuscode = VEN_S_SUCCESS;
25361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
25461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (omx->async_message_process(input, &venc_msg) < 0) {
25561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("\nERROR: Failed to process resume msg");
25661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pthread_mutex_unlock(&omx->handle->pause_resume_mlock);
25761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
25861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
25961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
26061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
26161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_unlock(&omx->handle->pause_resume_mlock);
26261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
26361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = poll(&pfd, 1, POLL_TIMEOUT);
26461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
26561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!rc) {
26661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_HIGH("Poll timedout, pipeline stalled due to client/firmware ETB: %d, EBD: %d, FTB: %d, FBD: %d\n",
26761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    omx->handle->etb, omx->handle->ebd, omx->handle->ftb, omx->handle->fbd);
26861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            continue;
26961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (rc < 0) {
27061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Error while polling: %d\n", rc);
27161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
27261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
27361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
27461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((pfd.revents & POLLIN) || (pfd.revents & POLLRDNORM)) {
27561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
27661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.memory = V4L2_MEMORY_USERPTR;
27761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.length = omx->handle->num_planes;
27861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.m.planes = plane;
27961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
28061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            while (!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) {
28161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                venc_msg.msgcode=VEN_MSG_OUTPUT_BUFFER_DONE;
28261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                venc_msg.statuscode=VEN_S_SUCCESS;
28361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omxhdr=omx_venc_base->m_out_mem_ptr+v4l2_buf.index;
28461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                venc_msg.buf.len= v4l2_buf.m.planes->bytesused;
2855ead7ee50146302c4f40aefe28cc6f60d865be20Jorge Solano Altamirano                venc_msg.buf.offset = v4l2_buf.m.planes->data_offset;
28661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                venc_msg.buf.flags = 0;
28761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                venc_msg.buf.ptrbuffer = (OMX_U8 *)omx_venc_base->m_pOutput_pmem[v4l2_buf.index].buffer;
28861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                venc_msg.buf.clientdata=(void*)omxhdr;
28961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                venc_msg.buf.timestamp = (uint64_t) v4l2_buf.timestamp.tv_sec * (uint64_t) 1000000 + (uint64_t) v4l2_buf.timestamp.tv_usec;
29061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
29161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                /* TODO: ideally report other types of frames as well
29261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                 * for now it doesn't look like IL client cares about
29361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                 * other types
29461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                 */
29561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (v4l2_buf.flags & V4L2_QCOM_BUF_FLAG_IDRFRAME)
29661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    venc_msg.buf.flags |= QOMX_VIDEO_PictureTypeIDR;
29761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
29861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (v4l2_buf.flags & V4L2_BUF_FLAG_KEYFRAME)
29961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    venc_msg.buf.flags |= OMX_BUFFERFLAG_SYNCFRAME;
30061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
30161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (v4l2_buf.flags & V4L2_QCOM_BUF_FLAG_CODECCONFIG)
30261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    venc_msg.buf.flags |= OMX_BUFFERFLAG_CODECCONFIG;
30361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
30461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (v4l2_buf.flags & V4L2_BUF_FLAG_EOS)
30561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    venc_msg.buf.flags |= OMX_BUFFERFLAG_EOS;
30661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
30761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->handle->num_planes > 1 && v4l2_buf.m.planes->bytesused)
30861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    venc_msg.buf.flags |= OMX_BUFFERFLAG_EXTRADATA;
30961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
31061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->handle->fbd++;
31161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
31261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&venc_msg) < 0) {
31361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: Wrong ioctl message");
31461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
31561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
31661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
31761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
31861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
31961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((pfd.revents & POLLOUT) || (pfd.revents & POLLWRNORM)) {
32061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
32161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.memory = V4L2_MEMORY_USERPTR;
32261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.m.planes = plane;
32361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            v4l2_buf.length = 1;
32461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
32561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            while (!ioctl(pfd.fd, VIDIOC_DQBUF, &v4l2_buf)) {
32661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                venc_msg.msgcode=VEN_MSG_INPUT_BUFFER_DONE;
32761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                venc_msg.statuscode=VEN_S_SUCCESS;
32861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omxhdr=omx_venc_base->m_inp_mem_ptr+v4l2_buf.index;
32961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                venc_msg.buf.clientdata=(void*)omxhdr;
33061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                omx->handle->ebd++;
33161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
33261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&venc_msg) < 0) {
33361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: Wrong ioctl message");
33461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
33561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
33661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
33761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
33861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
33961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (pfd.revents & POLLPRI) {
34061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            rc = ioctl(pfd.fd, VIDIOC_DQEVENT, &dqevent);
34161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
34261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (dqevent.type == V4L2_EVENT_MSM_VIDC_CLOSE_DONE) {
34361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("CLOSE DONE\n");
34461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
34561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_FLUSH_DONE) {
34661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                venc_msg.msgcode = VEN_MSG_FLUSH_INPUT_DONE;
34761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                venc_msg.statuscode = VEN_S_SUCCESS;
34861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
34961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&venc_msg) < 0) {
35061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: Wrong ioctl message");
35161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
35261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
35361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
35461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                venc_msg.msgcode = VEN_MSG_FLUSH_OUPUT_DONE;
35561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                venc_msg.statuscode = VEN_S_SUCCESS;
35661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
35761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&venc_msg) < 0) {
35861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: Wrong ioctl message");
35961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
36061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
36161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_SYS_ERROR) {
36261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("\n HW Error recieved \n");
36361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                venc_msg.statuscode=VEN_S_EFAIL;
36461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
36561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (omx->async_message_process(input,&venc_msg) < 0) {
36661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: Wrong ioctl message");
36761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
36861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
36961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
37061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
37161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
37261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
37361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("omx_venc: Async Thread exit\n");
37461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return NULL;
3756eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
376b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand
3776eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalstatic const int event_type[] = {
37861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    V4L2_EVENT_MSM_VIDC_FLUSH_DONE,
37961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    V4L2_EVENT_MSM_VIDC_CLOSE_DONE,
38061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    V4L2_EVENT_MSM_VIDC_SYS_ERROR
3816eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal};
3826eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
3836eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalstatic OMX_ERRORTYPE subscribe_to_events(int fd)
3846eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
38561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
38661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_event_subscription sub;
38761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int array_sz = sizeof(event_type)/sizeof(int);
38861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int i,rc;
38961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&sub, 0, sizeof(sub));
39061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
39161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (fd < 0) {
39261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        printf("Invalid input: %d\n", fd);
39361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
39461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
39561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
39661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (i = 0; i < array_sz; ++i) {
39761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(&sub, 0, sizeof(sub));
39861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        sub.type = event_type[i];
39961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(fd, VIDIOC_SUBSCRIBE_EVENT, &sub);
40061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
40161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
40261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            printf("Failed to subscribe event: 0x%x\n", sub.type);
40361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
40461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
40561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
40661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
40761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (i < array_sz) {
40861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        for (--i; i >=0 ; i--) {
40961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            memset(&sub, 0, sizeof(sub));
41061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            sub.type = event_type[i];
41161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
41261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
41361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (rc)
41461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                printf("Failed to unsubscribe event: 0x%x\n", sub.type);
41561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
41661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
41761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        eRet = OMX_ErrorNotImplemented;
41861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
41961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
42061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
4216eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
4226eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
4236eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool venc_dev::handle_extradata(void *buffer, int index)
4246eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
42561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_BUFFERHEADERTYPE *p_bufhdr = (OMX_BUFFERHEADERTYPE *) buffer;
42661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_OTHER_EXTRADATATYPE *p_extra = NULL;
42761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
42861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!extradata_info.uaddr) {
42961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Extradata buffers not allocated\n");
43061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
43161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
43261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
43361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    p_extra = (OMX_OTHER_EXTRADATATYPE *) ((unsigned)(p_bufhdr->pBuffer + p_bufhdr->nOffset + p_bufhdr->nFilledLen + 3)&(~3));
43461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    char *p_extradata = extradata_info.uaddr + index * extradata_info.buffer_size;
43561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
43661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((OMX_U8*)p_extra > (p_bufhdr->pBuffer + p_bufhdr->nAllocLen)) {
43761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Insufficient buffer size\n");
43861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        p_extra = NULL;
43961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
44061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
44161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
44261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memcpy(p_extra, p_extradata, extradata_info.buffer_size);
44361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
44461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
44561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
44661a2c6a19dbd06a317a419623020e02056661876Praveen Chavanint venc_dev::venc_set_format(int format)
44761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
44861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = true;
44961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
45061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (format)
45161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        color_format = format;
45261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    else {
45361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        color_format = 0;
45461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = false;
45561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
45661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
45761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return rc;
4586eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
4596eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
4606eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalOMX_ERRORTYPE venc_dev::allocate_extradata()
4616eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
46261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (extradata_info.allocated) {
46361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("2nd allocation return");
46461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorNone;
46561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
46661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
4676eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
46861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
46961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (extradata_info.buffer_size) {
47061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (extradata_info.ion.ion_alloc_data.handle) {
47161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            munmap((void *)extradata_info.uaddr, extradata_info.size);
47261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            close(extradata_info.ion.fd_ion_data.fd);
47361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free_ion_memory(&extradata_info.ion);
47461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
47561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
47661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        extradata_info.size = (extradata_info.size + 4095) & (~4095);
47761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
47861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        extradata_info.ion.ion_device_fd = alloc_map_ion_memory(
47961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                extradata_info.size,
48061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                &extradata_info.ion.ion_alloc_data,
48161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                &extradata_info.ion.fd_ion_data, 0);
48261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
48361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (extradata_info.ion.ion_device_fd < 0) {
48461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Failed to alloc extradata memory\n");
48561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
48661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
48761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
48861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        extradata_info.uaddr = (char *)mmap(NULL,
48961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                extradata_info.size,
49061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                PROT_READ|PROT_WRITE, MAP_SHARED,
49161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                extradata_info.ion.fd_ion_data.fd , 0);
49261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
49361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (extradata_info.uaddr == MAP_FAILED) {
49461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Failed to map extradata memory\n");
49561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            close(extradata_info.ion.fd_ion_data.fd);
49661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            free_ion_memory(&extradata_info.ion);
49761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorInsufficientResources;
49861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
49961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
50061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
5016eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
50261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extradata_info.allocated = 1;
50361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return OMX_ErrorNone;
5046eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
5056eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
50661a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid venc_dev::free_extradata()
50761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
5086eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef USE_ION
50961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
51061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (extradata_info.uaddr) {
51161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        munmap((void *)extradata_info.uaddr, extradata_info.size);
51261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close(extradata_info.ion.fd_ion_data.fd);
51361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        free_ion_memory(&extradata_info.ion);
51461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
51561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
51661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&extradata_info, 0, sizeof(extradata_info));
5176eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_open(OMX_U32 codec)
521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
52261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int r;
52361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int alignment = 0,buffer_size = 0, temp =0;
52461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control;
52561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_STRING device_name = (OMX_STRING)"/dev/video/venus_enc";
52661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
52761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    char platform_name[PROPERTY_VALUE_MAX];
52861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    property_get("ro.board.platform", platform_name, "0");
52961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
53061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!strncmp(platform_name, "msm8610", 7)) {
53161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        device_name = (OMX_STRING)"/dev/video/q6_enc";
53261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
53361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
5346eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    m_nDriver_fd = open (device_name, O_RDWR);
53561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
53661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_nDriver_fd == 0) {
53761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Got fd as 0 for msm_vidc_enc, Opening again\n");
53861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_nDriver_fd = open (device_name, O_RDWR);
53961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
54061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
54161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((int)m_nDriver_fd < 0) {
54261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Omx_venc::Comp Init Returning failure\n");
54361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
54461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
54561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
54661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\nm_nDriver_fd = %d\n", m_nDriver_fd);
54761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // set the basic configuration of the video encoder driver
54861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.input_width = OMX_CORE_QCIF_WIDTH;
54961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.input_height= OMX_CORE_QCIF_HEIGHT;
55061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.dvs_width = OMX_CORE_QCIF_WIDTH;
55161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.dvs_height = OMX_CORE_QCIF_HEIGHT;
55261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.fps_num = 30;
55361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.fps_den = 1;
55461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.targetbitrate = 64000;
55561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.inputformat= V4L2_PIX_FMT_NV12;
55661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
55761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (codec == OMX_VIDEO_CodingMPEG4) {
55861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sVenc_cfg.codectype = V4L2_PIX_FMT_MPEG4;
55961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_profile.profile = V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE;
56061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        profile_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_2;
561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
56261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strcat(outputfilename, "m4v");
563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
56461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (codec == OMX_VIDEO_CodingH263) {
56561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sVenc_cfg.codectype = V4L2_PIX_FMT_H263;
56661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_profile.profile = VEN_PROFILE_H263_BASELINE;
56761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        profile_level.level = VEN_LEVEL_H263_20;
568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
56961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strcat(outputfilename, "263");
570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5717beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano    } else if (codec == OMX_VIDEO_CodingAVC) {
57261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sVenc_cfg.codectype = V4L2_PIX_FMT_H264;
57361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE;
57461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        profile_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_0;
575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
57661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strcat(outputfilename, "264");
577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
5787beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano    } else if (codec == OMX_VIDEO_CodingVPX) {
57961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sVenc_cfg.codectype = V4L2_PIX_FMT_VP8;
5807beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        codec_profile.profile = V4L2_MPEG_VIDC_VIDEO_VP8_UNUSED;
5817beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        profile_level.level = V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_0;
5826eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#ifdef OUTPUT_BUFFER_LOG
58361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        strcat(outputfilename, "ivf");
5846eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal#endif
58561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
58661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
58861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    inputBufferFile1 = fopen (inputfilename, "ab");
58961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
59061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!inputBufferFile1)
59161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Input File open failed");
59261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
59561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    outputBufferFile1 = fopen (outputfilename, "ab");
596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
59761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int ret;
59861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ret = subscribe_to_events(m_nDriver_fd);
59961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
60061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ret) {
60161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n Subscribe Event Failed \n");
60261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
60361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
60461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
60561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_capability cap;
60661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
60761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_fmtdesc fdesc;
60861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
60961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_format fmt;
61061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
61161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_requestbuffers bufreq;
61261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
61361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ret = ioctl(m_nDriver_fd, VIDIOC_QUERYCAP, &cap);
61461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
61561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ret) {
61661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to query capabilities\n");
61761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
61861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Capabilities: driver_name = %s, card = %s, bus_info = %s,"
61961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                " version = %d, capabilities = %x\n", cap.driver, cap.card,
62061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                cap.bus_info, cap.version, cap.capabilities);
62161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
62261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
62361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ret=0;
62461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
62561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fdesc.index=0;
62661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
62761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (ioctl(m_nDriver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
62861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description,
62961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fdesc.pixelformat, fdesc.flags);
63061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fdesc.index++;
63161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
63261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
63361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
63461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fdesc.index=0;
63561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
63661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    while (ioctl(m_nDriver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
63761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("fmt: description: %s, fmt: %x, flags = %x\n", fdesc.description,
63861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                fdesc.pixelformat, fdesc.flags);
63961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fdesc.index++;
64061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
64161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
64261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sOutput_buff_property.alignment=m_sInput_buff_property.alignment=4096;
64361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
64461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
64561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
64661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.codectype;
64761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
64861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /*TODO: Return values not handled properly in this function anywhere.
64961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan     * Need to handle those.*/
65061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ret = ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt);
65161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
65261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ret) {
65361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to set format on capture port\n");
65461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
65561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
65661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
65761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sOutput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
65861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
65961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
66061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
66161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
66261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV12;
66361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
66461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ret = ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt);
66561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sInput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
66661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
66761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bufreq.memory = V4L2_MEMORY_USERPTR;
66861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bufreq.count = 2;
66961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
67061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
67161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ret = ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq);
67261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sInput_buff_property.mincount = m_sInput_buff_property.actualcount = bufreq.count;
67361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
67461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
67561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bufreq.count = 2;
67661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ret = ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq);
67761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sOutput_buff_property.mincount = m_sOutput_buff_property.actualcount = bufreq.count;
67861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
67961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
6802e277fbebd51de1d4f029f7950ed2a98731177dcArun Menon    resume_in_stopped = 0;
68161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    metadatamode = 0;
68261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
68361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.id = V4L2_CID_MPEG_VIDEO_HEADER_MODE;
68461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.value = V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE;
68561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
68661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Calling IOCTL to disable seq_hdr in sync_frame id=%d, val=%d\n", control.id, control.value);
68761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
68861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control))
68961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to set control\n");
69061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
69161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_frmsizeenum frmsize;
69261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
69361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //Get the hardware capabilities
69461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset((void *)&frmsize,0,sizeof(frmsize));
69561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frmsize.index = 0;
69661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frmsize.pixel_format = m_sVenc_cfg.codectype;
69761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ret = ioctl(m_nDriver_fd, VIDIOC_ENUM_FRAMESIZES, &frmsize);
69861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
69961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ret || frmsize.type != V4L2_FRMSIZE_TYPE_STEPWISE) {
70061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to get framesizes\n");
70161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
70261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
70361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
70461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (frmsize.type == V4L2_FRMSIZE_TYPE_STEPWISE) {
70561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        capability.min_width = frmsize.stepwise.min_width;
70661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        capability.max_width = frmsize.stepwise.max_width;
70761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        capability.min_height = frmsize.stepwise.min_height;
70861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        capability.max_height = frmsize.stepwise.max_height;
70961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
71061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
71161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7146eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
7156eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalstatic OMX_ERRORTYPE unsubscribe_to_events(int fd)
7166eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
71761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
71861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_event_subscription sub;
71961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int array_sz = sizeof(event_type)/sizeof(int);
72061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int i,rc;
72161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
72261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (fd < 0) {
72361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        printf("Invalid input: %d\n", fd);
72461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
72561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
72661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
72761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (i = 0; i < array_sz; ++i) {
72861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(&sub, 0, sizeof(sub));
72961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        sub.type = event_type[i];
73061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
73161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
73261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
73361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            printf("Failed to unsubscribe event: 0x%x\n", sub.type);
73461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
73561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
73661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
73761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
73861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
7396eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
7406eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid venc_dev::venc_close()
742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
74361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_encoder_cmd enc;
74461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\nvenc_close: fd = %d", m_nDriver_fd);
74561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
74661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((int)m_nDriver_fd >= 0) {
74761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        enc.cmd = V4L2_ENC_CMD_STOP;
74861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl(m_nDriver_fd, VIDIOC_ENCODER_CMD, &enc);
74961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("venc_close E\n");
75061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
75161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (async_thread_created)
75261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pthread_join(m_tid,NULL);
75361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
75461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("venc_close X\n");
75561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsubscribe_to_events(m_nDriver_fd);
75661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close(m_nDriver_fd);
75761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_nDriver_fd = -1;
75861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
75961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
76161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fclose (inputBufferFile1);
762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
76461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fclose (outputBufferFile1);
765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_buf_req(unsigned long *min_buff_count,
76961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned long *actual_buff_count,
77061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned long *buff_size,
77161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned long port)
772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7736eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
77461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned long temp_count = 0;
775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
77661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == 0) {
77761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*actual_buff_count > m_sInput_buff_property.mincount) {
77861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            temp_count = m_sInput_buff_property.actualcount;
77961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_sInput_buff_property.actualcount = *actual_buff_count;
78061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n I/P Count set to %lu\n", *actual_buff_count);
78161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
78261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
78361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*actual_buff_count > m_sOutput_buff_property.mincount) {
78461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            temp_count = m_sOutput_buff_property.actualcount;
78561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_sOutput_buff_property.actualcount = *actual_buff_count;
78661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n O/P Count set to %lu\n", *actual_buff_count);
78761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
79061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_loaded_start()
795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
79661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_loaded_stop()
800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
80161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_loaded_start_done()
805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
80661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_loaded_stop_done()
810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
81161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_get_seq_hdr(void *buffer,
81561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned buffer_size, unsigned *header_len)
816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
81761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_get_buf_req(unsigned long *min_buff_count,
82161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned long *actual_buff_count,
82261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned long *buff_size,
82361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned long port)
824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
82561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_format fmt;
82661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_requestbuffers bufreq;
82761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int buf_size = 0, extra_data_size = 0, client_extra_data_size = 0;
82861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int ret;
82961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
83061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == 0) {
83161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
83261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
83361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
83461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV12;
83561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(m_nDriver_fd, VIDIOC_G_FMT, &fmt);
83661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sInput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
83761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.memory = V4L2_MEMORY_USERPTR;
83861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
83961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*actual_buff_count)
84061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufreq.count = *actual_buff_count;
84161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else
84261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufreq.count = 2;
843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
84461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
84561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq);
846826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
84761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
84861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\n VIDIOC_REQBUFS OUTPUT_MPLANE Failed \n ");
84961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
850826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
85161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
85261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sInput_buff_property.mincount = m_sInput_buff_property.actualcount = bufreq.count;
85361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *min_buff_count = m_sInput_buff_property.mincount;
85461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *actual_buff_count = m_sInput_buff_property.actualcount;
85561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef USE_ION
85661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // For ION memory allocations of the allocated buffer size
85761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // must be 4k aligned, hence aligning the input buffer
85861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // size to 4k.
85961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sInput_buff_property.datasize = (m_sInput_buff_property.datasize + 4095) & (~4095);
86061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
86161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *buff_size = m_sInput_buff_property.datasize;
86261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
86361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int extra_idx = 0;
86461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
86561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
86661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
86761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.codectype;
86861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
86961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt);
87061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sOutput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
87161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
87261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
87361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
87461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.codectype;
87561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
87661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(m_nDriver_fd, VIDIOC_G_FMT, &fmt);
87761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sOutput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
87861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.memory = V4L2_MEMORY_USERPTR;
87961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
88061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*actual_buff_count)
88161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufreq.count = *actual_buff_count;
882826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
88361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufreq.count = 2;
884826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
88561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
88661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq);
887826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
88861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
88961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\n VIDIOC_REQBUFS CAPTURE_MPLANE Failed \n ");
89061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
891826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
89261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
89361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sOutput_buff_property.mincount = m_sOutput_buff_property.actualcount = bufreq.count;
89461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *min_buff_count = m_sOutput_buff_property.mincount;
89561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *actual_buff_count = m_sOutput_buff_property.actualcount;
89661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *buff_size = m_sOutput_buff_property.datasize;
89761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        num_planes = fmt.fmt.pix_mp.num_planes;
89861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        extra_idx = EXTRADATA_IDX(num_planes);
89961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
90061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
90161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            extra_data_size =  fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage;
90261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (extra_idx >= VIDEO_MAX_PLANES) {
90361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d\n", extra_idx);
90461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
906826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
90761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        extradata_info.buffer_size = extra_data_size;
90861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        extradata_info.count = m_sOutput_buff_property.actualcount;
90961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        extradata_info.size = extradata_info.buffer_size * extradata_info.count;
91061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
91261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
914826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
91561a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_set_param(void *paramData,OMX_INDEXTYPE index )
916826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
91761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("venc_set_param:: venc-720p\n");
91861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_format fmt;
91961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_requestbuffers bufreq;
92061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int ret;
921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
92261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch (index) {
92361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamPortDefinition:
92461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
92561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
92661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
92761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamPortDefinition\n");
928826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
92961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (portDefn->nPortIndex == PORT_INDEX_IN) {
93061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_encode_framerate(portDefn->format.video.xFramerate, 0)) {
93161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
93261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
9336eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
93461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_color_format(portDefn->format.video.eColorFormat)) {
93561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
93661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
93761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
93861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (m_sVenc_cfg.input_height != portDefn->format.video.nFrameHeight ||
93961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            m_sVenc_cfg.input_width != portDefn->format.video.nFrameWidth) {
94061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_LOW("\n Basic parameter has changed");
94161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_sVenc_cfg.input_height = portDefn->format.video.nFrameHeight;
94261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_sVenc_cfg.input_width = portDefn->format.video.nFrameWidth;
94361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
94461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
94561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
94661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV12;
94761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
94861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt)) {
94961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("\n VIDIOC_S_FMT OUTPUT_MPLANE Failed \n ");
95061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            return false;
95161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
952826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
95361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_sInput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
95461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        bufreq.memory = V4L2_MEMORY_USERPTR;
95561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        bufreq.count = portDefn->nBufferCountActual;
95661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
95761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
95861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq)) {
95961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("\n VIDIOC_REQBUFS OUTPUT_MPLANE Failed \n ");
96061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            return false;
96161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
96261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
96361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (bufreq.count == portDefn->nBufferCountActual)
96461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            m_sInput_buff_property.mincount = m_sInput_buff_property.actualcount = bufreq.count;
96561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
96661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (portDefn->nBufferCountActual >= m_sInput_buff_property.mincount)
96761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            m_sInput_buff_property.actualcount = portDefn->nBufferCountActual;
96861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
96961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
97061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_LOW("input: actual: %d, min: %d, count_req: %d\n",
97161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            portDefn->nBufferCountActual, m_sInput_buff_property.mincount, bufreq.count);
97261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (portDefn->nPortIndex == PORT_INDEX_OUT) {
97361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
97461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
97561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
97661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.codectype;
97761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
97861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt)) {
97961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\n VIDIOC_S_FMT CAPTURE_MPLANE Failed \n ");
98061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
98161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
98261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
98361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_sOutput_buff_property.datasize = fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
98461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
98561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_target_bitrate(portDefn->format.video.nBitrate, 0)) {
98661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
98761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
98861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
98961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ((portDefn->nBufferCountActual >= m_sOutput_buff_property.mincount)
99061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            && (m_sOutput_buff_property.datasize == portDefn->nBufferSize)) {
99161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_sOutput_buff_property.actualcount = portDefn->nBufferCountActual;
99261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        bufreq.memory = V4L2_MEMORY_USERPTR;
99361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        bufreq.count = portDefn->nBufferCountActual;
99461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        bufreq.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
99561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
99661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq)) {
99761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("\nERROR: Request for setting o/p buffer count failed: requested: %lu, current: %lu",
99861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    portDefn->nBufferCountActual, m_sOutput_buff_property.actualcount);
99961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            return false;
100061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
100161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
100261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (bufreq.count == portDefn->nBufferCountActual)
100361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            m_sOutput_buff_property.mincount = m_sOutput_buff_property.actualcount = bufreq.count;
100461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
100561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (portDefn->nBufferCountActual >= m_sOutput_buff_property.mincount)
100661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            m_sOutput_buff_property.actualcount = portDefn->nBufferCountActual;
100761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
100861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (num_planes > 1)
100961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            extradata_info.count = m_sOutput_buff_property.actualcount;
101061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
101161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Setting Output buffer requirements failed");
101261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
101361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
101461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
101561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_LOW("Output: actual: %d, min: %d, count_req: %d\n",
101661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            portDefn->nBufferCountActual, m_sOutput_buff_property.mincount, bufreq.count);
101761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
101861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamPortDefinition");
101961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
102061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
102161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
102261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
102361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoPortFormat:
102461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
102561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt;
102661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portFmt =(OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
102761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoPortFormat\n");
102861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
102961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (portFmt->nPortIndex == (OMX_U32) PORT_INDEX_IN) {
103061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_color_format(portFmt->eColorFormat)) {
103161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
103261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
103361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (portFmt->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
103461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_encode_framerate(portFmt->xFramerate, 0)) {
103561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
103661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
103761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
103861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoPortFormat");
103961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
104061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
104161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
104261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
104361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoBitrate:
104461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
104561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_BITRATETYPE* pParam;
104661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pParam = (OMX_VIDEO_PARAM_BITRATETYPE*)paramData;
104761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoBitrate\n");
104861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
104961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
105061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_target_bitrate(pParam->nTargetBitrate, 0)) {
105161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Target Bit Rate setting failed");
105261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
105361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
105461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
105561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_ratectrl_cfg(pParam->eControlRate)) {
105661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Rate Control setting failed");
105761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
105861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
105961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
106061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoBitrate");
106161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
106261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
106361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
106461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
106561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoMpeg4:
106661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
106761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_MPEG4TYPE* pParam;
106861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_U32 bFrames = 0;
106961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
107061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pParam = (OMX_VIDEO_PARAM_MPEG4TYPE*)paramData;
107161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoMpeg4\n");
107261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
107361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
107461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_voptiming_cfg(pParam->nTimeIncRes)) {
107561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Request for setting vop_timing failed");
107661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
107761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
107861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
107961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_profile_set = false;
108061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_level_set = false;
108161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
108261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_profile_level (pParam->eProfile, pParam->eLevel)) {
108361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating Profile and level");
108461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
108561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
108661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (pParam->eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple) {
108761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (pParam->nBFrames) {
108861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
108961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                bFrames = 1;
109061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
109161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
109261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (pParam->nBFrames) {
109361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                DEBUG_PRINT_ERROR("Warning: B frames not supported\n");
109461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                bFrames = 0;
109561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
109661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
109761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
109861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
109961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_intra_period (pParam->nPFrames,bFrames)) {
110061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
110161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
110261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
110361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
110461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_multislice_cfg(OMX_IndexParamVideoMpeg4,pParam->nSliceHeaderSpacing)) {
110561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating slice_config");
110661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
110761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
110861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
110961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoMpeg4");
111061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
111161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
111261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
111361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
111461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoH263:
111561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
111661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_H263TYPE* pParam = (OMX_VIDEO_PARAM_H263TYPE*)paramData;
111761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoH263\n");
111861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_U32 bFrames = 0;
111961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
112061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
112161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_profile_set = false;
112261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_level_set = false;
112361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
112461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_profile_level (pParam->eProfile, pParam->eLevel)) {
112561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating Profile and level");
112661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
112761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
112861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
112961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pParam->nBFrames)
113061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nWARNING: B frame not supported for H.263");
113161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
113261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_intra_period (pParam->nPFrames, bFrames) == false) {
113361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
113461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
113561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
113661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
113761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoH263");
113861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
113961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
114061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
114161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
114261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoAvc:
114361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
114461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoAvc\n");
114561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_AVCTYPE* pParam = (OMX_VIDEO_PARAM_AVCTYPE*)paramData;
114661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_U32 bFrames = 0;
114761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
114861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
114961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_LOW("pParam->eProfile :%d ,pParam->eLevel %d\n",
115061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pParam->eProfile,pParam->eLevel);
115161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
115261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_profile_set = false;
115361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_level_set = false;
115461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
115561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_profile_level (pParam->eProfile,pParam->eLevel)) {
115661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating Profile and level %d, %d",
115761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pParam->eProfile, pParam->eLevel);
115861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
115961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
116061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (pParam->eProfile != OMX_VIDEO_AVCProfileBaseline) {
116161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (pParam->nBFrames) {
116261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
116361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                bFrames = 1;
116461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
116561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
116661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (pParam->nBFrames) {
116761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                DEBUG_PRINT_ERROR("Warning: B frames not supported\n");
116861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                bFrames = 0;
116961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
117061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
117161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
117261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
117361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_intra_period (pParam->nPFrames, bFrames)) {
117461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
117561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
117661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
117761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
117861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_entropy_config (pParam->bEntropyCodingCABAC, pParam->nCabacInitIdc)) {
117961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Request for setting Entropy failed");
118061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
118161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
118261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
118361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_inloop_filter (pParam->eLoopFilterMode)) {
118461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Request for setting Inloop filter failed");
118561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
118661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
118761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
118861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_multislice_cfg(OMX_IndexParamVideoAvc, pParam->nSliceHeaderSpacing)) {
118961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nWARNING: Unsuccessful in updating slice_config");
119061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
119161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
119261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
119361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoAvc");
119461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
119561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
119661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //TBD, lot of other variables to be updated, yet to decide
119761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
119861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
11997beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        case (OMX_INDEXTYPE)OMX_IndexParamVideoVp8:
12007beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            {
12017beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoVp8\n");
12027beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                OMX_VIDEO_PARAM_VP8TYPE* pParam = (OMX_VIDEO_PARAM_VP8TYPE*)paramData;
12037beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                if (!venc_set_profile_level (pParam->eProfile, pParam->eLevel)) {
12047beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                    DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating Profile and level %d, %d",
12057beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                                        pParam->eProfile, pParam->eLevel);
12067beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                    return false;
12077beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                }
12087beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                break;
12097beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            }
121061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoIntraRefresh:
121161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
121261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoIntraRefresh\n");
121361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_INTRAREFRESHTYPE *intra_refresh =
121461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_VIDEO_PARAM_INTRAREFRESHTYPE *)paramData;
121561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
121661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (intra_refresh->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
121761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_intra_refresh(intra_refresh->eRefreshMode, intra_refresh->nCirMBs) == false) {
121861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Setting Intra refresh failed");
121961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
122061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
122161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
122261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoIntraRefresh");
122361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
122461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
122561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
122661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
122761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoErrorCorrection:
122861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
122961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoErrorCorrection\n");
123061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *error_resilience =
123161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)paramData;
123261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
123361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (error_resilience->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
123461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_error_resilience(error_resilience) == false) {
123561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Setting Intra refresh failed");
123661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
123761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
123861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
123961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoErrorCorrection");
124061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
124161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
124261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
124361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
124461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoProfileLevelCurrent:
124561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
124661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoProfileLevelCurrent\n");
124761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_PROFILELEVELTYPE *profile_level =
124861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData;
124961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
125061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (profile_level->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
125161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_profile_set = false;
125261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_level_set = false;
125361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
125461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_profile_level (profile_level->eProfile,
125561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                profile_level->eLevel)) {
125661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nWARNING: Unsuccessful in updating Profile and level");
125761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
125861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
125961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
126061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoProfileLevelCurrent");
126161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
126261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
126361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
126461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
126561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoQuantization:
126661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
126761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoQuantization\n");
126861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_QUANTIZATIONTYPE *session_qp =
126961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_VIDEO_PARAM_QUANTIZATIONTYPE *)paramData;
127061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
127161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (session_qp->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
127261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_session_qp (session_qp->nQpI,
127361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                session_qp->nQpP,
127461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                session_qp->nQpB) == false) {
127561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Setting Session QP failed");
127661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
127761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
127861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
127961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoQuantization");
128061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
128161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
128261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
128361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
128461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexEnableSliceDeliveryMode:
128561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
128661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_EXTNINDEX_PARAMTYPE* pParam =
128761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (QOMX_EXTNINDEX_PARAMTYPE*)paramData;
128861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
128961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pParam->nPortIndex == PORT_INDEX_OUT) {
129061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_slice_delivery_mode(pParam->bEnable) == false) {
129161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("Setting slice delivery mode failed");
129261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorUnsupportedSetting;
129361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
129461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
129561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("OMX_QcomIndexEnableSliceDeliveryMode "
129661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            "called on wrong port(%d)", pParam->nPortIndex);
129761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadPortIndex;
129861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
129961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
130061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
130161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
130261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_ExtraDataVideoEncoderSliceInfo:
130361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
130461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param: OMX_ExtraDataVideoEncoderSliceInfo");
130561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_U32 extra_data = *(OMX_U32 *)paramData;
130661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
130761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (venc_set_extradata(extra_data) == false) {
130861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Setting "
130961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            "OMX_ExtraDataVideoEncoderSliceInfo failed");
131061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return false;
131161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
131261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
131361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                extradata = true;
131461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
131561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
131661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoSliceFMO:
131761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
131861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\nERROR: Unsupported parameter in venc_set_param: %u",
131961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    index);
132061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
132161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            //case
132261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
132361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
132461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
132561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
132661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
132761a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_set_config(void *configData, OMX_INDEXTYPE index)
132861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
132961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
133061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n Inside venc_set_config");
133161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
133261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch (index) {
133361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexConfigVideoBitrate:
133461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
133561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_CONFIG_BITRATETYPE *bit_rate = (OMX_VIDEO_CONFIG_BITRATETYPE *)
133661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    configData;
133761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\n venc_set_config: OMX_IndexConfigVideoBitrate");
133861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
133961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (bit_rate->nPortIndex == (OMX_U32)PORT_INDEX_OUT) {
134061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_target_bitrate(bit_rate->nEncodeBitrate, 1) == false) {
134161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Setting Target Bit rate failed");
134261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
134361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
134461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
134561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexConfigVideoBitrate");
134661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
134761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
134861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
134961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
135061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexConfigVideoFramerate:
135161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
135261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_CONFIG_FRAMERATETYPE *frame_rate = (OMX_CONFIG_FRAMERATETYPE *)
135361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    configData;
135461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\n venc_set_config: OMX_IndexConfigVideoFramerate");
135561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
135661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (frame_rate->nPortIndex == (OMX_U32)PORT_INDEX_OUT) {
135761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_encode_framerate(frame_rate->xEncodeFramerate, 1) == false) {
135861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Setting Encode Framerate failed");
135961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
136061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
136161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
136261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexConfigVideoFramerate");
136361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
136461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
136561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
136661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
136761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case QOMX_IndexConfigVideoIntraperiod:
136861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
136961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param:QOMX_IndexConfigVideoIntraperiod\n");
137061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_VIDEO_INTRAPERIODTYPE *intraperiod =
137161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (QOMX_VIDEO_INTRAPERIODTYPE *)configData;
137261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
137361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (intraperiod->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
137461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_intra_period(intraperiod->nPFrames, intraperiod->nBFrames) == false) {
137561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
137661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
137761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
137861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
137961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
138061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
138161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
138261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexConfigVideoIntraVOPRefresh:
138361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
138461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_CONFIG_INTRAREFRESHVOPTYPE *intra_vop_refresh = (OMX_CONFIG_INTRAREFRESHVOPTYPE *)
138561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    configData;
138661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\n venc_set_config: OMX_IndexConfigVideoIntraVOPRefresh");
138761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
138861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (intra_vop_refresh->nPortIndex == (OMX_U32)PORT_INDEX_OUT) {
138961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_intra_vop_refresh(intra_vop_refresh->IntraRefreshVOP) == false) {
139061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Setting Encode Framerate failed");
139161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
139261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
139361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
139461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexConfigVideoFramerate");
139561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
139661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
139761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
139861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
139961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexConfigCommonRotate:
140061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
140161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_CONFIG_ROTATIONTYPE *config_rotation =
140261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    reinterpret_cast<OMX_CONFIG_ROTATIONTYPE*>(configData);
140361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_U32 nFrameWidth;
140461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
140561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("\nvenc_set_config: updating the new Dims");
140661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nFrameWidth = m_sVenc_cfg.input_width;
140761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_sVenc_cfg.input_width  = m_sVenc_cfg.input_height;
140861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_sVenc_cfg.input_height = nFrameWidth;
140961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
141061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_BASE_CFG,(void*)&ioctl_msg) < */0) {
141161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: Dimension Change for Rotation failed");
141261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return false;
141361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
141461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
141561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
141661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
141761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexConfigVideoAVCIntraPeriod:
141861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
141961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_CONFIG_AVCINTRAPERIOD *avc_iperiod = (OMX_VIDEO_CONFIG_AVCINTRAPERIOD*) configData;
142061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexConfigVideoAVCIntraPeriod");
142161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
142261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (venc_set_idr_period(avc_iperiod->nPFrames, avc_iperiod->nIDRPeriod)
142361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        == false) {
142461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Setting "
142561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            "OMX_IndexConfigVideoAVCIntraPeriod failed");
142661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return false;
142761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
142861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
142961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
143061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
143161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
143261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\n Unsupported config index = %u", index);
143361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
143461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
143561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
143661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
143761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
143861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
143961a2c6a19dbd06a317a419623020e02056661876Praveen Chavanunsigned venc_dev::venc_stop( void)
144061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
144161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_msg venc_msg;
14429051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon    struct v4l2_requestbuffers bufreq;
14439051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon    int rc = 0, ret = 0;
144461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
144561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!stopped) {
144661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        enum v4l2_buf_type cap_type;
144761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
144861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (streaming[OUTPUT_PORT]) {
144961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            cap_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
145061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            rc = ioctl(m_nDriver_fd, VIDIOC_STREAMOFF, &cap_type);
145161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
145261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (rc) {
145361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Failed to call streamoff on driver: capability: %d, %d\n",
145461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        cap_type, rc);
145561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else
145661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                streaming[OUTPUT_PORT] = false;
14579051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon
14589051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon            DEBUG_PRINT_LOW("Releasing registered buffers from driver on o/p port");
14599051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon            bufreq.memory = V4L2_MEMORY_USERPTR;
14609051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon            bufreq.count = 0;
14619051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon            bufreq.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
14629051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon            ret = ioctl(m_nDriver_fd, VIDIOC_REQBUFS, &bufreq);
14639051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon
14649051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon            if (ret) {
14659051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon                DEBUG_PRINT_ERROR("\nERROR: VIDIOC_REQBUFS OUTPUT MPLANE Failed \n ");
14669051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon                return false;
14679051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon            }
146861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
146961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
147061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!rc && streaming[CAPTURE_PORT]) {
147161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            cap_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
147261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            rc = ioctl(m_nDriver_fd, VIDIOC_STREAMOFF, &cap_type);
147361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
147461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (rc) {
147561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Failed to call streamoff on driver: capability: %d, %d\n",
147661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        cap_type, rc);
147761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else
147861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                streaming[CAPTURE_PORT] = false;
14799051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon
14809051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon            DEBUG_PRINT_LOW("Releasing registered buffers from driver on capture port");
14819051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon            bufreq.memory = V4L2_MEMORY_USERPTR;
14829051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon            bufreq.count = 0;
14839051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon            bufreq.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
14849051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon            ret = ioctl(m_nDriver_fd, VIDIOC_REQBUFS, &bufreq);
14859051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon
14869051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon            if (ret) {
14879051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon                DEBUG_PRINT_ERROR("\nERROR: VIDIOC_REQBUFS CAPTURE MPLANE Failed \n ");
14889051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon                return false;
14899051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon            }
149061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
149161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
14929051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon        if (!rc && !ret) {
149361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            venc_stop_done();
149461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            stopped = 1;
14952e277fbebd51de1d4f029f7950ed2a98731177dcArun Menon            /*set flag to re-configure when started again*/
14962e277fbebd51de1d4f029f7950ed2a98731177dcArun Menon            resume_in_stopped = 1;
14972e277fbebd51de1d4f029f7950ed2a98731177dcArun Menon
149861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
149961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
150061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
150161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return rc;
150261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
150361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
150461a2c6a19dbd06a317a419623020e02056661876Praveen Chavanunsigned venc_dev::venc_pause(void)
150561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
150661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&pause_resume_mlock);
150761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    paused = true;
150861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&pause_resume_mlock);
150961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return 0;
151061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
151161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
151261a2c6a19dbd06a317a419623020e02056661876Praveen Chavanunsigned venc_dev::venc_resume(void)
151361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
151461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&pause_resume_mlock);
151561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    paused = false;
151661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&pause_resume_mlock);
151761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
151861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return pthread_cond_signal(&pause_resume_cond);
151961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
152061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
152161a2c6a19dbd06a317a419623020e02056661876Praveen Chavanunsigned venc_dev::venc_start_done(void)
152261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
152361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_msg venc_msg;
152461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_msg.msgcode = VEN_MSG_START;
152561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_msg.statuscode = VEN_S_SUCCESS;
152661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_handle->async_message_process(venc_handle,&venc_msg);
152761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return 0;
152861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
1529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned venc_dev::venc_stop_done(void)
1531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
153261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_msg venc_msg;
153361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    free_extradata();
153461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_msg.msgcode=VEN_MSG_STOP;
153561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_msg.statuscode=VEN_S_SUCCESS;
153661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_handle->async_message_process(venc_handle,&venc_msg);
153761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return 0;
1538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
154061a2c6a19dbd06a317a419623020e02056661876Praveen Chavanunsigned venc_dev::venc_set_message_thread_id(pthread_t tid)
154161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
154261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    async_thread_created = true;
154361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_tid=tid;
154461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return 0;
154561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
154661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
154761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
154861a2c6a19dbd06a317a419623020e02056661876Praveen Chavanunsigned venc_dev::venc_start(void)
154961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
155061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    enum v4l2_buf_type buf_type;
155161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int ret,r;
1552cf8408186605323a6797e5f431192ab434e79fffArun Menon    struct v4l2_control control = {0};
1553cf8408186605323a6797e5f431192ab434e79fffArun Menon
1554cf8408186605323a6797e5f431192ab434e79fffArun Menon    DEBUG_PRINT_HIGH("%s(): Check Profile/Level set in driver before start",
155561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            __func__);
155661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
155761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!venc_set_profile_level(0, 0)) {
155861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n ERROR: %s(): Driver Profile/Level is NOT SET",
155961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                __func__);
156061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
156161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("\n %s(): Driver Profile[%lu]/Level[%lu] successfully SET",
156261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                __func__, codec_profile.profile, profile_level.level);
156361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
156461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
156561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_config_print();
156661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
15672e277fbebd51de1d4f029f7950ed2a98731177dcArun Menon    if(resume_in_stopped){
15682e277fbebd51de1d4f029f7950ed2a98731177dcArun Menon        /*set buffercount when restarted*/
15692e277fbebd51de1d4f029f7950ed2a98731177dcArun Menon        venc_reconfig_reqbufs();
15702e277fbebd51de1d4f029f7950ed2a98731177dcArun Menon        resume_in_stopped = 0;
15712e277fbebd51de1d4f029f7950ed2a98731177dcArun Menon    }
15722e277fbebd51de1d4f029f7950ed2a98731177dcArun Menon
157361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* Check if slice_delivery mode is enabled & max slices is sufficient for encoding complete frame */
157461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (slice_mode.enable && multislice.mslice_size &&
157561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (m_sVenc_cfg.input_width *  m_sVenc_cfg.input_height)/(256 * multislice.mslice_size) >= MAX_SUPPORTED_SLICES_PER_FRAME) {
157661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("slice_mode: %d, max slices (%d) should be less than (%d)\n", slice_mode.enable,
157761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (m_sVenc_cfg.input_width *  m_sVenc_cfg.input_height)/(256 * multislice.mslice_size),
157861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                MAX_SUPPORTED_SLICES_PER_FRAME);
157961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return 1;
158061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
158161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
158261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
158361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
158461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ret=ioctl(m_nDriver_fd, VIDIOC_STREAMON,&buf_type);
158561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
158661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ret)
158761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return 1;
158861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
158961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    streaming[CAPTURE_PORT] = true;
1590cf8408186605323a6797e5f431192ab434e79fffArun Menon
1591cf8408186605323a6797e5f431192ab434e79fffArun Menon    control.id = V4L2_CID_MPEG_VIDC_VIDEO_REQUEST_SEQ_HEADER;
1592cf8408186605323a6797e5f431192ab434e79fffArun Menon    control.value = 1;
1593cf8408186605323a6797e5f431192ab434e79fffArun Menon    ret = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
1594cf8408186605323a6797e5f431192ab434e79fffArun Menon    if (ret) {
1595cf8408186605323a6797e5f431192ab434e79fffArun Menon        DEBUG_PRINT_ERROR("failed to request seq header");
1596cf8408186605323a6797e5f431192ab434e79fffArun Menon        return 1;
1597cf8408186605323a6797e5f431192ab434e79fffArun Menon    }
1598cf8408186605323a6797e5f431192ab434e79fffArun Menon
1599773c10f6a275692d878cc65b05510e993c9a6c49Praveen Chavan    stopped = 0;
160061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return 0;
160161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
160261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
160361a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid venc_dev::venc_config_print()
160461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
160561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
160661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("\nENC_CONFIG: Codec: %ld, Profile %ld, level : %ld",
160761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_sVenc_cfg.codectype, codec_profile.profile, profile_level.level);
160861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
160961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("\n ENC_CONFIG: Width: %ld, Height:%ld, Fps: %ld",
161061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_sVenc_cfg.input_width, m_sVenc_cfg.input_height,
161161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_sVenc_cfg.fps_num/m_sVenc_cfg.fps_den);
161261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
161361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("\nENC_CONFIG: Bitrate: %ld, RC: %ld, I-Period: %ld",
161461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bitrate.target_bitrate, rate_ctrl.rcmode, intra_period.num_pframes);
161561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
161661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("\nENC_CONFIG: qpI: %ld, qpP: %ld, qpb: %ld",
161761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            session_qp.iframeqp, session_qp.pframqp,session_qp.bframqp);
161861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
161961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("\nENC_CONFIG: VOP_Resolution: %ld, Slice-Mode: %ld, Slize_Size: %ld",
162061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            voptimecfg.voptime_resolution, multislice.mslice_mode,
162161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            multislice.mslice_size);
162261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
162361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("\nENC_CONFIG: EntropyMode: %d, CabacModel: %ld",
162461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            entropy.longentropysel, entropy.cabacmodel);
162561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
162661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("\nENC_CONFIG: DB-Mode: %ld, alpha: %ld, Beta: %ld\n",
162761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dbkfilter.db_mode, dbkfilter.slicealpha_offset,
162861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dbkfilter.slicebeta_offset);
162961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
163061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("\nENC_CONFIG: IntraMB/Frame: %ld, HEC: %ld, IDR Period: %ld\n",
163161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            intra_refresh.mbcount, hec.header_extension, idrperiod.idrperiod);
163261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
163361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
163461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
16352e277fbebd51de1d4f029f7950ed2a98731177dcArun Menonbool venc_dev::venc_reconfig_reqbufs()
16362e277fbebd51de1d4f029f7950ed2a98731177dcArun Menon{
16372e277fbebd51de1d4f029f7950ed2a98731177dcArun Menon    struct v4l2_requestbuffers bufreq;
16382e277fbebd51de1d4f029f7950ed2a98731177dcArun Menon
16392e277fbebd51de1d4f029f7950ed2a98731177dcArun Menon    bufreq.memory = V4L2_MEMORY_USERPTR;
16402e277fbebd51de1d4f029f7950ed2a98731177dcArun Menon    bufreq.count = m_sInput_buff_property.actualcount;
16412e277fbebd51de1d4f029f7950ed2a98731177dcArun Menon    bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
16422e277fbebd51de1d4f029f7950ed2a98731177dcArun Menon    if(ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq)) {
16432e277fbebd51de1d4f029f7950ed2a98731177dcArun Menon            DEBUG_PRINT_ERROR("\n VIDIOC_REQBUFS OUTPUT_MPLANE Failed when resume\n");
16442e277fbebd51de1d4f029f7950ed2a98731177dcArun Menon            return false;
16452e277fbebd51de1d4f029f7950ed2a98731177dcArun Menon    }
16462e277fbebd51de1d4f029f7950ed2a98731177dcArun Menon
16472e277fbebd51de1d4f029f7950ed2a98731177dcArun Menon    bufreq.memory = V4L2_MEMORY_USERPTR;
16482e277fbebd51de1d4f029f7950ed2a98731177dcArun Menon    bufreq.count = m_sOutput_buff_property.actualcount;
16492e277fbebd51de1d4f029f7950ed2a98731177dcArun Menon    bufreq.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
16502e277fbebd51de1d4f029f7950ed2a98731177dcArun Menon    if(ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq))
16512e277fbebd51de1d4f029f7950ed2a98731177dcArun Menon    {
16522e277fbebd51de1d4f029f7950ed2a98731177dcArun Menon            DEBUG_PRINT_ERROR("\nERROR: Request for setting o/p buffer count failed when resume\n");
16532e277fbebd51de1d4f029f7950ed2a98731177dcArun Menon            return false;
16542e277fbebd51de1d4f029f7950ed2a98731177dcArun Menon    }
16552e277fbebd51de1d4f029f7950ed2a98731177dcArun Menon    return true;
16562e277fbebd51de1d4f029f7950ed2a98731177dcArun Menon}
16572e277fbebd51de1d4f029f7950ed2a98731177dcArun Menon
165861a2c6a19dbd06a317a419623020e02056661876Praveen Chavanunsigned venc_dev::venc_flush( unsigned port)
165961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
166061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_encoder_cmd enc;
166161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("in %s", __func__);
166261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
166361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    enc.cmd = V4L2_ENC_QCOM_CMD_FLUSH;
166461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    enc.flags = V4L2_QCOM_CMD_FLUSH_OUTPUT | V4L2_QCOM_CMD_FLUSH_CAPTURE;
166561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
166661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(m_nDriver_fd, VIDIOC_ENCODER_CMD, &enc)) {
166761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n Flush Port (%d) Failed ", port);
166861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return -1;
166961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
167061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
167161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return 0;
167261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
167361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
167461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
167561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan//allocating I/P memory from pmem and register with the device
167661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
167761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
167861a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_use_buf(void *buf_addr, unsigned port,unsigned index)
167961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
168061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
168161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct pmem *pmem_tmp;
168261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer buf;
168361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_plane plane[VIDEO_MAX_PLANES];
168461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = 0, extra_idx;
168561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
168661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_tmp = (struct pmem *)buf_addr;
168761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n venc_use_buf:: pmem_tmp = %p", pmem_tmp);
168861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
168961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == PORT_INDEX_IN) {
169061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.index = index;
169161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
169261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.memory = V4L2_MEMORY_USERPTR;
169361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].length = pmem_tmp->size;
169461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].m.userptr = (unsigned long)pmem_tmp->buffer;
169561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].reserved[0] = pmem_tmp->fd;
169661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].reserved[1] = 0;
169761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].data_offset = pmem_tmp->offset;
169861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.m.planes = plane;
169961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.length = 1;
170061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
170161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(m_nDriver_fd, VIDIOC_PREPARE_BUF, &buf);
170261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
170361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc)
170461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("VIDIOC_PREPARE_BUF Failed\n");
170561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (port == PORT_INDEX_OUT) {
170661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        extra_idx = EXTRADATA_IDX(num_planes);
170761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
170861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((num_planes > 1) && (extra_idx)) {
170961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            rc = allocate_extradata();
171061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
171161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (rc)
171261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Failed to allocate extradata: %d\n", rc);
171361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
171461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
171561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.index = index;
171661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
171761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.memory = V4L2_MEMORY_USERPTR;
171861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].length = pmem_tmp->size;
171961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].m.userptr = (unsigned long)pmem_tmp->buffer;
172061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].reserved[0] = pmem_tmp->fd;
172161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].reserved[1] = 0;
172261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].data_offset = pmem_tmp->offset;
172361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.m.planes = plane;
172461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.length = num_planes;
172561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
172661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
172761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].length = extradata_info.buffer_size;
172861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].m.userptr = (unsigned long) (extradata_info.uaddr + index * extradata_info.buffer_size);
172961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef USE_ION
173061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].reserved[0] = extradata_info.ion.fd_ion_data.fd;
173161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
173261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].reserved[1] = extradata_info.buffer_size * index;
173361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].data_offset = 0;
173461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if  (extra_idx >= VIDEO_MAX_PLANES) {
173561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d\n", extra_idx);
173661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
173761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
173861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
173961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(m_nDriver_fd, VIDIOC_PREPARE_BUF, &buf);
174061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
174161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc)
174261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("VIDIOC_PREPARE_BUF Failed\n");
174361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
174461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nERROR: venc_use_buf:Invalid Port Index ");
174561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
174661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
174761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
174861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
174961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
175061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
175161a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_free_buf(void *buf_addr, unsigned port)
175261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
175361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct pmem *pmem_tmp;
175461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_bufferpayload dev_buffer;
175561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
175661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&dev_buffer, 0, sizeof(dev_buffer));
175761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_tmp = (struct pmem *)buf_addr;
175861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
175961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == PORT_INDEX_IN) {
176061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
176161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.fd  = pmem_tmp->fd;
176261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.maped_size = pmem_tmp->size;
176361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.sz = pmem_tmp->size;
176461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.offset = pmem_tmp->offset;
176561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n venc_free_buf:pbuffer = %x,fd = %x, offset = %d, maped_size = %d", \
176661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                dev_buffer.pbuffer, \
176761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                dev_buffer.fd, \
176861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                dev_buffer.offset, \
176961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                dev_buffer.maped_size);
177061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
177161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (port == PORT_INDEX_OUT) {
177261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
177361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.fd  = pmem_tmp->fd;
177461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.sz = pmem_tmp->size;
177561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.maped_size = pmem_tmp->size;
177661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.offset = pmem_tmp->offset;
177761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
177861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n venc_free_buf:pbuffer = %x,fd = %x, offset = %d, maped_size = %d", \
177961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                dev_buffer.pbuffer, \
178061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                dev_buffer.fd, \
178161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                dev_buffer.offset, \
178261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                dev_buffer.maped_size);
178361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
178461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nERROR: venc_free_buf:Invalid Port Index ");
178561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
178661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
178761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
178861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
178961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
179061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
1791c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavanbool venc_dev::venc_color_align(OMX_BUFFERHEADERTYPE *buffer,
1792c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan        OMX_U32 width, OMX_U32 height)
1793c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan{
1794c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan    OMX_U32 y_stride = VENUS_Y_STRIDE(COLOR_FMT_NV12, width),
1795c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan            y_scanlines = VENUS_Y_SCANLINES(COLOR_FMT_NV12, height),
1796c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan            uv_stride = VENUS_UV_STRIDE(COLOR_FMT_NV12, width),
1797c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan            uv_scanlines = VENUS_UV_SCANLINES(COLOR_FMT_NV12, height),
1798c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan            src_chroma_offset = width * height;
1799c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan
1800c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan    if (buffer->nAllocLen >= VENUS_BUFFER_SIZE(COLOR_FMT_NV12, width, height)) {
1801c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan        OMX_U8* src_buf = buffer->pBuffer, *dst_buf = buffer->pBuffer;
1802c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan        //Do chroma first, so that we can convert it in-place
1803c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan        src_buf += width * height;
1804c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan        dst_buf += y_stride * y_scanlines;
1805c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan        for (int line = height / 2 - 1; line >= 0; --line) {
1806c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan            memmove(dst_buf + line * uv_stride,
1807c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan                    src_buf + line * width,
1808c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan                    width);
1809c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan        }
1810c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan
1811c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan        dst_buf = src_buf = buffer->pBuffer;
1812c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan        //Copy the Y next
1813c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan        for (int line = height - 1; line > 0; --line) {
1814c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan            memmove(dst_buf + line * y_stride,
1815c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan                    src_buf + line * width,
1816c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan                    width);
1817c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan        }
1818c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan    } else {
1819c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan        DEBUG_PRINT_ERROR("Failed to align Chroma. from %u to %u : \
1820c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan                Insufficient bufferLen=%u v/s Required=%u",
1821c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan                (width*height), src_chroma_offset, buffer->nAllocLen,
1822c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan                VENUS_BUFFER_SIZE(COLOR_FMT_NV12, width, height));
1823c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan        return false;
1824c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan    }
1825c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan
1826c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan    return true;
1827c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan}
1828c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan
182961a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_empty_buf(void *buffer, void *pmem_data_buf, unsigned index, unsigned fd)
183061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
183161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct pmem *temp_buffer;
183261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer buf;
183361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_plane plane;
183461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc=0;
183561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct OMX_BUFFERHEADERTYPE *bufhdr;
183661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    encoder_media_buffer_type * meta_buf = NULL;
183761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    temp_buffer = (struct pmem *)buffer;
183861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
183961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset (&buf, 0, sizeof(buf));
184061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset (&plane, 0, sizeof(plane));
184161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
184261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer == NULL) {
184361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nERROR: venc_etb: buffer is NULL");
184461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
184561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
184661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
184761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bufhdr = (OMX_BUFFERHEADERTYPE *)buffer;
184861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
184961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n Input buffer length %d",bufhdr->nFilledLen);
185061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
185161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (pmem_data_buf) {
185261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Internal PMEM addr for i/p Heap UseBuf: %p", pmem_data_buf);
185361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.m.userptr = (unsigned long)pmem_data_buf;
185461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.data_offset = bufhdr->nOffset;
185561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.length = bufhdr->nAllocLen;
185661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.bytesused = bufhdr->nFilledLen;
185761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
18589ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan        // --------------------------------------------------------------------------------------
18599ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan        // [Usage]             [metadatamode] [Type]        [color_format] [Where is buffer info]
18609ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan        // ---------------------------------------------------------------------------------------
18619ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan        // Camera-2              1            CameraSource   0              meta-handle
18629ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan        // Camera-3              1            GrallocSource  0              gralloc-private-handle
18639ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan        // surface encode (RBG)  1            GrallocSource  1              bufhdr (color-converted)
18649ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan        // CPU (Eg: MediaCodec)  0            --             0              bufhdr
18659ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan        // ---------------------------------------------------------------------------------------
18669ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan        if (metadatamode) {
186756dd7e53ba5657987bd527fa996a7942da01ef63Praveen Chavan            plane.m.userptr = index;
186861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            meta_buf = (encoder_media_buffer_type *)bufhdr->pBuffer;
186961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
187056dd7e53ba5657987bd527fa996a7942da01ef63Praveen Chavan            if (!meta_buf) {
187156dd7e53ba5657987bd527fa996a7942da01ef63Praveen Chavan                //empty EOS buffer
187256dd7e53ba5657987bd527fa996a7942da01ef63Praveen Chavan                if (!bufhdr->nFilledLen && (bufhdr->nFlags & OMX_BUFFERFLAG_EOS)) {
187356dd7e53ba5657987bd527fa996a7942da01ef63Praveen Chavan                    plane.data_offset = bufhdr->nOffset;
187456dd7e53ba5657987bd527fa996a7942da01ef63Praveen Chavan                    plane.length = bufhdr->nAllocLen;
187556dd7e53ba5657987bd527fa996a7942da01ef63Praveen Chavan                    plane.bytesused = bufhdr->nFilledLen;
187656dd7e53ba5657987bd527fa996a7942da01ef63Praveen Chavan                    DEBUG_PRINT_LOW("venc_empty_buf: empty EOS buffer");
187756dd7e53ba5657987bd527fa996a7942da01ef63Praveen Chavan                } else {
187856dd7e53ba5657987bd527fa996a7942da01ef63Praveen Chavan                    return false;
187956dd7e53ba5657987bd527fa996a7942da01ef63Praveen Chavan                }
188056dd7e53ba5657987bd527fa996a7942da01ef63Praveen Chavan            } else if (!color_format) {
18819ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan                if (meta_buf->buffer_type == kMetadataBufferTypeCameraSource) {
18829ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan                    plane.data_offset = meta_buf->meta_handle->data[1];
18839ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan                    plane.length = meta_buf->meta_handle->data[2];
18849ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan                    plane.bytesused = meta_buf->meta_handle->data[2];
18859ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan                    DEBUG_PRINT_LOW("venc_empty_buf: camera buf: fd = %d filled %d of %d",
18869ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan                            fd, plane.bytesused, plane.length);
18879ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan                } else if (meta_buf->buffer_type == kMetadataBufferTypeGrallocSource) {
18889ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan                    private_handle_t *handle = (private_handle_t *)meta_buf->meta_handle;
18899ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan                    fd = handle->fd;
18909ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan                    plane.data_offset = 0;
18919ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan                    plane.length = handle->size;
18929ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan                    plane.bytesused = handle->size;
189356dd7e53ba5657987bd527fa996a7942da01ef63Praveen Chavan                        DEBUG_PRINT_LOW("venc_empty_buf: Opaque camera buf: fd = %d "
189456dd7e53ba5657987bd527fa996a7942da01ef63Praveen Chavan                                ": filled %d of %d", fd, plane.bytesused, plane.length);
18959ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan                }
18963b9a58e7b41e80902a651d1d551255dac9d260d3Praveen Chavan            } else {
18979ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan                plane.data_offset = bufhdr->nOffset;
18989ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan                plane.length = bufhdr->nAllocLen;
18999ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan                plane.bytesused = bufhdr->nFilledLen;
190056dd7e53ba5657987bd527fa996a7942da01ef63Praveen Chavan                DEBUG_PRINT_LOW("venc_empty_buf: Opaque non-camera buf: fd = %d "
190156dd7e53ba5657987bd527fa996a7942da01ef63Praveen Chavan                        ": filled %d of %d", fd, plane.bytesused, plane.length);
19023b9a58e7b41e80902a651d1d551255dac9d260d3Praveen Chavan            }
19039ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan        } else {
190461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane.data_offset = bufhdr->nOffset;
190561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane.length = bufhdr->nAllocLen;
190661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane.bytesused = bufhdr->nFilledLen;
19079ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan            DEBUG_PRINT_LOW("venc_empty_buf: non-camera buf: fd = %d filled %d of %d",
19089ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan                    fd, plane.bytesused, plane.length);
190961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
191061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
191161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
191261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.index = index;
191361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
191461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.memory = V4L2_MEMORY_USERPTR;
191561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane.reserved[0] = fd;
191661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane.reserved[1] = 0;
191761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.m.planes = &plane;
191861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.length = 1;
191961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
192061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (bufhdr->nFlags & OMX_BUFFERFLAG_EOS)
192161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.flags = V4L2_BUF_FLAG_EOS;
192261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
192361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.timestamp.tv_sec = bufhdr->nTimeStamp / 1000000;
192461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.timestamp.tv_usec = (bufhdr->nTimeStamp % 1000000);
192561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(m_nDriver_fd, VIDIOC_QBUF, &buf);
192661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
192761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
192861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to qbuf (etb) to driver");
192961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
193061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
193161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
193261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    etb++;
193361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
193461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!streaming[OUTPUT_PORT]) {
193561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        enum v4l2_buf_type buf_type;
193661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
193761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int ret;
193861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(m_nDriver_fd, VIDIOC_STREAMON, &buf_type);
193961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
194061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
194161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Failed to call streamon\n");
194261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
194361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
194461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            streaming[OUTPUT_PORT] = true;
194561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
194661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
194761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
194861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef INPUT_BUFFER_LOG
194961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int i;
195061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int stride = VENUS_Y_STRIDE(COLOR_FMT_NV12, m_sVenc_cfg.input_width);
195161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int scanlines = VENUS_Y_SCANLINES(COLOR_FMT_NV12, m_sVenc_cfg.input_height);
195261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    char *temp = (char *)bufhdr->pBuffer;
195361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
195461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (i = 0; i < m_sVenc_cfg.input_height; i++) {
195561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fwrite(temp, m_sVenc_cfg.input_width, 1, inputBufferFile1);
195661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        temp += stride;
195761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
195861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
195961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    temp = (char *)bufhdr->pBuffer + (stride * scanlines);
196061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
196161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (i = 0; i < m_sVenc_cfg.input_height/2; i++) {
196261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fwrite(temp, m_sVenc_cfg.input_width, 1, inputBufferFile1);
196361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        temp += stride;
196461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
196561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
196661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
196761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
196861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
196961a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_fill_buf(void *buffer, void *pmem_data_buf,unsigned index,unsigned fd)
197061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
197161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct pmem *temp_buffer = NULL;
197261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_buffer  frameinfo;
197361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer buf;
197461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_plane plane[VIDEO_MAX_PLANES];
197561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = 0, extra_idx;
197661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct OMX_BUFFERHEADERTYPE *bufhdr;
197761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
197861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer == NULL)
197961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
198061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
198161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bufhdr = (OMX_BUFFERHEADERTYPE *)buffer;
198261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
198361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (pmem_data_buf) {
198461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Internal PMEM addr for o/p Heap UseBuf: %p", pmem_data_buf);
198561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].m.userptr = (unsigned long)pmem_data_buf;
198661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
198761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Shared PMEM addr for o/p PMEM UseBuf/AllocateBuf: %p", bufhdr->pBuffer);
198861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].m.userptr = (unsigned long)bufhdr->pBuffer;
198961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
199061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
199161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.index = index;
199261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
199361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.memory = V4L2_MEMORY_USERPTR;
199461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].length = bufhdr->nAllocLen;
199561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].bytesused = bufhdr->nFilledLen;
199661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].reserved[0] = fd;
199761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].reserved[1] = 0;
199861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].data_offset = bufhdr->nOffset;
199961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.m.planes = plane;
200061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.length = num_planes;
200161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
200261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra_idx = EXTRADATA_IDX(num_planes);
200361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
200461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
200561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].bytesused = 0;
200661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].length = extradata_info.buffer_size;
200761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].m.userptr = (unsigned long) (extradata_info.uaddr + index * extradata_info.buffer_size);
200861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef USE_ION
200961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].reserved[0] = extradata_info.ion.fd_ion_data.fd;
201061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
201161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].reserved[1] = extradata_info.buffer_size * index;
201261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].data_offset = 0;
201361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (extra_idx >= VIDEO_MAX_PLANES) {
201461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Extradata index higher than expected: %d\n", extra_idx);
201561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
201661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
201761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
201861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(m_nDriver_fd, VIDIOC_QBUF, &buf);
201961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
202061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
202161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to qbuf (ftb) to driver");
202261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
202361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
202461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
202561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ftb++;
202661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
202761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
202861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
202961a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_set_extradata(OMX_U32 extra_data)
203061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
203161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control;
203261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
203361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.value = V4L2_MPEG_VIDC_EXTRADATA_MULTISLICE_INFO;
203461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("venc_set_extradata:: %x", (int) extra_data);
203561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
203661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (multislice.mslice_mode && multislice.mslice_mode != V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE) {
203761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
203861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: Request for setting extradata failed");
203961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
204061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
204161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
204261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to set slice extradata, slice_mode "
204361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "is set to [%lu]", multislice.mslice_mode);
204461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
204561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
204661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
204761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
204861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
204961a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_set_slice_delivery_mode(OMX_U32 enable)
205061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
205161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control;
205261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
205361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (enable) {
205461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_DELIVERY_MODE;
205561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value = 1;
205661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Set slice_delivery_mode: %d", control.value);
205761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
205861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (multislice.mslice_mode == V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_MB && m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
205961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
206061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Request for setting slice delivery mode failed");
206161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return false;
206261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
206361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("Successfully set Slice delivery mode id: %d, value=%d\n", control.id, control.value);
206461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                slice_mode.enable = 1;
206561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
206661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
206761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set slice delivery mode, slice_mode [%d] "
206861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    "is not MB BASED or [%lu] is not H264 codec ", multislice.mslice_mode,
206961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_sVenc_cfg.codectype);
207061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
207161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
207261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Slice_DELIVERY_MODE not enabled\n");
207361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
207461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
207561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
207661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
207761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
207861a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_set_session_qp(OMX_U32 i_frame_qp, OMX_U32 p_frame_qp,OMX_U32 b_frame_qp)
207961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
208061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc;
208161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control;
208261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
208361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.id = V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP;
208461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.value = i_frame_qp;
208561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
208661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
208761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
208861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
208961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
209061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to set control\n");
209161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
209261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
209361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
209461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
209561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    session_qp.iframeqp = control.value;
209661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
209761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.id = V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP;
209861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.value = p_frame_qp;
209961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
210061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
210161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
210261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
210361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
210461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to set control\n");
210561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
210661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
210761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
210861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
210961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
211061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    session_qp.pframqp = control.value;
211161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
211261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((codec_profile.profile == V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) ||
211361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (codec_profile.profile == V4L2_MPEG_VIDEO_H264_PROFILE_HIGH)) {
211461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
211561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.id = V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP;
211661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value = b_frame_qp;
211761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
211861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
211961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
212061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
212161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
212261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set control\n");
212361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
212461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
212561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
212661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
212761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
212861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        session_qp.bframqp = control.value;
212961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
213061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
213161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
213261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
213361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
213461a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_set_profile_level(OMX_U32 eProfile,OMX_U32 eLevel)
213561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
213661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_profile requested_profile = {0};
213761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct ven_profilelevel requested_level = {0};
213861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned long mb_per_frame = 0;
213961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("venc_set_profile_level:: eProfile = %d, Level = %d",
214061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eProfile, eLevel);
214161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    mb_per_frame = ((m_sVenc_cfg.input_height + 15) >> 4)*
214261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ((m_sVenc_cfg.input_width + 15) >> 4);
214361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
214461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((eProfile == 0) && (eLevel == 0) && m_profile_set && m_level_set) {
214561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Profile/Level setting complete before venc_start");
214661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return true;
214761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
214861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
214961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n Validating Profile/Level from table");
215061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
215161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!venc_validate_profile_level(&eProfile, &eLevel)) {
215261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\nERROR: Profile/Level validation failed");
215361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
215461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
215561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
215661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) {
215761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("eProfile = %d, OMX_VIDEO_MPEG4ProfileSimple = %d and "
215861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "OMX_VIDEO_MPEG4ProfileAdvancedSimple = %d", eProfile,
215961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4ProfileAdvancedSimple);
216061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
216161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eProfile == OMX_VIDEO_MPEG4ProfileSimple) {
216261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            requested_profile.profile = V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE;
216361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple) {
216461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            requested_profile.profile = V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE;
216561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
216661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\nERROR: Unsupported MPEG4 profile = %u",
216761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eProfile);
216861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
216961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
217061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
217161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("eLevel = %d, OMX_VIDEO_MPEG4Level0 = %d, OMX_VIDEO_MPEG4Level1 = %d,"
217261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "OMX_VIDEO_MPEG4Level2 = %d, OMX_VIDEO_MPEG4Level3 = %d, OMX_VIDEO_MPEG4Level4 = %d,"
217361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "OMX_VIDEO_MPEG4Level5 = %d", eLevel, OMX_VIDEO_MPEG4Level0, OMX_VIDEO_MPEG4Level1,
217461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_MPEG4Level2, OMX_VIDEO_MPEG4Level3, OMX_VIDEO_MPEG4Level4, OMX_VIDEO_MPEG4Level5);
217561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
217661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (mb_per_frame >= 3600) {
217761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (requested_profile.profile == V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE)
217861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
217961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
218061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (requested_profile.profile == V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE)
218161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
218261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
218361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            switch (eLevel) {
218461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_VIDEO_MPEG4Level0:
218561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_0;
218661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
218761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_VIDEO_MPEG4Level0b:
218861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_0B;
218961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
219061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_VIDEO_MPEG4Level1:
219161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_1;
219261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
219361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_VIDEO_MPEG4Level2:
219461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_2;
219561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
219661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_VIDEO_MPEG4Level3:
219761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_3;
219861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
219961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_VIDEO_MPEG4Level4a:
220061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_4;
220161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
220261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_VIDEO_MPEG4Level5:
220361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
220461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
220561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                default:
220661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return false;
220761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    // TODO update corresponding levels for MPEG4_LEVEL_3b,MPEG4_LEVEL_6
220861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
220961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
221061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
221161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263) {
221261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
221361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (eProfile) {
221461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263ProfileBaseline:
221561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_BASELINE;
221661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
221761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263ProfileH320Coding:
221861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_H320CODING;
221961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
222061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263ProfileBackwardCompatible:
222161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_BACKWARDCOMPATIBLE;
222261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
222361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263ProfileISWV2:
222461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_ISWV2;
222561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
222661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263ProfileISWV3:
222761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_ISWV3;
222861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
222961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263ProfileHighCompression:
223061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_HIGHCOMPRESSION;
223161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
223261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263ProfileInternet:
223361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_INTERNET;
223461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
223561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263ProfileInterlace:
223661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_INTERLACE;
223761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
223861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263ProfileHighLatency:
223961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_HIGHLATENCY;
224061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
224161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default:
224261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\nERROR: Unsupported H.263 profile = %u",
224361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        requested_profile.profile);
224461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return false;
224561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
224661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
224761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        //profile level
224861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (eLevel) {
224961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263Level10:
225061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_1_0;
225161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
225261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263Level20:
225361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_2_0;
225461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
225561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263Level30:
225661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_3_0;
225761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
225861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263Level40:
225961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_4_0;
226061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
226161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263Level45:
226261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_4_5;
226361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
226461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263Level50:
226561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_5_0;
226661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
226761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263Level60:
226861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_6_0;
226961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
227061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263Level70:
227161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_7_0;
227261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
227361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default:
227461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return false;
227561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
227661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
227761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
227861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eProfile == OMX_VIDEO_AVCProfileBaseline) {
227961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE;
228061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (eProfile == OMX_VIDEO_AVCProfileMain) {
228161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_MAIN;
228261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (eProfile == OMX_VIDEO_AVCProfileExtended) {
228361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED;
228461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (eProfile == OMX_VIDEO_AVCProfileHigh) {
228561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH;
228661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (eProfile == OMX_VIDEO_AVCProfileHigh10) {
228761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10;
228861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (eProfile == OMX_VIDEO_AVCProfileHigh422) {
228961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422;
229061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (eProfile == OMX_VIDEO_AVCProfileHigh444) {
229161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE;
229261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
229361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\nERROR: Unsupported H.264 profile = %u",
229461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    requested_profile.profile);
229561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
229661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
229761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
229861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        //profile level
229961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (eLevel) {
230061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel1:
230161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_0;
230261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
230361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel1b:
230461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1B;
230561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
230661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel11:
230761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_1;
230861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
230961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel12:
231061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_2;
231161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
231261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel13:
231361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_3;
231461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
231561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel2:
231661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_2_0;
231761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
231861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel21:
231961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_2_1;
232061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
232161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel22:
232261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_2_2;
232361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
232461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel3:
232561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_3_0;
232661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
232761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel31:
232861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_3_1;
232961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
233061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel32:
233161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_3_2;
233261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
233361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel4:
233461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_4_0;
233561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
233661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel41:
233761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_4_1;
233861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
233961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel42:
234061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_4_2;
234161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
234261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel5:
234361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_5_0;
234461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
234561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel51:
234661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_5_1;
234761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
234861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default :
234961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("\nERROR: Unsupported H.264 level= %lu",
235061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        requested_level.level);
235161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return false;
235261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
235361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
23547beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8) {
23557beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        if (!(eProfile == OMX_VIDEO_VP8ProfileMain)) {
23567beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            DEBUG_PRINT_ERROR("\nERROR: Unsupported VP8 profile = %u",
23577beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                        eProfile);
23587beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            return false;
23597beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        }
23607beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_VP8_UNUSED;
23617beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        m_profile_set = true;
23627beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        switch(eLevel) {
23637beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            case OMX_VIDEO_VP8Level_Version0:
23647beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                requested_level.level = V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_0;
23657beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                break;
23667beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            case OMX_VIDEO_VP8Level_Version1:
23677beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                requested_level.level = V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_1;
23687beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                break;
23697beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            default:
23707beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                DEBUG_PRINT_ERROR("\nERROR: Unsupported VP8 level= %lu",
23717beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                            eLevel);
23727beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                return false;
23737beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                break;
23747beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        }
237561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
237661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
237761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_profile_set) {
237861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int rc;
237961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct v4l2_control control;
238061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
238161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
238261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDEO_H264_PROFILE;
238361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) {
238461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE;
238561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263) {
238661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_H263_PROFILE;
238761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
238861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\n Wrong CODEC \n");
238961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
239061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
239161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
239261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value = requested_profile.profile;
239361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
239461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
239561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
239661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
239761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
239861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set control\n");
239961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
240061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
240161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
240261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
240361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
240461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_profile.profile = control.value;
240561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_profile_set = true;
240661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
240761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
240861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_level_set) {
240961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int rc;
241061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct v4l2_control control;
241161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
241261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
241361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDEO_H264_LEVEL;
241461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) {
241561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL;
241661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263) {
241761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_H263_LEVEL;
24187beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8) {
24197beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            control.id = V4L2_CID_MPEG_VIDC_VIDEO_VP8_PROFILE_LEVEL;
242061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
242161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\n Wrong CODEC \n");
242261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
242361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
242461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
242561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value = requested_level.level;
242661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
242761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
242861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
242961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
243061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
243161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set control\n");
243261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
243361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
243461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
243561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
243661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
243761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        profile_level.level = control.value;
243861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_level_set = true;
243961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
244061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
244161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
244261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
244361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
244461a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_set_voptiming_cfg( OMX_U32 TimeIncRes)
244561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
244661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
244761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_voptimingcfg vop_timing_cfg;
244861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
244961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n venc_set_voptiming_cfg: TimeRes = %u",
245061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            TimeIncRes);
245161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
245261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    vop_timing_cfg.voptime_resolution = TimeIncRes;
245361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
245461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    voptimecfg.voptime_resolution = vop_timing_cfg.voptime_resolution;
245561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
245661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
245761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
245861a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_set_intra_period(OMX_U32 nPFrames, OMX_U32 nBFrames)
245961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
246061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
246161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n venc_set_intra_period: nPFrames = %u",
246261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nPFrames);
246361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc;
246461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control;
246561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
246661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((codec_profile.profile != V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE) &&
246761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (codec_profile.profile != V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) &&
246861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (codec_profile.profile != V4L2_MPEG_VIDEO_H264_PROFILE_HIGH)) {
246961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nBFrames=0;
247061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
247161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
247261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_P_FRAMES;
247361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.value = nPFrames;
247461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
247561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
247661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
247761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
247861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to set control\n");
247961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
248061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
248161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
248261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
248361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
248461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    intra_period.num_pframes = control.value;
248561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_B_FRAMES;
248661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.value = nBFrames;
248761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
248861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
248961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
249061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
249161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to set control\n");
249261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
249361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
249461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
249561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
249661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
249761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
249861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    intra_period.num_bframes = control.value;
249961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
250061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
250161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.id = V4L2_CID_MPEG_VIDC_VIDEO_IDR_PERIOD;
250261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value = 1;
250361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
250461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
250561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
250661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
250761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set control\n");
250861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
250961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
251061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
251161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        idrperiod.idrperiod = 1;
251261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
251361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
251461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
251561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
251661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
251761a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_set_idr_period(OMX_U32 nPFrames, OMX_U32 nIDRPeriod)
251861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
251961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = 0;
252061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control;
252161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n venc_set_idr_period: nPFrames = %u, nIDRPeriod: %u\n",
252261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nPFrames, nIDRPeriod);
252361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
252461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_sVenc_cfg.codectype != V4L2_PIX_FMT_H264) {
252561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nERROR: IDR period valid for H264 only!!");
252661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
252761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
252861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
252961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (venc_set_intra_period (nPFrames, intra_period.num_bframes) == false) {
253061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
253161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
253261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
253361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
253461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    intra_period.num_pframes = nPFrames;
253561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.id = V4L2_CID_MPEG_VIDC_VIDEO_IDR_PERIOD;
253661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.value = nIDRPeriod;
253761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
253861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
253961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
254061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
254161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to set control\n");
254261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
254361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
254461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
254561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    idrperiod.idrperiod = nIDRPeriod;
254661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
254761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
254861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
254961a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_set_entropy_config(OMX_BOOL enable, OMX_U32 i_cabac_level)
255061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
255161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = 0;
255261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control;
255361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
255461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n venc_set_entropy_config: CABAC = %u level: %u", enable, i_cabac_level);
255561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
255661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (enable &&(codec_profile.profile != V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE)) {
255761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
255861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value = V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC;
255961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.id = V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE;
256061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
256161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
256261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
256361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
256461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
256561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set control\n");
256661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
256761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
256861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
256961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
257061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        entropy.longentropysel = control.value;
257161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
257261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (i_cabac_level == 0) {
257361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_0;
257461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (i_cabac_level == 1) {
257561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_1;
257661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (i_cabac_level == 2) {
257761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_2;
257861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
257961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
258061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.id = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL;
258161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        //control.value = entropy_cfg.cabacmodel;
258261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
258361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
258461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
258561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
258661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set control\n");
258761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
258861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
258961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
259061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
25912e277fbebd51de1d4f029f7950ed2a98731177dcArun Menon        entropy.cabacmodel=control.value;
259261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!enable) {
259361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value =  V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC;
259461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.id = V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE;
259561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
259661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
259761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
259861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
259961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set control\n");
260061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
260161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
260261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
260361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
260461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        entropy.longentropysel=control.value;
260561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
260661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nInvalid Entropy mode for Baseline Profile");
260761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
260861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
260961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
261061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
261161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
261261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
261361a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_set_multislice_cfg(OMX_INDEXTYPE Codec, OMX_U32 nSlicesize) // MB
261461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
261561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc;
261661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control;
261761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
261861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
261961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((Codec != OMX_IndexParamVideoH263)  && (nSlicesize)) {
262061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value =  V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_MB;
262161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
262261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value =  V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE;
262361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
262461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
262561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE;
262661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
262761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
262861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
262961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
263061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to set control\n");
263161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
263261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
26336eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
263461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
263561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    multislice.mslice_mode=control.value;
26366eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
263761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (multislice.mslice_mode!=V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE) {
263861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
263961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB;
264061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value = nSlicesize;
264161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Calling SLICE_MB IOCTL set control for id=%d, val=%d\n", control.id, control.value);
264261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
264361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
264461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
264561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set control\n");
264661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
264761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
264861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
264961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
265061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice.mslice_size=control.value;
265161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
265261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
265361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
265461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
2655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
265761a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_set_intra_refresh(OMX_VIDEO_INTRAREFRESHTYPE ir_mode, OMX_U32 irMBs)
2658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
265961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
266061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc;
266161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control_mode,control_mbs;
266261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control_mode.id = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_MODE;
266361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
266461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // There is no disabled mode.  Disabled mode is indicated by a 0 count.
266561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (irMBs == 0 || ir_mode == OMX_VIDEO_IntraRefreshMax) {
266661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_NONE;
266761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return status;
266861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if ((ir_mode == OMX_VIDEO_IntraRefreshCyclic) &&
266961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (irMBs < ((m_sVenc_cfg.input_width * m_sVenc_cfg.input_height)>>8))) {
267061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_CYCLIC;
267161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control_mbs.id=V4L2_CID_MPEG_VIDC_VIDEO_CIR_MBS;
267261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control_mbs.value=irMBs;
267361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if ((ir_mode == OMX_VIDEO_IntraRefreshAdaptive) &&
267461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (irMBs < ((m_sVenc_cfg.input_width * m_sVenc_cfg.input_height)>>8))) {
267561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_ADAPTIVE;
267661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control_mbs.id=V4L2_CID_MPEG_VIDC_VIDEO_AIR_MBS;
267761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control_mbs.value=irMBs;
267861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if ((ir_mode == OMX_VIDEO_IntraRefreshBoth) &&
267961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (irMBs < ((m_sVenc_cfg.input_width * m_sVenc_cfg.input_height)>>8))) {
268061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_CYCLIC_ADAPTIVE;
268161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
268261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nERROR: Invalid IntraRefresh Parameters:"
268361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "mb count: %lu, mb mode:%d", irMBs, ir_mode);
268461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
268561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
268761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%lu, val=%lu\n", control_mode.id, control_mode.value);
268861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control_mode);
2689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
269061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
269161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to set control\n");
269261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
269361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
269561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control_mode.id, control_mode.value);
2696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
269761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control_mbs.id, control_mbs.value);
269861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control_mbs);
2699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
270061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
270161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to set control\n");
270261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
270361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
270561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control_mbs.id, control_mbs.value);
2706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
270761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    intra_refresh.irmode = control_mode.value;
270861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    intra_refresh.mbcount = control_mbs.value;
2709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
271061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
2711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
271361a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_set_error_resilience(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* error_resilience)
2714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
271561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
271661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_headerextension hec_cfg;
271761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_multiclicecfg multislice_cfg;
271861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc;
271961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control;
2720b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand
272161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&control, 0, sizeof(control));
2722dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
272361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) {
272461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (error_resilience->bEnableHEC) {
272561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            hec_cfg.header_extension = 1;
272661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
272761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            hec_cfg.header_extension = 0;
272861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
27296eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
273061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        hec.header_extension = error_resilience->bEnableHEC;
273161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
273361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (error_resilience->bEnableRVLC) {
273461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n RVLC is not Supported");
273561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
273661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
273861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (( m_sVenc_cfg.codectype != V4L2_PIX_FMT_H263) &&
273961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (error_resilience->bEnableDataPartitioning)) {
274061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n DataPartioning are not Supported for MPEG4/H264");
274161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
274261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
274461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (( m_sVenc_cfg.codectype != V4L2_PIX_FMT_H263) &&
274561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (error_resilience->nResynchMarkerSpacing)) {
274661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice_cfg.mslice_mode = VEN_MSLICE_CNT_BYTE;
274761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice_cfg.mslice_size = error_resilience->nResynchMarkerSpacing;
274861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE;
274961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value = V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_BYTES;
275061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263 &&
275161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            error_resilience->bEnableDataPartitioning) {
275261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice_cfg.mslice_mode = VEN_MSLICE_GOB;
275361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice_cfg.mslice_size = error_resilience->nResynchMarkerSpacing;
275461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE;
275561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value = V4L2_MPEG_VIDEO_MULTI_SLICE_GOB;
275661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
275761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice_cfg.mslice_mode = VEN_MSLICE_OFF;
275861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice_cfg.mslice_size = 0;
275961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE;
276061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value =  V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE;
276161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
276361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n %s(): mode = %u, size = %u", __func__,
276461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            multislice_cfg.mslice_mode, multislice_cfg.mslice_size);
276561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    printf("Calling IOCTL set control for id=%x, val=%d\n", control.id, control.value);
276661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
276861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
276961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        printf("Failed to set Slice mode control\n");
277061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
277161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
277361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    printf("Success IOCTL set control for id=%x, value=%d\n", control.id, control.value);
277461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    multislice.mslice_mode=control.value;
2775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
277661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES;
277761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.value = error_resilience->nResynchMarkerSpacing;
277861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    printf("Calling IOCTL set control for id=%x, val=%d\n", control.id, control.value);
277961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
278161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
278261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        printf("Failed to set MAX MB control\n");
278361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
278461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
278661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    printf("Success IOCTL set control for id=%x, value=%d\n", control.id, control.value);
278761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    multislice.mslice_mode = multislice_cfg.mslice_mode;
278861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    multislice.mslice_size = multislice_cfg.mslice_size;
278961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
27906eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
2791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
279261a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_set_inloop_filter(OMX_VIDEO_AVCLOOPFILTERTYPE loopfilter)
27936eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
279461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc;
279561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control;
279661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.id=V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE;
279761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
279861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (loopfilter == OMX_VIDEO_AVCLoopFilterEnable) {
279961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value=V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_ENABLED;
280061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (loopfilter == OMX_VIDEO_AVCLoopFilterDisable) {
280161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value=V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED;
280261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (loopfilter == OMX_VIDEO_AVCLoopFilterDisableSliceBoundary) {
280361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value=V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED_AT_SLICE_BOUNDARY;
280461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
280661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
280761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
280961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
2810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return false;
281161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
281361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
2814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
281561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    dbkfilter.db_mode=control.value;
2816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
281761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.id=V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA;
281861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.value=0;
2819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
282061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
282161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
282361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
282461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
282561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
282761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
282861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.id=V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA;
282961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.value=0;
283061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
283161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
283361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
283461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
283561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2836826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
283761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
2838826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
283961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
284061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    dbkfilter.slicealpha_offset = dbkfilter.slicebeta_offset = 0;
284161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
2842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2843826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
284461a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_set_target_bitrate(OMX_U32 nTargetBitrate, OMX_U32 config)
2845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
284661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n venc_set_target_bitrate: bitrate = %u",
284761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nTargetBitrate);
284861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control;
284961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = 0;
285061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.id = V4L2_CID_MPEG_VIDEO_BITRATE;
285161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.value = nTargetBitrate;
285261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
285361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
285461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
285561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
285661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
285761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to set control\n");
285861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
285961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2860826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
286161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
28626eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
2863826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
286461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.targetbitrate = control.value;
286561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bitrate.target_bitrate = control.value;
2866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
286761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!config) {
286861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_level_set = false;
2869826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
287061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (venc_set_profile_level(0, 0)) {
287161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_HIGH("Calling set level (Bitrate) with %lu\n",profile_level.level);
287261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
287361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
287461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
287561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
2876826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2877826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2878826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_encode_framerate(OMX_U32 encode_framerate, OMX_U32 config)
2879826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
288061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_streamparm parm;
288161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = 0;
288261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_framerate frame_rate_cfg;
288361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    Q16ToFraction(encode_framerate,frame_rate_cfg.fps_numerator,frame_rate_cfg.fps_denominator);
288461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    parm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
288561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    parm.parm.output.timeperframe.numerator = frame_rate_cfg.fps_denominator;
288661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    parm.parm.output.timeperframe.denominator = frame_rate_cfg.fps_numerator;
288761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
288861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (frame_rate_cfg.fps_numerator > 0)
288961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(m_nDriver_fd, VIDIOC_S_PARM, &parm);
289061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
289161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
289261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for setting framerate failed\n");
289361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
289461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
289561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
289661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.fps_den = frame_rate_cfg.fps_denominator;
289761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.fps_num = frame_rate_cfg.fps_numerator;
289861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
289961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!config) {
290061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_level_set = false;
290161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
290261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (venc_set_profile_level(0, 0)) {
290361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_HIGH("Calling set level (Framerate) with %lu\n",profile_level.level);
290461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
290561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
290661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
290761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
2908826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2909826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_color_format(OMX_COLOR_FORMATTYPE color_format)
2911826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
291261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_format fmt;
291361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n venc_set_color_format: color_format = %u ", color_format);
291461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
29150b6fd256ee76a3fbbfcd4a33c63be88b1db78798Praveen Chavan    if (color_format == OMX_COLOR_FormatYUV420SemiPlanar ||
29160b6fd256ee76a3fbbfcd4a33c63be88b1db78798Praveen Chavan            color_format == QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m) {
291761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sVenc_cfg.inputformat = V4L2_PIX_FMT_NV12;
291861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (color_format == QOMX_COLOR_FormatYVU420SemiPlanar) {
291961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sVenc_cfg.inputformat = V4L2_PIX_FMT_NV21;
292061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
292161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nWARNING: Unsupported Color format [%d]", color_format);
292261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sVenc_cfg.inputformat = V4L2_PIX_FMT_NV12;
292361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("\n Default color format YUV420SemiPlanar is set");
292461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
292561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
292661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
292761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.inputformat;
292861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
292961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
293061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
293161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt)) {
293261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed setting color format %x", color_format);
293361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
293461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
293561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
293661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
2937826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2938826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2939826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_intra_vop_refresh(OMX_BOOL intra_vop_refresh)
2940826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
294161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n venc_set_intra_vop_refresh: intra_vop = %uc", intra_vop_refresh);
294261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
294361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (intra_vop_refresh == OMX_TRUE) {
294461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct v4l2_control control;
294561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int rc;
294661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.id = V4L2_CID_MPEG_VIDC_VIDEO_REQUEST_IFRAME;
294761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value = 1;
294861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        printf("Calling IOCTL set control for id=%x, val=%d\n", control.id, control.value);
294961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
295061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
295161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
295261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            printf("Failed to set Intra Frame Request control\n");
295361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
295461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
295561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
295661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        printf("Success IOCTL set control for id=%x, value=%d\n", control.id, control.value);
295761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
295861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nERROR: VOP Refresh is False, no effect");
295961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
296061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
296161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
2962826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2963826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_ratectrl_cfg(OMX_VIDEO_CONTROLRATETYPE eControlRate)
2965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
296661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
296761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control;
296861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = 0;
296961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.id = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL;
297061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
297161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch (eControlRate) {
297261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_Video_ControlRateDisable:
297361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_OFF;
297461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
297561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_Video_ControlRateVariableSkipFrames:
297661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_VBR_VFR;
297761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
297861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_Video_ControlRateVariable:
297961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_VBR_CFR;
298061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
298161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_Video_ControlRateConstantSkipFrames:
298261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_CBR_VFR;
298361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
298461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_Video_ControlRateConstant:
298561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_CBR_CFR;
298661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
298761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
298861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = false;
298961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
299061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
299161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
299261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (status) {
299361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
299461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
299561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
299661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
299761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
299861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set control\n");
299961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
300061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
300161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
300261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
300361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
300461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rate_ctrl.rcmode = control.value;
300561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
300661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
300761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
3008826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3009826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3010826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_get_profile_level(OMX_U32 *eProfile,OMX_U32 *eLevel)
3011826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
301261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
301361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
301461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eProfile == NULL || eLevel == NULL) {
301561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
301661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
301761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
301861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) {
301961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (codec_profile.profile) {
302061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE:
302161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
302261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
302361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE:
302461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
302561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
302661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default:
302761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_MPEG4ProfileMax;
302861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                status = false;
302961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
303061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
303161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
303261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!status) {
303361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return status;
303461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
303561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
303661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        //profile level
303761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (profile_level.level) {
303861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_MPEG4_LEVEL_0:
303961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_MPEG4Level0;
304061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
304161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_MPEG4_LEVEL_0B:
304261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_MPEG4Level0b;
304361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
304461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_MPEG4_LEVEL_1:
304561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_MPEG4Level1;
304661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
304761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_MPEG4_LEVEL_2:
304861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_MPEG4Level2;
304961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
305061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_MPEG4_LEVEL_3:
305161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_MPEG4Level3;
305261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
305361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_MPEG4_LEVEL_4:
305461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_MPEG4Level4;
305561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
305661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_MPEG4_LEVEL_5:
305761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_MPEG4Level5;
305861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
305961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default:
306061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_MPEG4LevelMax;
306161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                status =  false;
306261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
306361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
306461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263) {
306561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (codec_profile.profile == VEN_PROFILE_H263_BASELINE) {
306661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            *eProfile = OMX_VIDEO_H263ProfileBaseline;
306761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
306861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            *eProfile = OMX_VIDEO_H263ProfileMax;
306961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
307061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
307161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
307261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (profile_level.level) {
307361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H263_10:
307461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263Level10;
307561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
307661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H263_20:
307761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263Level20;
307861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
307961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H263_30:
308061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263Level30;
308161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
308261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H263_40:
308361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263Level40;
308461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
308561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H263_45:
308661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263Level45;
308761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
308861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H263_50:
308961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263Level50;
309061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
309161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H263_60:
309261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263Level60;
309361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
309461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H263_70:
309561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263Level70;
309661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
309761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default:
309861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263LevelMax;
309961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                status = false;
310061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
310161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
310261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
310361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (codec_profile.profile) {
310461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
310561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_AVCProfileBaseline;
310661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
310761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
310861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_AVCProfileMain;
310961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
311061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
311161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_AVCProfileHigh;
311261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
311361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED:
311461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_AVCProfileExtended;
311561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
311661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10:
311761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_AVCProfileHigh10;
311861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
311961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422:
312061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_AVCProfileHigh422;
312161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
312261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE:
312361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_AVCProfileHigh444;
312461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
312561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default:
312661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_AVCProfileMax;
312761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                status = false;
312861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
312961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
313061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
313161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!status) {
313261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return status;
313361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
313461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
313561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (profile_level.level) {
313661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_LEVEL_1_0:
313761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel1;
313861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
313961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_LEVEL_1B:
314061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel1b;
314161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
314261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_LEVEL_1_1:
314361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel11;
314461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
314561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_LEVEL_1_2:
314661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel12;
314761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
314861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_LEVEL_1_3:
314961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel13;
315061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
315161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_LEVEL_2_0:
315261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel2;
315361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
315461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_LEVEL_2_1:
315561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel21;
315661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
315761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_LEVEL_2_2:
315861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel22;
315961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
316061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_LEVEL_3_0:
316161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel3;
316261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
316361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_LEVEL_3_1:
316461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel31;
316561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
316661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_LEVEL_3_2:
316761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel32;
316861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
316961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_LEVEL_4_0:
317061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel4;
317161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
317261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_LEVEL_4_1:
317361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel41;
317461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
317561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_LEVEL_4_2:
317661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel42;
317761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
317861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_LEVEL_5_0:
317961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel5;
318061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
318161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_LEVEL_5_1:
318261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel51;
318361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
318461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default :
318561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevelMax;
318661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                status = false;
318761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
318861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
318961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
31907beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano    else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8) {
31917beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        switch (codec_profile.profile) {
31927beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            case V4L2_MPEG_VIDC_VIDEO_VP8_UNUSED:
31937beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                *eProfile = OMX_VIDEO_VP8ProfileMain;
31947beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                break;
31957beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            default:
31967beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                *eProfile = OMX_VIDEO_VP8ProfileMax;
31977beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                status = false;
31987beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                break;
31997beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        }
32007beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        if (!status) {
32017beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            return status;
32027beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        }
32037beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano
32047beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        switch (profile_level.level) {
32057beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            case V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_0:
32067beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                *eLevel = OMX_VIDEO_VP8Level_Version0;
32077beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                break;
32087beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            case V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_1:
32097beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                *eLevel = OMX_VIDEO_VP8Level_Version1;
32107beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                break;
32117beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            default:
32127beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                *eLevel = OMX_VIDEO_VP8LevelMax;
32137beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                status = false;
32147beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                break;
32157beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        }
32167beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano    }
321761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
321861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
3219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_validate_profile_level(OMX_U32 *eProfile, OMX_U32 *eLevel)
3222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
322361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 new_profile = 0, new_level = 0;
322461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned const int *profile_tbl = NULL;
322561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 mb_per_frame, mb_per_sec;
322661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool profile_level_found = false;
322761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
322861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n Init profile table for respective codec");
322961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
323061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //validate the ht,width,fps,bitrate and set the appropriate profile and level
323161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) {
323261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eProfile == 0) {
323361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!m_profile_set) {
323461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
323561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
323661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                switch (codec_profile.profile) {
323761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    case V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE:
323861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        *eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
323961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
324061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    case V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE:
324161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
324261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
324361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    default:
324461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_LOW("\n %s(): Unknown Error", __func__);
324561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
324661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
324761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
3248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
324961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
325061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eLevel == 0 && !m_level_set) {
325161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            *eLevel = OMX_VIDEO_MPEG4LevelMax;
325261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
325361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
325461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eProfile == OMX_VIDEO_MPEG4ProfileSimple) {
325561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_tbl = (unsigned int const *)mpeg4_profile_level_table;
325661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (*eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple) {
325761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_tbl = (unsigned int const *)
325861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (&mpeg4_profile_level_table[MPEG4_ASP_START]);
325961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
326061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n Unsupported MPEG4 profile type %lu", *eProfile);
3261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return false;
3262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
326361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
326461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eProfile == 0) {
326561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!m_profile_set) {
326661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_AVCProfileBaseline;
326761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
326861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                switch (codec_profile.profile) {
326961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
327061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        *eProfile = OMX_VIDEO_AVCProfileBaseline;
327161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
327261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
327361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        *eProfile = OMX_VIDEO_AVCProfileMain;
327461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
327561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    case V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED:
327661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        *eProfile = OMX_VIDEO_AVCProfileExtended;
327761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
327861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
327961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        *eProfile = OMX_VIDEO_AVCProfileHigh;
328061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
328161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10:
328261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        *eProfile = OMX_VIDEO_AVCProfileHigh10;
328361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
328461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422:
328561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        *eProfile = OMX_VIDEO_AVCProfileHigh422;
328661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
328761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE:
328861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        *eProfile = OMX_VIDEO_AVCProfileHigh444;
328961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
329061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    default:
329161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_LOW("\n %s(): Unknown Error", __func__);
329261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
329361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
329461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
329561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
329661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
329761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eLevel == 0 && !m_level_set) {
329861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            *eLevel = OMX_VIDEO_AVCLevelMax;
329961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
330061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
330161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eProfile == OMX_VIDEO_AVCProfileBaseline) {
330261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_tbl = (unsigned int const *)h264_profile_level_table;
330361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (*eProfile == OMX_VIDEO_AVCProfileHigh) {
330461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_tbl = (unsigned int const *)
330561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (&h264_profile_level_table[H264_HP_START]);
330661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (*eProfile == OMX_VIDEO_AVCProfileMain) {
330761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_tbl = (unsigned int const *)
330861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (&h264_profile_level_table[H264_MP_START]);
330961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
331061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n Unsupported AVC profile type %lu", *eProfile);
3311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return false;
3312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
331361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263) {
331461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eProfile == 0) {
331561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!m_profile_set) {
331661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_H263ProfileBaseline;
331761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
331861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                switch (codec_profile.profile) {
331961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    case VEN_PROFILE_H263_BASELINE:
332061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        *eProfile = OMX_VIDEO_H263ProfileBaseline;
332161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
332261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    default:
332361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_LOW("\n %s(): Unknown Error", __func__);
332461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
332561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
332661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
332761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
332861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
332961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eLevel == 0 && !m_level_set) {
333061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            *eLevel = OMX_VIDEO_H263LevelMax;
333161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
333261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
333361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eProfile == OMX_VIDEO_H263ProfileBaseline) {
333461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_tbl = (unsigned int const *)h263_profile_level_table;
333561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
333661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n Unsupported H.263 profile type %lu", *eProfile);
3337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return false;
333861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
333961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8) {
33407beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        if (*eProfile == 0) {
33417beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            *eProfile = OMX_VIDEO_VP8ProfileMain;
33427beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        } else {
33437beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            switch (codec_profile.profile) {
33447beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                case V4L2_MPEG_VIDC_VIDEO_VP8_UNUSED:
33457beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                    *eProfile = OMX_VIDEO_VP8ProfileMain;
33467beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                    break;
33477beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                default:
33487beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                    DEBUG_PRINT_ERROR("\n %s(): Unknown VP8 profile", __func__);
33497beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                    return false;
33507beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            }
33517beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        }
33527beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        if (*eLevel == 0) {
33537beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            switch (profile_level.level) {
33547beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                case V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_0:
33557beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                    *eLevel = OMX_VIDEO_VP8Level_Version0;
33567beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                    break;
33577beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                case V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_1:
33587beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                    *eLevel = OMX_VIDEO_VP8Level_Version1;
33597beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                    break;
33607beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                default:
33617beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                    DEBUG_PRINT_ERROR("\n %s(): Unknown VP8 level", __func__);
33627beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                    return false;
33637beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            }
33647beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        }
336561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return true;
336661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
336761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Invalid codec type");
3368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return false;
336961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
337061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
337161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    mb_per_frame = ((m_sVenc_cfg.input_height + 15) >> 4)*
337261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ((m_sVenc_cfg.input_width + 15)>> 4);
337361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
337461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((mb_per_frame >= 3600) && (m_sVenc_cfg.codectype == (unsigned long) V4L2_PIX_FMT_MPEG4)) {
337561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (codec_profile.profile == (unsigned long) V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE)
337661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
337761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
337861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (codec_profile.profile == (unsigned long) V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE)
337961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
338061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
3381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
338261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            new_level = profile_level.level;
338361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            new_profile = codec_profile.profile;
338461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return true;
338561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
338661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
338761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
338861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    mb_per_sec = mb_per_frame * m_sVenc_cfg.fps_num / m_sVenc_cfg.fps_den;
338961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
339061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    do {
339161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (mb_per_frame <= (unsigned int)profile_tbl[0]) {
339261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (mb_per_sec <= (unsigned int)profile_tbl[1]) {
339361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_sVenc_cfg.targetbitrate <= (unsigned int)profile_tbl[2]) {
339461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    new_level = (int)profile_tbl[3];
339561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    new_profile = (int)profile_tbl[4];
339661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    profile_level_found = true;
339761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_LOW("\n Appropriate profile/level found %d/%d\n", new_profile, new_level);
339861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
339961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
340061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
340161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
340261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
340361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        profile_tbl = profile_tbl + 5;
340461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } while (profile_tbl[0] != 0);
340561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
340661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (profile_level_found != true) {
340761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n ERROR: Unsupported profile/level\n");
340861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
340961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
341061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
341161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((*eLevel == OMX_VIDEO_MPEG4LevelMax) || (*eLevel == OMX_VIDEO_AVCLevelMax)
34127beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            || (*eLevel == OMX_VIDEO_H263LevelMax || (*eLevel == OMX_VIDEO_VP8ProfileMax))) {
341361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *eLevel = new_level;
341461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
341561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
34167beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano    DEBUG_PRINT_LOW("%s: Returning with eProfile = %lu\n"
341761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            "Level = %lu", __func__, *eProfile, *eLevel);
341861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
341961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
3420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_
3422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_meta_mode(bool mode)
3423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
342461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    metadatamode = 1;
342561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
3426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
34286eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
34296eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool venc_dev::venc_is_video_session_supported(unsigned long width,
343061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned long height)
34316eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
343261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((width * height < capability.min_width *  capability.min_height) ||
343361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (width * height > capability.max_width *  capability.max_height)) {
343461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR(
343561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "Unsupported video resolution WxH = (%d)x(%d) supported range = min (%d)x(%d) - max (%d)x(%d)\n",
343661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                width, height, capability.min_width, capability.min_height,
343761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                capability.max_width, capability.max_height);
343861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
343961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
344061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
344161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n video session supported\n");
344261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
34436eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
3444