video_encoder_device_v4l2.cpp revision 9051a9833db84a4dad38adebc94fdb0861ae3b94
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
68061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    metadatamode = 0;
68161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
68261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.id = V4L2_CID_MPEG_VIDEO_HEADER_MODE;
68361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.value = V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE;
68461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
68561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Calling IOCTL to disable seq_hdr in sync_frame id=%d, val=%d\n", control.id, control.value);
68661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
68761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control))
68861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to set control\n");
68961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
69061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_frmsizeenum frmsize;
69161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
69261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //Get the hardware capabilities
69361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset((void *)&frmsize,0,sizeof(frmsize));
69461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frmsize.index = 0;
69561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    frmsize.pixel_format = m_sVenc_cfg.codectype;
69661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ret = ioctl(m_nDriver_fd, VIDIOC_ENUM_FRAMESIZES, &frmsize);
69761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
69861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ret || frmsize.type != V4L2_FRMSIZE_TYPE_STEPWISE) {
69961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to get framesizes\n");
70061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
70161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
70261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
70361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (frmsize.type == V4L2_FRMSIZE_TYPE_STEPWISE) {
70461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        capability.min_width = frmsize.stepwise.min_width;
70561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        capability.max_width = frmsize.stepwise.max_width;
70661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        capability.min_height = frmsize.stepwise.min_height;
70761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        capability.max_height = frmsize.stepwise.max_height;
70861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
70961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
71061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
7136eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
7146eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalstatic OMX_ERRORTYPE unsubscribe_to_events(int fd)
7156eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
71661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_ERRORTYPE eRet = OMX_ErrorNone;
71761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_event_subscription sub;
71861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int array_sz = sizeof(event_type)/sizeof(int);
71961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int i,rc;
72061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
72161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (fd < 0) {
72261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        printf("Invalid input: %d\n", fd);
72361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return OMX_ErrorBadParameter;
72461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
72561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
72661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (i = 0; i < array_sz; ++i) {
72761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        memset(&sub, 0, sizeof(sub));
72861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        sub.type = event_type[i];
72961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
73061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
73161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
73261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            printf("Failed to unsubscribe event: 0x%x\n", sub.type);
73361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
73461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
73561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
73661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
73761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return eRet;
7386eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
7396eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid venc_dev::venc_close()
741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
74261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_encoder_cmd enc;
74361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\nvenc_close: fd = %d", m_nDriver_fd);
74461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
74561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((int)m_nDriver_fd >= 0) {
74661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        enc.cmd = V4L2_ENC_CMD_STOP;
74761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ioctl(m_nDriver_fd, VIDIOC_ENCODER_CMD, &enc);
74861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("venc_close E\n");
74961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
75061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (async_thread_created)
75161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            pthread_join(m_tid,NULL);
75261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
75361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("venc_close X\n");
75461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsubscribe_to_events(m_nDriver_fd);
75561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        close(m_nDriver_fd);
75661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_nDriver_fd = -1;
75761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
75861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef INPUT_BUFFER_LOG
76061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fclose (inputBufferFile1);
761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef OUTPUT_BUFFER_LOG
76361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fclose (outputBufferFile1);
764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_buf_req(unsigned long *min_buff_count,
76861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned long *actual_buff_count,
76961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned long *buff_size,
77061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned long port)
771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
7726eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
77361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned long temp_count = 0;
774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
77561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == 0) {
77661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*actual_buff_count > m_sInput_buff_property.mincount) {
77761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            temp_count = m_sInput_buff_property.actualcount;
77861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_sInput_buff_property.actualcount = *actual_buff_count;
77961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n I/P Count set to %lu\n", *actual_buff_count);
78061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
78161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
78261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*actual_buff_count > m_sOutput_buff_property.mincount) {
78361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            temp_count = m_sOutput_buff_property.actualcount;
78461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_sOutput_buff_property.actualcount = *actual_buff_count;
78561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n O/P Count set to %lu\n", *actual_buff_count);
78661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
78961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_loaded_start()
794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
79561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_loaded_stop()
799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
80061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_loaded_start_done()
804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
80561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_loaded_stop_done()
809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
81061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_get_seq_hdr(void *buffer,
81461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned buffer_size, unsigned *header_len)
815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
81661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_get_buf_req(unsigned long *min_buff_count,
82061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned long *actual_buff_count,
82161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned long *buff_size,
82261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned long port)
823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
82461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_format fmt;
82561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_requestbuffers bufreq;
82661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned int buf_size = 0, extra_data_size = 0, client_extra_data_size = 0;
82761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int ret;
82861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
82961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == 0) {
83061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
83161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
83261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
83361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV12;
83461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(m_nDriver_fd, VIDIOC_G_FMT, &fmt);
83561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sInput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
83661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.memory = V4L2_MEMORY_USERPTR;
83761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
83861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*actual_buff_count)
83961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufreq.count = *actual_buff_count;
84061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        else
84161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufreq.count = 2;
842826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
84361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
84461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq);
845826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
84661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
84761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\n VIDIOC_REQBUFS OUTPUT_MPLANE Failed \n ");
84861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
849826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
85061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
85161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sInput_buff_property.mincount = m_sInput_buff_property.actualcount = bufreq.count;
85261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *min_buff_count = m_sInput_buff_property.mincount;
85361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *actual_buff_count = m_sInput_buff_property.actualcount;
85461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef USE_ION
85561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // For ION memory allocations of the allocated buffer size
85661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // must be 4k aligned, hence aligning the input buffer
85761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        // size to 4k.
85861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sInput_buff_property.datasize = (m_sInput_buff_property.datasize + 4095) & (~4095);
85961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
86061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *buff_size = m_sInput_buff_property.datasize;
86161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
86261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int extra_idx = 0;
86361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
86461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
86561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
86661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.codectype;
86761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
86861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt);
86961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sOutput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
87061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
87161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
87261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
87361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.codectype;
87461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
87561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(m_nDriver_fd, VIDIOC_G_FMT, &fmt);
87661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sOutput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
87761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.memory = V4L2_MEMORY_USERPTR;
87861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
87961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*actual_buff_count)
88061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufreq.count = *actual_buff_count;
881826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
88261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bufreq.count = 2;
883826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
88461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
88561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq);
886826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
88761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
88861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\n VIDIOC_REQBUFS CAPTURE_MPLANE Failed \n ");
88961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
890826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
89161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
89261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sOutput_buff_property.mincount = m_sOutput_buff_property.actualcount = bufreq.count;
89361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *min_buff_count = m_sOutput_buff_property.mincount;
89461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *actual_buff_count = m_sOutput_buff_property.actualcount;
89561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *buff_size = m_sOutput_buff_property.datasize;
89661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        num_planes = fmt.fmt.pix_mp.num_planes;
89761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        extra_idx = EXTRADATA_IDX(num_planes);
89861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
89961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
90061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            extra_data_size =  fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage;
90161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (extra_idx >= VIDEO_MAX_PLANES) {
90261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d\n", extra_idx);
90361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
904826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
905826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
90661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        extradata_info.buffer_size = extra_data_size;
90761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        extradata_info.count = m_sOutput_buff_property.actualcount;
90861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        extradata_info.size = extradata_info.buffer_size * extradata_info.count;
90961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
910826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
91161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
912826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
913826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
91461a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_set_param(void *paramData,OMX_INDEXTYPE index )
915826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
91661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("venc_set_param:: venc-720p\n");
91761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_format fmt;
91861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_requestbuffers bufreq;
91961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int ret;
920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
92161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch (index) {
92261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamPortDefinition:
92361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
92461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
92561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
92661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamPortDefinition\n");
927826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
92861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (portDefn->nPortIndex == PORT_INDEX_IN) {
92961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_encode_framerate(portDefn->format.video.xFramerate, 0)) {
93061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
93161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
9326eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
93361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_color_format(portDefn->format.video.eColorFormat)) {
93461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
93561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
93661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
93761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (m_sVenc_cfg.input_height != portDefn->format.video.nFrameHeight ||
93861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            m_sVenc_cfg.input_width != portDefn->format.video.nFrameWidth) {
93961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_LOW("\n Basic parameter has changed");
94061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_sVenc_cfg.input_height = portDefn->format.video.nFrameHeight;
94161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_sVenc_cfg.input_width = portDefn->format.video.nFrameWidth;
94261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
94361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
94461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
94561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV12;
94661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
94761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt)) {
94861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("\n VIDIOC_S_FMT OUTPUT_MPLANE Failed \n ");
94961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            return false;
95061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
951826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
95261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_sInput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
95361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        bufreq.memory = V4L2_MEMORY_USERPTR;
95461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        bufreq.count = portDefn->nBufferCountActual;
95561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
95661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
95761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq)) {
95861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("\n VIDIOC_REQBUFS OUTPUT_MPLANE Failed \n ");
95961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            return false;
96061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
96161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
96261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (bufreq.count == portDefn->nBufferCountActual)
96361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            m_sInput_buff_property.mincount = m_sInput_buff_property.actualcount = bufreq.count;
96461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
96561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (portDefn->nBufferCountActual >= m_sInput_buff_property.mincount)
96661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            m_sInput_buff_property.actualcount = portDefn->nBufferCountActual;
96761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
96861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
96961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_LOW("input: actual: %d, min: %d, count_req: %d\n",
97061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            portDefn->nBufferCountActual, m_sInput_buff_property.mincount, bufreq.count);
97161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (portDefn->nPortIndex == PORT_INDEX_OUT) {
97261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
97361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
97461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
97561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.codectype;
97661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
97761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt)) {
97861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\n VIDIOC_S_FMT CAPTURE_MPLANE Failed \n ");
97961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
98061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
98161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
98261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_sOutput_buff_property.datasize = fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
98361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
98461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_target_bitrate(portDefn->format.video.nBitrate, 0)) {
98561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
98661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
98761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
98861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if ((portDefn->nBufferCountActual >= m_sOutput_buff_property.mincount)
98961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            && (m_sOutput_buff_property.datasize == portDefn->nBufferSize)) {
99061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        m_sOutput_buff_property.actualcount = portDefn->nBufferCountActual;
99161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        bufreq.memory = V4L2_MEMORY_USERPTR;
99261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        bufreq.count = portDefn->nBufferCountActual;
99361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        bufreq.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
99461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
99561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq)) {
99661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            DEBUG_PRINT_ERROR("\nERROR: Request for setting o/p buffer count failed: requested: %lu, current: %lu",
99761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                    portDefn->nBufferCountActual, m_sOutput_buff_property.actualcount);
99861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            return false;
99961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
100061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
100161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (bufreq.count == portDefn->nBufferCountActual)
100261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            m_sOutput_buff_property.mincount = m_sOutput_buff_property.actualcount = bufreq.count;
100361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
100461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (portDefn->nBufferCountActual >= m_sOutput_buff_property.mincount)
100561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            m_sOutput_buff_property.actualcount = portDefn->nBufferCountActual;
100661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
100761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (num_planes > 1)
100861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            extradata_info.count = m_sOutput_buff_property.actualcount;
100961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
101061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Setting Output buffer requirements failed");
101161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
101261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
101361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
101461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_LOW("Output: actual: %d, min: %d, count_req: %d\n",
101561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            portDefn->nBufferCountActual, m_sOutput_buff_property.mincount, bufreq.count);
101661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
101761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamPortDefinition");
101861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
101961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
102061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
102161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
102261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoPortFormat:
102361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
102461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt;
102561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                portFmt =(OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
102661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoPortFormat\n");
102761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
102861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (portFmt->nPortIndex == (OMX_U32) PORT_INDEX_IN) {
102961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_color_format(portFmt->eColorFormat)) {
103061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
103161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
103261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else if (portFmt->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
103361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_encode_framerate(portFmt->xFramerate, 0)) {
103461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
103561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
103661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
103761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoPortFormat");
103861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
103961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
104061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
104161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
104261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoBitrate:
104361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
104461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_BITRATETYPE* pParam;
104561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pParam = (OMX_VIDEO_PARAM_BITRATETYPE*)paramData;
104661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoBitrate\n");
104761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
104861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
104961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_target_bitrate(pParam->nTargetBitrate, 0)) {
105061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Target Bit Rate setting failed");
105161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
105261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
105361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
105461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_ratectrl_cfg(pParam->eControlRate)) {
105561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Rate Control setting failed");
105661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
105761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
105861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
105961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoBitrate");
106061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
106161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
106261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
106361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
106461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoMpeg4:
106561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
106661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_MPEG4TYPE* pParam;
106761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_U32 bFrames = 0;
106861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
106961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                pParam = (OMX_VIDEO_PARAM_MPEG4TYPE*)paramData;
107061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoMpeg4\n");
107161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
107261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
107361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_voptiming_cfg(pParam->nTimeIncRes)) {
107461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Request for setting vop_timing failed");
107561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
107661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
107761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
107861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_profile_set = false;
107961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_level_set = false;
108061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
108161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_profile_level (pParam->eProfile, pParam->eLevel)) {
108261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating Profile and level");
108361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
108461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
108561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (pParam->eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple) {
108661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (pParam->nBFrames) {
108761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
108861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                bFrames = 1;
108961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
109061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
109161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (pParam->nBFrames) {
109261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                DEBUG_PRINT_ERROR("Warning: B frames not supported\n");
109361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                bFrames = 0;
109461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
109561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
109661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
109761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
109861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_intra_period (pParam->nPFrames,bFrames)) {
109961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
110061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
110161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
110261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
110361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_multislice_cfg(OMX_IndexParamVideoMpeg4,pParam->nSliceHeaderSpacing)) {
110461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating slice_config");
110561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
110661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
110761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
110861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoMpeg4");
110961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
111061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
111161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
111261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
111361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoH263:
111461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
111561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_H263TYPE* pParam = (OMX_VIDEO_PARAM_H263TYPE*)paramData;
111661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoH263\n");
111761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_U32 bFrames = 0;
111861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
111961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
112061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_profile_set = false;
112161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_level_set = false;
112261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
112361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_profile_level (pParam->eProfile, pParam->eLevel)) {
112461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating Profile and level");
112561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
112661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
112761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
112861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (pParam->nBFrames)
112961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nWARNING: B frame not supported for H.263");
113061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
113161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_intra_period (pParam->nPFrames, bFrames) == false) {
113261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
113361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
113461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
113561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
113661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoH263");
113761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
113861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
113961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
114061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
114161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoAvc:
114261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
114361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoAvc\n");
114461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_AVCTYPE* pParam = (OMX_VIDEO_PARAM_AVCTYPE*)paramData;
114561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_U32 bFrames = 0;
114661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
114761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
114861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_LOW("pParam->eProfile :%d ,pParam->eLevel %d\n",
114961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            pParam->eProfile,pParam->eLevel);
115061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
115161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_profile_set = false;
115261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_level_set = false;
115361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
115461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_profile_level (pParam->eProfile,pParam->eLevel)) {
115561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating Profile and level %d, %d",
115661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                pParam->eProfile, pParam->eLevel);
115761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
115861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    } else {
115961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        if (pParam->eProfile != OMX_VIDEO_AVCProfileBaseline) {
116061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (pParam->nBFrames) {
116161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                DEBUG_PRINT_HIGH("INFO: Only 1 Bframe is supported");
116261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                bFrames = 1;
116361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
116461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        } else {
116561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            if (pParam->nBFrames) {
116661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                DEBUG_PRINT_ERROR("Warning: B frames not supported\n");
116761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                bFrames = 0;
116861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            }
116961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        }
117061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
117161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
117261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_intra_period (pParam->nPFrames, bFrames)) {
117361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
117461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
117561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
117661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
117761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_entropy_config (pParam->bEntropyCodingCABAC, pParam->nCabacInitIdc)) {
117861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Request for setting Entropy failed");
117961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
118061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
118161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
118261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_inloop_filter (pParam->eLoopFilterMode)) {
118361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Request for setting Inloop filter failed");
118461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
118561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
118661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
118761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_multislice_cfg(OMX_IndexParamVideoAvc, pParam->nSliceHeaderSpacing)) {
118861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nWARNING: Unsuccessful in updating slice_config");
118961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
119061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
119161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
119261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoAvc");
119361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
119461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
119561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                //TBD, lot of other variables to be updated, yet to decide
119661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
119761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
11987beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        case (OMX_INDEXTYPE)OMX_IndexParamVideoVp8:
11997beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            {
12007beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoVp8\n");
12017beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                OMX_VIDEO_PARAM_VP8TYPE* pParam = (OMX_VIDEO_PARAM_VP8TYPE*)paramData;
12027beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                if (!venc_set_profile_level (pParam->eProfile, pParam->eLevel)) {
12037beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                    DEBUG_PRINT_ERROR("\nERROR: Unsuccessful in updating Profile and level %d, %d",
12047beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                                        pParam->eProfile, pParam->eLevel);
12057beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                    return false;
12067beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                }
12077beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                break;
12087beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            }
120961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoIntraRefresh:
121061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
121161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoIntraRefresh\n");
121261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_INTRAREFRESHTYPE *intra_refresh =
121361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_VIDEO_PARAM_INTRAREFRESHTYPE *)paramData;
121461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
121561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (intra_refresh->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
121661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_intra_refresh(intra_refresh->eRefreshMode, intra_refresh->nCirMBs) == false) {
121761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Setting Intra refresh failed");
121861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
121961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
122061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
122161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoIntraRefresh");
122261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
122361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
122461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
122561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
122661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoErrorCorrection:
122761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
122861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoErrorCorrection\n");
122961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *error_resilience =
123061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)paramData;
123161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
123261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (error_resilience->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
123361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_error_resilience(error_resilience) == false) {
123461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Setting Intra refresh failed");
123561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
123661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
123761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
123861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoErrorCorrection");
123961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
124061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
124161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
124261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
124361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoProfileLevelCurrent:
124461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
124561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoProfileLevelCurrent\n");
124661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_PROFILELEVELTYPE *profile_level =
124761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData;
124861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
124961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (profile_level->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
125061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_profile_set = false;
125161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_level_set = false;
125261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
125361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (!venc_set_profile_level (profile_level->eProfile,
125461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                profile_level->eLevel)) {
125561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nWARNING: Unsuccessful in updating Profile and level");
125661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
125761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
125861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
125961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoProfileLevelCurrent");
126061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
126161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
126261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
126361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
126461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoQuantization:
126561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
126661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoQuantization\n");
126761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_PARAM_QUANTIZATIONTYPE *session_qp =
126861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (OMX_VIDEO_PARAM_QUANTIZATIONTYPE *)paramData;
126961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
127061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (session_qp->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
127161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_session_qp (session_qp->nQpI,
127261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                session_qp->nQpP,
127361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                                session_qp->nQpB) == false) {
127461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Setting Session QP failed");
127561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
127661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
127761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
127861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexParamVideoQuantization");
127961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
128061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
128161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
128261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
128361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_QcomIndexEnableSliceDeliveryMode:
128461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
128561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_EXTNINDEX_PARAMTYPE* pParam =
128661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (QOMX_EXTNINDEX_PARAMTYPE*)paramData;
128761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
128861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (pParam->nPortIndex == PORT_INDEX_OUT) {
128961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_slice_delivery_mode(pParam->bEnable) == false) {
129061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("Setting slice delivery mode failed");
129161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return OMX_ErrorUnsupportedSetting;
129261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
129361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
129461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("OMX_QcomIndexEnableSliceDeliveryMode "
129561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            "called on wrong port(%d)", pParam->nPortIndex);
129661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return OMX_ErrorBadPortIndex;
129761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
129861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
129961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
130061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
130161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_ExtraDataVideoEncoderSliceInfo:
130261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
130361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param: OMX_ExtraDataVideoEncoderSliceInfo");
130461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_U32 extra_data = *(OMX_U32 *)paramData;
130561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
130661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (venc_set_extradata(extra_data) == false) {
130761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Setting "
130861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            "OMX_ExtraDataVideoEncoderSliceInfo failed");
130961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return false;
131061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
131161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
131261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                extradata = true;
131361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
131461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
131561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexParamVideoSliceFMO:
131661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
131761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\nERROR: Unsupported parameter in venc_set_param: %u",
131861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    index);
131961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
132061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            //case
132161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
132261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
132361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
132461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
132561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
132661a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_set_config(void *configData, OMX_INDEXTYPE index)
132761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
132861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
132961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n Inside venc_set_config");
133061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
133161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch (index) {
133261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexConfigVideoBitrate:
133361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
133461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_CONFIG_BITRATETYPE *bit_rate = (OMX_VIDEO_CONFIG_BITRATETYPE *)
133561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    configData;
133661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\n venc_set_config: OMX_IndexConfigVideoBitrate");
133761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
133861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (bit_rate->nPortIndex == (OMX_U32)PORT_INDEX_OUT) {
133961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_target_bitrate(bit_rate->nEncodeBitrate, 1) == false) {
134061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Setting Target Bit rate failed");
134161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
134261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
134361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
134461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexConfigVideoBitrate");
134561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
134661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
134761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
134861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
134961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexConfigVideoFramerate:
135061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
135161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_CONFIG_FRAMERATETYPE *frame_rate = (OMX_CONFIG_FRAMERATETYPE *)
135261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    configData;
135361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\n venc_set_config: OMX_IndexConfigVideoFramerate");
135461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
135561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (frame_rate->nPortIndex == (OMX_U32)PORT_INDEX_OUT) {
135661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_encode_framerate(frame_rate->xEncodeFramerate, 1) == false) {
135761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Setting Encode Framerate failed");
135861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
135961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
136061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
136161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexConfigVideoFramerate");
136261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
136361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
136461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
136561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
136661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case QOMX_IndexConfigVideoIntraperiod:
136761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
136861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param:QOMX_IndexConfigVideoIntraperiod\n");
136961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                QOMX_VIDEO_INTRAPERIODTYPE *intraperiod =
137061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    (QOMX_VIDEO_INTRAPERIODTYPE *)configData;
137161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
137261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (intraperiod->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
137361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_intra_period(intraperiod->nPFrames, intraperiod->nBFrames) == false) {
137461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
137561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
137661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
137761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
137861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
137961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
138061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
138161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexConfigVideoIntraVOPRefresh:
138261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
138361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_CONFIG_INTRAREFRESHVOPTYPE *intra_vop_refresh = (OMX_CONFIG_INTRAREFRESHVOPTYPE *)
138461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    configData;
138561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\n venc_set_config: OMX_IndexConfigVideoIntraVOPRefresh");
138661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
138761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (intra_vop_refresh->nPortIndex == (OMX_U32)PORT_INDEX_OUT) {
138861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    if (venc_set_intra_vop_refresh(intra_vop_refresh->IntraRefreshVOP) == false) {
138961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_ERROR("\nERROR: Setting Encode Framerate failed");
139061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
139161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    }
139261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                } else {
139361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: Invalid Port Index for OMX_IndexConfigVideoFramerate");
139461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
139561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
139661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
139761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
139861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexConfigCommonRotate:
139961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
140061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_CONFIG_ROTATIONTYPE *config_rotation =
140161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    reinterpret_cast<OMX_CONFIG_ROTATIONTYPE*>(configData);
140261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_U32 nFrameWidth;
140361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
140461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_HIGH("\nvenc_set_config: updating the new Dims");
140561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                nFrameWidth = m_sVenc_cfg.input_width;
140661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_sVenc_cfg.input_width  = m_sVenc_cfg.input_height;
140761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                m_sVenc_cfg.input_height = nFrameWidth;
140861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
140961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (/*ioctl (m_nDriver_fd,VEN_IOCTL_SET_BASE_CFG,(void*)&ioctl_msg) < */0) {
141061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("\nERROR: Dimension Change for Rotation failed");
141161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return false;
141261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
141361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
141461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
141561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
141661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_IndexConfigVideoAVCIntraPeriod:
141761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            {
141861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_CONFIG_AVCINTRAPERIOD *avc_iperiod = (OMX_VIDEO_CONFIG_AVCINTRAPERIOD*) configData;
141961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexConfigVideoAVCIntraPeriod");
142061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
142161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (venc_set_idr_period(avc_iperiod->nPFrames, avc_iperiod->nIDRPeriod)
142261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        == false) {
142361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_ERROR("ERROR: Setting "
142461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                            "OMX_IndexConfigVideoAVCIntraPeriod failed");
142561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return false;
142661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
142761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
142861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
142961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
143061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
143161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\n Unsupported config index = %u", index);
143261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
143361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
143461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
143561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
143661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
143761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
143861a2c6a19dbd06a317a419623020e02056661876Praveen Chavanunsigned venc_dev::venc_stop( void)
143961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
144061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_msg venc_msg;
14419051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon    struct v4l2_requestbuffers bufreq;
14429051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon    int rc = 0, ret = 0;
144361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
144461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!stopped) {
144561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        enum v4l2_buf_type cap_type;
144661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
144761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (streaming[OUTPUT_PORT]) {
144861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            cap_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
144961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            rc = ioctl(m_nDriver_fd, VIDIOC_STREAMOFF, &cap_type);
145061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
145161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (rc) {
145261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Failed to call streamoff on driver: capability: %d, %d\n",
145361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        cap_type, rc);
145461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else
145561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                streaming[OUTPUT_PORT] = false;
14569051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon
14579051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon            DEBUG_PRINT_LOW("Releasing registered buffers from driver on o/p port");
14589051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon            bufreq.memory = V4L2_MEMORY_USERPTR;
14599051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon            bufreq.count = 0;
14609051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon            bufreq.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
14619051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon            ret = ioctl(m_nDriver_fd, VIDIOC_REQBUFS, &bufreq);
14629051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon
14639051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon            if (ret) {
14649051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon                DEBUG_PRINT_ERROR("\nERROR: VIDIOC_REQBUFS OUTPUT MPLANE Failed \n ");
14659051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon                return false;
14669051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon            }
146761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
146861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
146961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!rc && streaming[CAPTURE_PORT]) {
147061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            cap_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
147161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            rc = ioctl(m_nDriver_fd, VIDIOC_STREAMOFF, &cap_type);
147261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
147361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (rc) {
147461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Failed to call streamoff on driver: capability: %d, %d\n",
147561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        cap_type, rc);
147661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else
147761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                streaming[CAPTURE_PORT] = false;
14789051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon
14799051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon            DEBUG_PRINT_LOW("Releasing registered buffers from driver on capture port");
14809051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon            bufreq.memory = V4L2_MEMORY_USERPTR;
14819051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon            bufreq.count = 0;
14829051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon            bufreq.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
14839051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon            ret = ioctl(m_nDriver_fd, VIDIOC_REQBUFS, &bufreq);
14849051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon
14859051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon            if (ret) {
14869051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon                DEBUG_PRINT_ERROR("\nERROR: VIDIOC_REQBUFS CAPTURE MPLANE Failed \n ");
14879051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon                return false;
14889051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon            }
148961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
149061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
14919051a9833db84a4dad38adebc94fdb0861ae3b94Arun Menon        if (!rc && !ret) {
149261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            venc_stop_done();
149361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            stopped = 1;
149461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
149561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
149661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
149761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return rc;
149861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
149961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
150061a2c6a19dbd06a317a419623020e02056661876Praveen Chavanunsigned venc_dev::venc_pause(void)
150161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
150261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&pause_resume_mlock);
150361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    paused = true;
150461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&pause_resume_mlock);
150561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return 0;
150661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
150761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
150861a2c6a19dbd06a317a419623020e02056661876Praveen Chavanunsigned venc_dev::venc_resume(void)
150961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
151061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_lock(&pause_resume_mlock);
151161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    paused = false;
151261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pthread_mutex_unlock(&pause_resume_mlock);
151361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
151461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return pthread_cond_signal(&pause_resume_cond);
151561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
151661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
151761a2c6a19dbd06a317a419623020e02056661876Praveen Chavanunsigned venc_dev::venc_start_done(void)
151861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
151961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_msg venc_msg;
152061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_msg.msgcode = VEN_MSG_START;
152161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_msg.statuscode = VEN_S_SUCCESS;
152261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_handle->async_message_process(venc_handle,&venc_msg);
152361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return 0;
152461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
1525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
1526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevunsigned venc_dev::venc_stop_done(void)
1527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
152861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_msg venc_msg;
152961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    free_extradata();
153061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_msg.msgcode=VEN_MSG_STOP;
153161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_msg.statuscode=VEN_S_SUCCESS;
153261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_handle->async_message_process(venc_handle,&venc_msg);
153361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return 0;
1534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
1535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
153661a2c6a19dbd06a317a419623020e02056661876Praveen Chavanunsigned venc_dev::venc_set_message_thread_id(pthread_t tid)
153761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
153861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    async_thread_created = true;
153961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_tid=tid;
154061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return 0;
154161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
154261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
154361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
154461a2c6a19dbd06a317a419623020e02056661876Praveen Chavanunsigned venc_dev::venc_start(void)
154561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
154661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    enum v4l2_buf_type buf_type;
154761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int ret,r;
154861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("\n %s(): Check Profile/Level set in driver before start",
154961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            __func__);
155061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
155161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!venc_set_profile_level(0, 0)) {
155261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n ERROR: %s(): Driver Profile/Level is NOT SET",
155361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                __func__);
155461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
155561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("\n %s(): Driver Profile[%lu]/Level[%lu] successfully SET",
155661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                __func__, codec_profile.profile, profile_level.level);
155761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
155861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
155961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    venc_config_print();
156061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
156161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    /* Check if slice_delivery mode is enabled & max slices is sufficient for encoding complete frame */
156261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (slice_mode.enable && multislice.mslice_size &&
156361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (m_sVenc_cfg.input_width *  m_sVenc_cfg.input_height)/(256 * multislice.mslice_size) >= MAX_SUPPORTED_SLICES_PER_FRAME) {
156461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("slice_mode: %d, max slices (%d) should be less than (%d)\n", slice_mode.enable,
156561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (m_sVenc_cfg.input_width *  m_sVenc_cfg.input_height)/(256 * multislice.mslice_size),
156661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                MAX_SUPPORTED_SLICES_PER_FRAME);
156761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return 1;
156861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
156961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
157061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
157161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing\n");
157261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ret=ioctl(m_nDriver_fd, VIDIOC_STREAMON,&buf_type);
157361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
157461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ret)
157561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return 1;
157661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
157761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    streaming[CAPTURE_PORT] = true;
1578773c10f6a275692d878cc65b05510e993c9a6c49Praveen Chavan    stopped = 0;
157961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return 0;
158061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
158161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
158261a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid venc_dev::venc_config_print()
158361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
158461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
158561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("\nENC_CONFIG: Codec: %ld, Profile %ld, level : %ld",
158661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_sVenc_cfg.codectype, codec_profile.profile, profile_level.level);
158761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
158861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("\n ENC_CONFIG: Width: %ld, Height:%ld, Fps: %ld",
158961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_sVenc_cfg.input_width, m_sVenc_cfg.input_height,
159061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            m_sVenc_cfg.fps_num/m_sVenc_cfg.fps_den);
159161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
159261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("\nENC_CONFIG: Bitrate: %ld, RC: %ld, I-Period: %ld",
159361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            bitrate.target_bitrate, rate_ctrl.rcmode, intra_period.num_pframes);
159461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
159561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("\nENC_CONFIG: qpI: %ld, qpP: %ld, qpb: %ld",
159661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            session_qp.iframeqp, session_qp.pframqp,session_qp.bframqp);
159761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
159861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("\nENC_CONFIG: VOP_Resolution: %ld, Slice-Mode: %ld, Slize_Size: %ld",
159961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            voptimecfg.voptime_resolution, multislice.mslice_mode,
160061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            multislice.mslice_size);
160161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
160261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("\nENC_CONFIG: EntropyMode: %d, CabacModel: %ld",
160361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            entropy.longentropysel, entropy.cabacmodel);
160461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
160561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("\nENC_CONFIG: DB-Mode: %ld, alpha: %ld, Beta: %ld\n",
160661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dbkfilter.db_mode, dbkfilter.slicealpha_offset,
160761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dbkfilter.slicebeta_offset);
160861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
160961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("\nENC_CONFIG: IntraMB/Frame: %ld, HEC: %ld, IDR Period: %ld\n",
161061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            intra_refresh.mbcount, hec.header_extension, idrperiod.idrperiod);
161161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
161261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
161361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
161461a2c6a19dbd06a317a419623020e02056661876Praveen Chavanunsigned venc_dev::venc_flush( unsigned port)
161561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
161661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_encoder_cmd enc;
161761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("in %s", __func__);
161861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
161961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    enc.cmd = V4L2_ENC_QCOM_CMD_FLUSH;
162061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    enc.flags = V4L2_QCOM_CMD_FLUSH_OUTPUT | V4L2_QCOM_CMD_FLUSH_CAPTURE;
162161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
162261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(m_nDriver_fd, VIDIOC_ENCODER_CMD, &enc)) {
162361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n Flush Port (%d) Failed ", port);
162461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return -1;
162561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
162661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
162761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return 0;
162861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
162961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
163061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
163161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan//allocating I/P memory from pmem and register with the device
163261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
163361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
163461a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_use_buf(void *buf_addr, unsigned port,unsigned index)
163561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
163661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
163761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct pmem *pmem_tmp;
163861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer buf;
163961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_plane plane[VIDEO_MAX_PLANES];
164061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = 0, extra_idx;
164161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
164261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_tmp = (struct pmem *)buf_addr;
164361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n venc_use_buf:: pmem_tmp = %p", pmem_tmp);
164461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
164561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == PORT_INDEX_IN) {
164661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.index = index;
164761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
164861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.memory = V4L2_MEMORY_USERPTR;
164961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].length = pmem_tmp->size;
165061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].m.userptr = (unsigned long)pmem_tmp->buffer;
165161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].reserved[0] = pmem_tmp->fd;
165261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].reserved[1] = 0;
165361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].data_offset = pmem_tmp->offset;
165461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.m.planes = plane;
165561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.length = 1;
165661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
165761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(m_nDriver_fd, VIDIOC_PREPARE_BUF, &buf);
165861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
165961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc)
166061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("VIDIOC_PREPARE_BUF Failed\n");
166161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (port == PORT_INDEX_OUT) {
166261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        extra_idx = EXTRADATA_IDX(num_planes);
166361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
166461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if ((num_planes > 1) && (extra_idx)) {
166561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            rc = allocate_extradata();
166661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
166761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (rc)
166861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Failed to allocate extradata: %d\n", rc);
166961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
167061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
167161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.index = index;
167261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
167361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.memory = V4L2_MEMORY_USERPTR;
167461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].length = pmem_tmp->size;
167561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].m.userptr = (unsigned long)pmem_tmp->buffer;
167661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].reserved[0] = pmem_tmp->fd;
167761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].reserved[1] = 0;
167861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].data_offset = pmem_tmp->offset;
167961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.m.planes = plane;
168061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.length = num_planes;
168161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
168261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
168361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].length = extradata_info.buffer_size;
168461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].m.userptr = (unsigned long) (extradata_info.uaddr + index * extradata_info.buffer_size);
168561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef USE_ION
168661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].reserved[0] = extradata_info.ion.fd_ion_data.fd;
168761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
168861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].reserved[1] = extradata_info.buffer_size * index;
168961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane[extra_idx].data_offset = 0;
169061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if  (extra_idx >= VIDEO_MAX_PLANES) {
169161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d\n", extra_idx);
169261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return OMX_ErrorBadParameter;
169361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
169461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
169561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(m_nDriver_fd, VIDIOC_PREPARE_BUF, &buf);
169661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
169761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc)
169861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("VIDIOC_PREPARE_BUF Failed\n");
169961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
170061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nERROR: venc_use_buf:Invalid Port Index ");
170161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
170261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
170361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
170461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
170561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
170661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
170761a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_free_buf(void *buf_addr, unsigned port)
170861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
170961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct pmem *pmem_tmp;
171061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_bufferpayload dev_buffer;
171161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
171261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&dev_buffer, 0, sizeof(dev_buffer));
171361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    pmem_tmp = (struct pmem *)buf_addr;
171461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
171561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (port == PORT_INDEX_IN) {
171661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
171761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.fd  = pmem_tmp->fd;
171861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.maped_size = pmem_tmp->size;
171961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.sz = pmem_tmp->size;
172061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.offset = pmem_tmp->offset;
172161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n venc_free_buf:pbuffer = %x,fd = %x, offset = %d, maped_size = %d", \
172261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                dev_buffer.pbuffer, \
172361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                dev_buffer.fd, \
172461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                dev_buffer.offset, \
172561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                dev_buffer.maped_size);
172661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
172761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (port == PORT_INDEX_OUT) {
172861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
172961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.fd  = pmem_tmp->fd;
173061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.sz = pmem_tmp->size;
173161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.maped_size = pmem_tmp->size;
173261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dev_buffer.offset = pmem_tmp->offset;
173361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
173461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n venc_free_buf:pbuffer = %x,fd = %x, offset = %d, maped_size = %d", \
173561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                dev_buffer.pbuffer, \
173661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                dev_buffer.fd, \
173761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                dev_buffer.offset, \
173861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                dev_buffer.maped_size);
173961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
174061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nERROR: venc_free_buf:Invalid Port Index ");
174161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
174261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
174361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
174461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
174561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
174661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
1747c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavanbool venc_dev::venc_color_align(OMX_BUFFERHEADERTYPE *buffer,
1748c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan        OMX_U32 width, OMX_U32 height)
1749c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan{
1750c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan    OMX_U32 y_stride = VENUS_Y_STRIDE(COLOR_FMT_NV12, width),
1751c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan            y_scanlines = VENUS_Y_SCANLINES(COLOR_FMT_NV12, height),
1752c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan            uv_stride = VENUS_UV_STRIDE(COLOR_FMT_NV12, width),
1753c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan            uv_scanlines = VENUS_UV_SCANLINES(COLOR_FMT_NV12, height),
1754c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan            src_chroma_offset = width * height;
1755c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan
1756c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan    if (buffer->nAllocLen >= VENUS_BUFFER_SIZE(COLOR_FMT_NV12, width, height)) {
1757c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan        OMX_U8* src_buf = buffer->pBuffer, *dst_buf = buffer->pBuffer;
1758c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan        //Do chroma first, so that we can convert it in-place
1759c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan        src_buf += width * height;
1760c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan        dst_buf += y_stride * y_scanlines;
1761c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan        for (int line = height / 2 - 1; line >= 0; --line) {
1762c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan            memmove(dst_buf + line * uv_stride,
1763c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan                    src_buf + line * width,
1764c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan                    width);
1765c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan        }
1766c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan
1767c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan        dst_buf = src_buf = buffer->pBuffer;
1768c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan        //Copy the Y next
1769c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan        for (int line = height - 1; line > 0; --line) {
1770c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan            memmove(dst_buf + line * y_stride,
1771c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan                    src_buf + line * width,
1772c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan                    width);
1773c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan        }
1774c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan    } else {
1775c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan        DEBUG_PRINT_ERROR("Failed to align Chroma. from %u to %u : \
1776c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan                Insufficient bufferLen=%u v/s Required=%u",
1777c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan                (width*height), src_chroma_offset, buffer->nAllocLen,
1778c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan                VENUS_BUFFER_SIZE(COLOR_FMT_NV12, width, height));
1779c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan        return false;
1780c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan    }
1781c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan
1782c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan    return true;
1783c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan}
1784c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan
178561a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_empty_buf(void *buffer, void *pmem_data_buf, unsigned index, unsigned fd)
178661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
178761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct pmem *temp_buffer;
178861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer buf;
178961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_plane plane;
179061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc=0;
179161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct OMX_BUFFERHEADERTYPE *bufhdr;
179261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    encoder_media_buffer_type * meta_buf = NULL;
179361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    temp_buffer = (struct pmem *)buffer;
179461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
179561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset (&buf, 0, sizeof(buf));
179661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset (&plane, 0, sizeof(plane));
179761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
179861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer == NULL) {
179961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nERROR: venc_etb: buffer is NULL");
180061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
180161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
180261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
180361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bufhdr = (OMX_BUFFERHEADERTYPE *)buffer;
180461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
180561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n Input buffer length %d",bufhdr->nFilledLen);
180661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
180761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (pmem_data_buf) {
180861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Internal PMEM addr for i/p Heap UseBuf: %p", pmem_data_buf);
180961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.m.userptr = (unsigned long)pmem_data_buf;
181061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.data_offset = bufhdr->nOffset;
181161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.length = bufhdr->nAllocLen;
181261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane.bytesused = bufhdr->nFilledLen;
181361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
18149ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan        // --------------------------------------------------------------------------------------
18159ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan        // [Usage]             [metadatamode] [Type]        [color_format] [Where is buffer info]
18169ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan        // ---------------------------------------------------------------------------------------
18179ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan        // Camera-2              1            CameraSource   0              meta-handle
18189ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan        // Camera-3              1            GrallocSource  0              gralloc-private-handle
18199ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan        // surface encode (RBG)  1            GrallocSource  1              bufhdr (color-converted)
18209ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan        // CPU (Eg: MediaCodec)  0            --             0              bufhdr
18219ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan        // ---------------------------------------------------------------------------------------
18229ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan        if (metadatamode) {
182356dd7e53ba5657987bd527fa996a7942da01ef63Praveen Chavan            plane.m.userptr = index;
182461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            meta_buf = (encoder_media_buffer_type *)bufhdr->pBuffer;
182561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
182656dd7e53ba5657987bd527fa996a7942da01ef63Praveen Chavan            if (!meta_buf) {
182756dd7e53ba5657987bd527fa996a7942da01ef63Praveen Chavan                //empty EOS buffer
182856dd7e53ba5657987bd527fa996a7942da01ef63Praveen Chavan                if (!bufhdr->nFilledLen && (bufhdr->nFlags & OMX_BUFFERFLAG_EOS)) {
182956dd7e53ba5657987bd527fa996a7942da01ef63Praveen Chavan                    plane.data_offset = bufhdr->nOffset;
183056dd7e53ba5657987bd527fa996a7942da01ef63Praveen Chavan                    plane.length = bufhdr->nAllocLen;
183156dd7e53ba5657987bd527fa996a7942da01ef63Praveen Chavan                    plane.bytesused = bufhdr->nFilledLen;
183256dd7e53ba5657987bd527fa996a7942da01ef63Praveen Chavan                    DEBUG_PRINT_LOW("venc_empty_buf: empty EOS buffer");
183356dd7e53ba5657987bd527fa996a7942da01ef63Praveen Chavan                } else {
183456dd7e53ba5657987bd527fa996a7942da01ef63Praveen Chavan                    return false;
183556dd7e53ba5657987bd527fa996a7942da01ef63Praveen Chavan                }
183656dd7e53ba5657987bd527fa996a7942da01ef63Praveen Chavan            } else if (!color_format) {
18379ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan                if (meta_buf->buffer_type == kMetadataBufferTypeCameraSource) {
18389ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan                    plane.data_offset = meta_buf->meta_handle->data[1];
18399ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan                    plane.length = meta_buf->meta_handle->data[2];
18409ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan                    plane.bytesused = meta_buf->meta_handle->data[2];
18419ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan                    DEBUG_PRINT_LOW("venc_empty_buf: camera buf: fd = %d filled %d of %d",
18429ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan                            fd, plane.bytesused, plane.length);
18439ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan                } else if (meta_buf->buffer_type == kMetadataBufferTypeGrallocSource) {
18449ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan                    private_handle_t *handle = (private_handle_t *)meta_buf->meta_handle;
18459ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan                    fd = handle->fd;
18469ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan                    plane.data_offset = 0;
18479ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan                    plane.length = handle->size;
18489ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan                    plane.bytesused = handle->size;
184956dd7e53ba5657987bd527fa996a7942da01ef63Praveen Chavan                        DEBUG_PRINT_LOW("venc_empty_buf: Opaque camera buf: fd = %d "
185056dd7e53ba5657987bd527fa996a7942da01ef63Praveen Chavan                                ": filled %d of %d", fd, plane.bytesused, plane.length);
18519ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan                }
18523b9a58e7b41e80902a651d1d551255dac9d260d3Praveen Chavan            } else {
18539ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan                plane.data_offset = bufhdr->nOffset;
18549ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan                plane.length = bufhdr->nAllocLen;
18559ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan                plane.bytesused = bufhdr->nFilledLen;
185656dd7e53ba5657987bd527fa996a7942da01ef63Praveen Chavan                DEBUG_PRINT_LOW("venc_empty_buf: Opaque non-camera buf: fd = %d "
185756dd7e53ba5657987bd527fa996a7942da01ef63Praveen Chavan                        ": filled %d of %d", fd, plane.bytesused, plane.length);
18583b9a58e7b41e80902a651d1d551255dac9d260d3Praveen Chavan            }
18599ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan        } else {
186061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane.data_offset = bufhdr->nOffset;
186161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane.length = bufhdr->nAllocLen;
186261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            plane.bytesused = bufhdr->nFilledLen;
18639ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan            DEBUG_PRINT_LOW("venc_empty_buf: non-camera buf: fd = %d filled %d of %d",
18649ad5c6ee7a6308393e3d11f7d51cd46004473063Praveen Chavan                    fd, plane.bytesused, plane.length);
186561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
186661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
186761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
186861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.index = index;
186961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
187061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.memory = V4L2_MEMORY_USERPTR;
187161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane.reserved[0] = fd;
187261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane.reserved[1] = 0;
187361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.m.planes = &plane;
187461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.length = 1;
187561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
187661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (bufhdr->nFlags & OMX_BUFFERFLAG_EOS)
187761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf.flags = V4L2_BUF_FLAG_EOS;
187861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
187961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.timestamp.tv_sec = bufhdr->nTimeStamp / 1000000;
188061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.timestamp.tv_usec = (bufhdr->nTimeStamp % 1000000);
188161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(m_nDriver_fd, VIDIOC_QBUF, &buf);
188261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
188361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
188461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to qbuf (etb) to driver");
188561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
188661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
188761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
188861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    etb++;
188961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
189061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!streaming[OUTPUT_PORT]) {
189161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        enum v4l2_buf_type buf_type;
189261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
189361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int ret;
189461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = ioctl(m_nDriver_fd, VIDIOC_STREAMON, &buf_type);
189561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
189661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ret) {
189761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Failed to call streamon\n");
189861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
189961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
190061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            streaming[OUTPUT_PORT] = true;
190161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
190261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
190361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
190461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef INPUT_BUFFER_LOG
190561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int i;
190661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int stride = VENUS_Y_STRIDE(COLOR_FMT_NV12, m_sVenc_cfg.input_width);
190761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int scanlines = VENUS_Y_SCANLINES(COLOR_FMT_NV12, m_sVenc_cfg.input_height);
190861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    char *temp = (char *)bufhdr->pBuffer;
190961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
191061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (i = 0; i < m_sVenc_cfg.input_height; i++) {
191161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fwrite(temp, m_sVenc_cfg.input_width, 1, inputBufferFile1);
191261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        temp += stride;
191361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
191461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
191561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    temp = (char *)bufhdr->pBuffer + (stride * scanlines);
191661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
191761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    for (i = 0; i < m_sVenc_cfg.input_height/2; i++) {
191861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        fwrite(temp, m_sVenc_cfg.input_width, 1, inputBufferFile1);
191961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        temp += stride;
192061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
192161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
192261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
192361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
192461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
192561a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_fill_buf(void *buffer, void *pmem_data_buf,unsigned index,unsigned fd)
192661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
192761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct pmem *temp_buffer = NULL;
192861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_buffer  frameinfo;
192961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_buffer buf;
193061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_plane plane[VIDEO_MAX_PLANES];
193161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = 0, extra_idx;
193261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct OMX_BUFFERHEADERTYPE *bufhdr;
193361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
193461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (buffer == NULL)
193561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
193661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
193761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bufhdr = (OMX_BUFFERHEADERTYPE *)buffer;
193861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
193961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (pmem_data_buf) {
194061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Internal PMEM addr for o/p Heap UseBuf: %p", pmem_data_buf);
194161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].m.userptr = (unsigned long)pmem_data_buf;
194261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
194361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Shared PMEM addr for o/p PMEM UseBuf/AllocateBuf: %p", bufhdr->pBuffer);
194461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[0].m.userptr = (unsigned long)bufhdr->pBuffer;
194561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
194661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
194761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.index = index;
194861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
194961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.memory = V4L2_MEMORY_USERPTR;
195061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].length = bufhdr->nAllocLen;
195161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].bytesused = bufhdr->nFilledLen;
195261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].reserved[0] = fd;
195361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].reserved[1] = 0;
195461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    plane[0].data_offset = bufhdr->nOffset;
195561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.m.planes = plane;
195661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    buf.length = num_planes;
195761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
195861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    extra_idx = EXTRADATA_IDX(num_planes);
195961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
196061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
196161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].bytesused = 0;
196261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].length = extradata_info.buffer_size;
196361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].m.userptr = (unsigned long) (extradata_info.uaddr + index * extradata_info.buffer_size);
196461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef USE_ION
196561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].reserved[0] = extradata_info.ion.fd_ion_data.fd;
196661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
196761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].reserved[1] = extradata_info.buffer_size * index;
196861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        plane[extra_idx].data_offset = 0;
196961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (extra_idx >= VIDEO_MAX_PLANES) {
197061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Extradata index higher than expected: %d\n", extra_idx);
197161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
197261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
197361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
197461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(m_nDriver_fd, VIDIOC_QBUF, &buf);
197561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
197661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
197761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to qbuf (ftb) to driver");
197861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
197961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
198061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
198161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    ftb++;
198261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
198361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
198461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
198561a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_set_extradata(OMX_U32 extra_data)
198661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
198761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control;
198861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
198961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.value = V4L2_MPEG_VIDC_EXTRADATA_MULTISLICE_INFO;
199061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_HIGH("venc_set_extradata:: %x", (int) extra_data);
199161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
199261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (multislice.mslice_mode && multislice.mslice_mode != V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE) {
199361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
199461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("ERROR: Request for setting extradata failed");
199561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
199661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
199761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
199861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to set slice extradata, slice_mode "
199961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "is set to [%lu]", multislice.mslice_mode);
200061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
200161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
200261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
200361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
200461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
200561a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_set_slice_delivery_mode(OMX_U32 enable)
200661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
200761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control;
200861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
200961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (enable) {
201061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_DELIVERY_MODE;
201161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value = 1;
201261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Set slice_delivery_mode: %d", control.value);
201361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
201461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (multislice.mslice_mode == V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_MB && m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
201561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
201661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("Request for setting slice delivery mode failed");
201761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return false;
201861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
201961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("Successfully set Slice delivery mode id: %d, value=%d\n", control.id, control.value);
202061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                slice_mode.enable = 1;
202161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
202261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
202361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set slice delivery mode, slice_mode [%d] "
202461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    "is not MB BASED or [%lu] is not H264 codec ", multislice.mslice_mode,
202561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    m_sVenc_cfg.codectype);
202661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
202761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
202861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Slice_DELIVERY_MODE not enabled\n");
202961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
203061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
203161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
203261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
203361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
203461a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_set_session_qp(OMX_U32 i_frame_qp, OMX_U32 p_frame_qp,OMX_U32 b_frame_qp)
203561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
203661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc;
203761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control;
203861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
203961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.id = V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP;
204061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.value = i_frame_qp;
204161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
204261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
204361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
204461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
204561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
204661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to set control\n");
204761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
204861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
204961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
205061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
205161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    session_qp.iframeqp = control.value;
205261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
205361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.id = V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP;
205461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.value = p_frame_qp;
205561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
205661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
205761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
205861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
205961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
206061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to set control\n");
206161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
206261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
206361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
206461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
206561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
206661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    session_qp.pframqp = control.value;
206761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
206861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((codec_profile.profile == V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) ||
206961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (codec_profile.profile == V4L2_MPEG_VIDEO_H264_PROFILE_HIGH)) {
207061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
207161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.id = V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP;
207261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value = b_frame_qp;
207361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
207461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
207561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
207661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
207761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
207861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set control\n");
207961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
208061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
208161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
208261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
208361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
208461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        session_qp.bframqp = control.value;
208561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
208661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
208761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
208861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
208961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
209061a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_set_profile_level(OMX_U32 eProfile,OMX_U32 eLevel)
209161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
209261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_profile requested_profile = {0};
209361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct ven_profilelevel requested_level = {0};
209461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned long mb_per_frame = 0;
209561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("venc_set_profile_level:: eProfile = %d, Level = %d",
209661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            eProfile, eLevel);
209761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    mb_per_frame = ((m_sVenc_cfg.input_height + 15) >> 4)*
209861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ((m_sVenc_cfg.input_width + 15) >> 4);
209961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
210061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((eProfile == 0) && (eLevel == 0) && m_profile_set && m_level_set) {
210161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Profile/Level setting complete before venc_start");
210261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return true;
210361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
210461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
210561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n Validating Profile/Level from table");
210661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
210761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!venc_validate_profile_level(&eProfile, &eLevel)) {
210861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\nERROR: Profile/Level validation failed");
210961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
211061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
211161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
211261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) {
211361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("eProfile = %d, OMX_VIDEO_MPEG4ProfileSimple = %d and "
211461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "OMX_VIDEO_MPEG4ProfileAdvancedSimple = %d", eProfile,
211561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4ProfileAdvancedSimple);
211661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
211761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eProfile == OMX_VIDEO_MPEG4ProfileSimple) {
211861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            requested_profile.profile = V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE;
211961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple) {
212061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            requested_profile.profile = V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE;
212161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
212261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\nERROR: Unsupported MPEG4 profile = %u",
212361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    eProfile);
212461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
212561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
212661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
212761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("eLevel = %d, OMX_VIDEO_MPEG4Level0 = %d, OMX_VIDEO_MPEG4Level1 = %d,"
212861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "OMX_VIDEO_MPEG4Level2 = %d, OMX_VIDEO_MPEG4Level3 = %d, OMX_VIDEO_MPEG4Level4 = %d,"
212961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "OMX_VIDEO_MPEG4Level5 = %d", eLevel, OMX_VIDEO_MPEG4Level0, OMX_VIDEO_MPEG4Level1,
213061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                OMX_VIDEO_MPEG4Level2, OMX_VIDEO_MPEG4Level3, OMX_VIDEO_MPEG4Level4, OMX_VIDEO_MPEG4Level5);
213161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
213261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (mb_per_frame >= 3600) {
213361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (requested_profile.profile == V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE)
213461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
213561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
213661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (requested_profile.profile == V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE)
213761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
213861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
213961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            switch (eLevel) {
214061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_VIDEO_MPEG4Level0:
214161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_0;
214261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
214361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_VIDEO_MPEG4Level0b:
214461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_0B;
214561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
214661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_VIDEO_MPEG4Level1:
214761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_1;
214861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
214961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_VIDEO_MPEG4Level2:
215061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_2;
215161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
215261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_VIDEO_MPEG4Level3:
215361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_3;
215461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
215561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_VIDEO_MPEG4Level4a:
215661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_4;
215761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
215861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                case OMX_VIDEO_MPEG4Level5:
215961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
216061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
216161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                default:
216261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    return false;
216361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    // TODO update corresponding levels for MPEG4_LEVEL_3b,MPEG4_LEVEL_6
216461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
216561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
216661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
216761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263) {
216861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
216961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (eProfile) {
217061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263ProfileBaseline:
217161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_BASELINE;
217261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
217361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263ProfileH320Coding:
217461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_H320CODING;
217561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
217661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263ProfileBackwardCompatible:
217761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_BACKWARDCOMPATIBLE;
217861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
217961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263ProfileISWV2:
218061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_ISWV2;
218161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
218261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263ProfileISWV3:
218361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_ISWV3;
218461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
218561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263ProfileHighCompression:
218661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_HIGHCOMPRESSION;
218761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
218861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263ProfileInternet:
218961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_INTERNET;
219061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
219161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263ProfileInterlace:
219261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_INTERLACE;
219361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
219461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263ProfileHighLatency:
219561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_HIGHLATENCY;
219661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
219761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default:
219861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_LOW("\nERROR: Unsupported H.263 profile = %u",
219961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        requested_profile.profile);
220061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return false;
220161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
220261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
220361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        //profile level
220461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (eLevel) {
220561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263Level10:
220661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_1_0;
220761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
220861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263Level20:
220961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_2_0;
221061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
221161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263Level30:
221261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_3_0;
221361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
221461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263Level40:
221561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_4_0;
221661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
221761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263Level45:
221861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_4_5;
221961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
222061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263Level50:
222161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_5_0;
222261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
222361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263Level60:
222461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_6_0;
222561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
222661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_H263Level70:
222761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_7_0;
222861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
222961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default:
223061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return false;
223161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
223261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
223361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
223461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (eProfile == OMX_VIDEO_AVCProfileBaseline) {
223561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE;
223661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (eProfile == OMX_VIDEO_AVCProfileMain) {
223761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_MAIN;
223861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (eProfile == OMX_VIDEO_AVCProfileExtended) {
223961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED;
224061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (eProfile == OMX_VIDEO_AVCProfileHigh) {
224161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH;
224261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (eProfile == OMX_VIDEO_AVCProfileHigh10) {
224361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10;
224461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (eProfile == OMX_VIDEO_AVCProfileHigh422) {
224561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422;
224661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (eProfile == OMX_VIDEO_AVCProfileHigh444) {
224761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE;
224861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
224961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\nERROR: Unsupported H.264 profile = %u",
225061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    requested_profile.profile);
225161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
225261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
225361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
225461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        //profile level
225561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (eLevel) {
225661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel1:
225761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_0;
225861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
225961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel1b:
226061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1B;
226161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
226261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel11:
226361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_1;
226461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
226561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel12:
226661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_2;
226761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
226861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel13:
226961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_3;
227061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
227161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel2:
227261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_2_0;
227361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
227461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel21:
227561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_2_1;
227661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
227761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel22:
227861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_2_2;
227961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
228061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel3:
228161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_3_0;
228261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
228361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel31:
228461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_3_1;
228561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
228661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel32:
228761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_3_2;
228861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
228961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel4:
229061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_4_0;
229161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
229261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel41:
229361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_4_1;
229461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
229561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel42:
229661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_4_2;
229761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
229861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel5:
229961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_5_0;
230061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
230161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case OMX_VIDEO_AVCLevel51:
230261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_5_1;
230361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
230461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default :
230561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                DEBUG_PRINT_ERROR("\nERROR: Unsupported H.264 level= %lu",
230661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        requested_level.level);
230761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                return false;
230861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
230961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
23107beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8) {
23117beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        if (!(eProfile == OMX_VIDEO_VP8ProfileMain)) {
23127beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            DEBUG_PRINT_ERROR("\nERROR: Unsupported VP8 profile = %u",
23137beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                        eProfile);
23147beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            return false;
23157beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        }
23167beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_VP8_UNUSED;
23177beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        m_profile_set = true;
23187beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        switch(eLevel) {
23197beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            case OMX_VIDEO_VP8Level_Version0:
23207beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                requested_level.level = V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_0;
23217beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                break;
23227beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            case OMX_VIDEO_VP8Level_Version1:
23237beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                requested_level.level = V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_1;
23247beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                break;
23257beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            default:
23267beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                DEBUG_PRINT_ERROR("\nERROR: Unsupported VP8 level= %lu",
23277beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                            eLevel);
23287beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                return false;
23297beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                break;
23307beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        }
233161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
233261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
233361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_profile_set) {
233461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int rc;
233561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct v4l2_control control;
233661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
233761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
233861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDEO_H264_PROFILE;
233961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) {
234061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE;
234161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263) {
234261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_H263_PROFILE;
234361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
234461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\n Wrong CODEC \n");
234561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
234661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
234761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
234861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value = requested_profile.profile;
234961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
235061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
235161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
235261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
235361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
235461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set control\n");
235561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
235661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
235761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
235861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
235961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
236061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        codec_profile.profile = control.value;
236161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_profile_set = true;
236261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
236361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
236461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!m_level_set) {
236561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int rc;
236661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct v4l2_control control;
236761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
236861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
236961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDEO_H264_LEVEL;
237061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) {
237161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL;
237261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263) {
237361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.id = V4L2_CID_MPEG_VIDC_VIDEO_H263_LEVEL;
23747beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8) {
23757beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            control.id = V4L2_CID_MPEG_VIDC_VIDEO_VP8_PROFILE_LEVEL;
237661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
237761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\n Wrong CODEC \n");
237861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
237961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
238061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
238161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value = requested_level.level;
238261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
238361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
238461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
238561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
238661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
238761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set control\n");
238861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
238961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
239061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
239161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
239261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
239361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        profile_level.level = control.value;
239461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_level_set = true;
239561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
239661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
239761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
239861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
239961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
240061a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_set_voptiming_cfg( OMX_U32 TimeIncRes)
240161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
240261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
240361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_voptimingcfg vop_timing_cfg;
240461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
240561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n venc_set_voptiming_cfg: TimeRes = %u",
240661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            TimeIncRes);
240761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
240861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    vop_timing_cfg.voptime_resolution = TimeIncRes;
240961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
241061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    voptimecfg.voptime_resolution = vop_timing_cfg.voptime_resolution;
241161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
241261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
241361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
241461a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_set_intra_period(OMX_U32 nPFrames, OMX_U32 nBFrames)
241561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
241661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
241761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n venc_set_intra_period: nPFrames = %u",
241861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nPFrames);
241961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc;
242061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control;
242161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
242261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((codec_profile.profile != V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE) &&
242361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (codec_profile.profile != V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) &&
242461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (codec_profile.profile != V4L2_MPEG_VIDEO_H264_PROFILE_HIGH)) {
242561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        nBFrames=0;
242661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
242761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
242861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_P_FRAMES;
242961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.value = nPFrames;
243061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
243161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
243261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
243361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
243461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to set control\n");
243561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
243661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
243761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
243861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
243961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
244061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    intra_period.num_pframes = control.value;
244161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_B_FRAMES;
244261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.value = nBFrames;
244361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
244461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
244561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
244661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
244761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to set control\n");
244861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
244961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
245061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
245161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
245261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
245361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
245461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    intra_period.num_bframes = control.value;
245561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
245661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
245761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.id = V4L2_CID_MPEG_VIDC_VIDEO_IDR_PERIOD;
245861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value = 1;
245961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
246061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
246161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
246261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
246361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set control\n");
246461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
246561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
246661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
246761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        idrperiod.idrperiod = 1;
246861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
246961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
247061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
247161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
247261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
247361a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_set_idr_period(OMX_U32 nPFrames, OMX_U32 nIDRPeriod)
247461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
247561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = 0;
247661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control;
247761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n venc_set_idr_period: nPFrames = %u, nIDRPeriod: %u\n",
247861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nPFrames, nIDRPeriod);
247961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
248061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_sVenc_cfg.codectype != V4L2_PIX_FMT_H264) {
248161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nERROR: IDR period valid for H264 only!!");
248261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
248361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
248461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
248561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (venc_set_intra_period (nPFrames, intra_period.num_bframes) == false) {
248661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nERROR: Request for setting intra period failed");
248761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
248861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
248961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
249061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    intra_period.num_pframes = nPFrames;
249161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.id = V4L2_CID_MPEG_VIDC_VIDEO_IDR_PERIOD;
249261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.value = nIDRPeriod;
249361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
249461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
249561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
249661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
249761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to set control\n");
249861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
249961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
250061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
250161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    idrperiod.idrperiod = nIDRPeriod;
250261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
250361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
250461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
250561a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_set_entropy_config(OMX_BOOL enable, OMX_U32 i_cabac_level)
250661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
250761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = 0;
250861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control;
250961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
251061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n venc_set_entropy_config: CABAC = %u level: %u", enable, i_cabac_level);
251161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
251261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (enable &&(codec_profile.profile != V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE)) {
251361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
251461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value = V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC;
251561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.id = V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE;
251661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
251761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
251861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
251961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
252061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
252161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set control\n");
252261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
252361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
252461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
252561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
252661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        entropy.longentropysel = control.value;
252761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
252861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (i_cabac_level == 0) {
252961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_0;
253061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (i_cabac_level == 1) {
253161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_1;
253261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (i_cabac_level == 2) {
253361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_2;
253461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
253561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
253661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.id = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL;
253761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        //control.value = entropy_cfg.cabacmodel;
253861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
253961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
254061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
254161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
254261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set control\n");
254361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
254461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
254561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
254661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
254761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        entropy.longentropysel=control.value;
254861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (!enable) {
254961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value =  V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC;
255061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.id = V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE;
255161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
255261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
255361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
255461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
255561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set control\n");
255661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
255761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
255861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
255961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
256061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        entropy.longentropysel=control.value;
256161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
256261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nInvalid Entropy mode for Baseline Profile");
256361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
256461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
256561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
256661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
256761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
256861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
256961a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_set_multislice_cfg(OMX_INDEXTYPE Codec, OMX_U32 nSlicesize) // MB
257061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
257161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc;
257261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control;
257361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
257461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
257561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((Codec != OMX_IndexParamVideoH263)  && (nSlicesize)) {
257661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value =  V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_MB;
257761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
257861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value =  V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE;
257961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
258061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
258161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE;
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    }
25896eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
259061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
259161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    multislice.mslice_mode=control.value;
25926eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
259361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (multislice.mslice_mode!=V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE) {
259461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
259561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB;
259661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value = nSlicesize;
259761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Calling SLICE_MB IOCTL set control for id=%d, val=%d\n", control.id, control.value);
259861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
259961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
260061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
260161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set control\n");
260261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
260361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
260461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
260561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
260661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice.mslice_size=control.value;
260761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
260861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
260961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
261061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
2611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
261361a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_set_intra_refresh(OMX_VIDEO_INTRAREFRESHTYPE ir_mode, OMX_U32 irMBs)
2614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
261561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
261661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc;
261761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control_mode,control_mbs;
261861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control_mode.id = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_MODE;
261961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
262061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    // There is no disabled mode.  Disabled mode is indicated by a 0 count.
262161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (irMBs == 0 || ir_mode == OMX_VIDEO_IntraRefreshMax) {
262261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_NONE;
262361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return status;
262461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if ((ir_mode == OMX_VIDEO_IntraRefreshCyclic) &&
262561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (irMBs < ((m_sVenc_cfg.input_width * m_sVenc_cfg.input_height)>>8))) {
262661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_CYCLIC;
262761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control_mbs.id=V4L2_CID_MPEG_VIDC_VIDEO_CIR_MBS;
262861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control_mbs.value=irMBs;
262961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if ((ir_mode == OMX_VIDEO_IntraRefreshAdaptive) &&
263061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (irMBs < ((m_sVenc_cfg.input_width * m_sVenc_cfg.input_height)>>8))) {
263161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_ADAPTIVE;
263261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control_mbs.id=V4L2_CID_MPEG_VIDC_VIDEO_AIR_MBS;
263361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control_mbs.value=irMBs;
263461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if ((ir_mode == OMX_VIDEO_IntraRefreshBoth) &&
263561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (irMBs < ((m_sVenc_cfg.input_width * m_sVenc_cfg.input_height)>>8))) {
263661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_CYCLIC_ADAPTIVE;
263761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
263861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nERROR: Invalid IntraRefresh Parameters:"
263961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "mb count: %lu, mb mode:%d", irMBs, ir_mode);
264061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
264161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
264361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%lu, val=%lu\n", control_mode.id, control_mode.value);
264461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control_mode);
2645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
264661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
264761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to set control\n");
264861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
264961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
265161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control_mode.id, control_mode.value);
2652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
265361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control_mbs.id, control_mbs.value);
265461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control_mbs);
2655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
265661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
265761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to set control\n");
265861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
265961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
266161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control_mbs.id, control_mbs.value);
2662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
266361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    intra_refresh.irmode = control_mode.value;
266461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    intra_refresh.mbcount = control_mbs.value;
2665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
266661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
2667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
266961a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_set_error_resilience(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* error_resilience)
2670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
267161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
267261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_headerextension hec_cfg;
267361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_multiclicecfg multislice_cfg;
267461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc;
267561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control;
2676b79c7e8bccc229ae7d431392c0cd7c5fe24f1cd0Rom Lemarchand
267761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    memset(&control, 0, sizeof(control));
2678dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
267961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) {
268061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (error_resilience->bEnableHEC) {
268161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            hec_cfg.header_extension = 1;
268261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
268361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            hec_cfg.header_extension = 0;
268461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
26856eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
268661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        hec.header_extension = error_resilience->bEnableHEC;
268761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
268961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (error_resilience->bEnableRVLC) {
269061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n RVLC is not Supported");
269161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
269261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
269461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (( m_sVenc_cfg.codectype != V4L2_PIX_FMT_H263) &&
269561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (error_resilience->bEnableDataPartitioning)) {
269661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n DataPartioning are not Supported for MPEG4/H264");
269761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
269861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
270061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (( m_sVenc_cfg.codectype != V4L2_PIX_FMT_H263) &&
270161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (error_resilience->nResynchMarkerSpacing)) {
270261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice_cfg.mslice_mode = VEN_MSLICE_CNT_BYTE;
270361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice_cfg.mslice_size = error_resilience->nResynchMarkerSpacing;
270461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE;
270561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value = V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_BYTES;
270661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263 &&
270761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            error_resilience->bEnableDataPartitioning) {
270861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice_cfg.mslice_mode = VEN_MSLICE_GOB;
270961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice_cfg.mslice_size = error_resilience->nResynchMarkerSpacing;
271061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE;
271161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value = V4L2_MPEG_VIDEO_MULTI_SLICE_GOB;
271261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
271361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice_cfg.mslice_mode = VEN_MSLICE_OFF;
271461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        multislice_cfg.mslice_size = 0;
271561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE;
271661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value =  V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE;
271761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
271961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n %s(): mode = %u, size = %u", __func__,
272061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            multislice_cfg.mslice_mode, multislice_cfg.mslice_size);
272161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    printf("Calling IOCTL set control for id=%x, val=%d\n", control.id, control.value);
272261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
272461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
272561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        printf("Failed to set Slice mode control\n");
272661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
272761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
272961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    printf("Success IOCTL set control for id=%x, value=%d\n", control.id, control.value);
273061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    multislice.mslice_mode=control.value;
2731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
273261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES;
273361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.value = error_resilience->nResynchMarkerSpacing;
273461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    printf("Calling IOCTL set control for id=%x, val=%d\n", control.id, control.value);
273561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
273761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
273861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        printf("Failed to set MAX MB control\n");
273961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
274061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
274261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    printf("Success IOCTL set control for id=%x, value=%d\n", control.id, control.value);
274361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    multislice.mslice_mode = multislice_cfg.mslice_mode;
274461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    multislice.mslice_size = multislice_cfg.mslice_size;
274561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
27466eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
2747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
274861a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_set_inloop_filter(OMX_VIDEO_AVCLOOPFILTERTYPE loopfilter)
27496eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
275061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc;
275161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control;
275261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.id=V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE;
275361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
275461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (loopfilter == OMX_VIDEO_AVCLoopFilterEnable) {
275561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value=V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_ENABLED;
275661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (loopfilter == OMX_VIDEO_AVCLoopFilterDisable) {
275761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value=V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED;
275861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (loopfilter == OMX_VIDEO_AVCLoopFilterDisableSliceBoundary) {
275961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value=V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED_AT_SLICE_BOUNDARY;
276061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
276261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
276361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
276561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
2766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return false;
276761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
276961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
2770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
277161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    dbkfilter.db_mode=control.value;
2772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
277361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.id=V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA;
277461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.value=0;
2775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
277661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
277761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
277961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
278061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
278161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
278361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
278461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.id=V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA;
278561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.value=0;
278661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
278761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
2788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
278961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
279061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
279161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
279361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
2794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
279561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
279661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    dbkfilter.slicealpha_offset = dbkfilter.slicebeta_offset = 0;
279761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
2798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
280061a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool venc_dev::venc_set_target_bitrate(OMX_U32 nTargetBitrate, OMX_U32 config)
2801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
280261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n venc_set_target_bitrate: bitrate = %u",
280361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            nTargetBitrate);
280461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control;
280561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = 0;
280661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.id = V4L2_CID_MPEG_VIDEO_BITRATE;
280761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.value = nTargetBitrate;
280861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
280961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
281061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
281161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
281261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
281361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed to set control\n");
281461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
281561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
2816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
281761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
28186eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
2819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
282061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.targetbitrate = control.value;
282161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bitrate.target_bitrate = control.value;
2822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
282361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!config) {
282461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_level_set = false;
2825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
282661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (venc_set_profile_level(0, 0)) {
282761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_HIGH("Calling set level (Bitrate) with %lu\n",profile_level.level);
282861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
282961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
283061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
283161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
2832826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2833826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2834826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_encode_framerate(OMX_U32 encode_framerate, OMX_U32 config)
2835826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
283661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_streamparm parm;
283761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = 0;
283861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct venc_framerate frame_rate_cfg;
283961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    Q16ToFraction(encode_framerate,frame_rate_cfg.fps_numerator,frame_rate_cfg.fps_denominator);
284061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    parm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
284161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    parm.parm.output.timeperframe.numerator = frame_rate_cfg.fps_denominator;
284261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    parm.parm.output.timeperframe.denominator = frame_rate_cfg.fps_numerator;
284361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
284461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (frame_rate_cfg.fps_numerator > 0)
284561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(m_nDriver_fd, VIDIOC_S_PARM, &parm);
284661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
284761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (rc) {
284861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("ERROR: Request for setting framerate failed\n");
284961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
285061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
285161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
285261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.fps_den = frame_rate_cfg.fps_denominator;
285361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    m_sVenc_cfg.fps_num = frame_rate_cfg.fps_numerator;
285461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
285561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!config) {
285661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_level_set = false;
285761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
285861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (venc_set_profile_level(0, 0)) {
285961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_HIGH("Calling set level (Framerate) with %lu\n",profile_level.level);
286061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
286161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
286261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
286361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
2864826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2865826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2866826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_color_format(OMX_COLOR_FORMATTYPE color_format)
2867826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
286861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_format fmt;
286961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n venc_set_color_format: color_format = %u ", color_format);
287061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
28710b6fd256ee76a3fbbfcd4a33c63be88b1db78798Praveen Chavan    if (color_format == OMX_COLOR_FormatYUV420SemiPlanar ||
28720b6fd256ee76a3fbbfcd4a33c63be88b1db78798Praveen Chavan            color_format == QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m) {
287361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sVenc_cfg.inputformat = V4L2_PIX_FMT_NV12;
287461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (color_format == QOMX_COLOR_FormatYVU420SemiPlanar) {
287561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sVenc_cfg.inputformat = V4L2_PIX_FMT_NV21;
287661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
287761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nWARNING: Unsupported Color format [%d]", color_format);
287861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        m_sVenc_cfg.inputformat = V4L2_PIX_FMT_NV12;
287961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_HIGH("\n Default color format YUV420SemiPlanar is set");
288061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
288161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
288261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
288361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.inputformat;
288461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
288561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
288661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
288761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt)) {
288861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("Failed setting color format %x", color_format);
288961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
289061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
289161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
289261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
2893826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2894826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2895826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_intra_vop_refresh(OMX_BOOL intra_vop_refresh)
2896826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
289761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n venc_set_intra_vop_refresh: intra_vop = %uc", intra_vop_refresh);
289861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
289961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (intra_vop_refresh == OMX_TRUE) {
290061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct v4l2_control control;
290161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int rc;
290261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.id = V4L2_CID_MPEG_VIDC_VIDEO_REQUEST_IFRAME;
290361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        control.value = 1;
290461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        printf("Calling IOCTL set control for id=%x, val=%d\n", control.id, control.value);
290561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
290661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
290761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
290861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            printf("Failed to set Intra Frame Request control\n");
290961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
291061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
291161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
291261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        printf("Success IOCTL set control for id=%x, value=%d\n", control.id, control.value);
291361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
291461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\nERROR: VOP Refresh is False, no effect");
291561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
291661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
291761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
2918826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2919826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2920826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_ratectrl_cfg(OMX_VIDEO_CONTROLRATETYPE eControlRate)
2921826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
292261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
292361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    struct v4l2_control control;
292461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int rc = 0;
292561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    control.id = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL;
292661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
292761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    switch (eControlRate) {
292861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_Video_ControlRateDisable:
292961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_OFF;
293061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
293161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_Video_ControlRateVariableSkipFrames:
293261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_VBR_VFR;
293361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
293461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_Video_ControlRateVariable:
293561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_VBR_CFR;
293661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
293761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_Video_ControlRateConstantSkipFrames:
293861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_CBR_VFR;
293961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
294061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        case OMX_Video_ControlRateConstant:
294161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            control.value=V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_CBR_CFR;
294261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
294361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        default:
294461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = false;
294561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            break;
294661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
294761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
294861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (status) {
294961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
295061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d\n", control.id, control.value);
295161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
295261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
295361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (rc) {
295461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("Failed to set control\n");
295561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
295661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
295761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
295861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d\n", control.id, control.value);
295961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
296061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        rate_ctrl.rcmode = control.value;
296161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
296261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
296361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
2964826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
2965826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
2966826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_get_profile_level(OMX_U32 *eProfile,OMX_U32 *eLevel)
2967826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
296861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
296961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
297061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (eProfile == NULL || eLevel == NULL) {
297161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
297261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
297361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
297461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) {
297561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (codec_profile.profile) {
297661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE:
297761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
297861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
297961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE:
298061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
298161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
298261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default:
298361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_MPEG4ProfileMax;
298461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                status = false;
298561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
298661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
298761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
298861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!status) {
298961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return status;
299061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
299161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
299261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        //profile level
299361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (profile_level.level) {
299461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_MPEG4_LEVEL_0:
299561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_MPEG4Level0;
299661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
299761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_MPEG4_LEVEL_0B:
299861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_MPEG4Level0b;
299961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
300061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_MPEG4_LEVEL_1:
300161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_MPEG4Level1;
300261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
300361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_MPEG4_LEVEL_2:
300461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_MPEG4Level2;
300561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
300661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_MPEG4_LEVEL_3:
300761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_MPEG4Level3;
300861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
300961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_MPEG4_LEVEL_4:
301061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_MPEG4Level4;
301161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
301261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_MPEG4_LEVEL_5:
301361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_MPEG4Level5;
301461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
301561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default:
301661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_MPEG4LevelMax;
301761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                status =  false;
301861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
301961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
302061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263) {
302161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (codec_profile.profile == VEN_PROFILE_H263_BASELINE) {
302261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            *eProfile = OMX_VIDEO_H263ProfileBaseline;
302361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
302461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            *eProfile = OMX_VIDEO_H263ProfileMax;
302561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return false;
302661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
302761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
302861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (profile_level.level) {
302961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H263_10:
303061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263Level10;
303161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
303261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H263_20:
303361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263Level20;
303461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
303561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H263_30:
303661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263Level30;
303761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
303861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H263_40:
303961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263Level40;
304061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
304161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H263_45:
304261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263Level45;
304361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
304461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H263_50:
304561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263Level50;
304661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
304761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H263_60:
304861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263Level60;
304961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
305061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case VEN_LEVEL_H263_70:
305161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263Level70;
305261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
305361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default:
305461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_H263LevelMax;
305561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                status = false;
305661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
305761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
305861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
305961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (codec_profile.profile) {
306061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
306161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_AVCProfileBaseline;
306261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
306361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
306461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_AVCProfileMain;
306561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
306661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
306761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_AVCProfileHigh;
306861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
306961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED:
307061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_AVCProfileExtended;
307161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
307261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10:
307361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_AVCProfileHigh10;
307461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
307561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422:
307661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_AVCProfileHigh422;
307761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
307861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE:
307961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_AVCProfileHigh444;
308061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
308161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default:
308261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_AVCProfileMax;
308361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                status = false;
308461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
308561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
308661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
308761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (!status) {
308861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return status;
308961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
309061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
309161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        switch (profile_level.level) {
309261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_LEVEL_1_0:
309361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel1;
309461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
309561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_LEVEL_1B:
309661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel1b;
309761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
309861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_LEVEL_1_1:
309961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel11;
310061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
310161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_LEVEL_1_2:
310261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel12;
310361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
310461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_LEVEL_1_3:
310561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel13;
310661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
310761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_LEVEL_2_0:
310861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel2;
310961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
311061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_LEVEL_2_1:
311161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel21;
311261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
311361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_LEVEL_2_2:
311461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel22;
311561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
311661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_LEVEL_3_0:
311761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel3;
311861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
311961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_LEVEL_3_1:
312061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel31;
312161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
312261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_LEVEL_3_2:
312361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel32;
312461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
312561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_LEVEL_4_0:
312661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel4;
312761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
312861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_LEVEL_4_1:
312961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel41;
313061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
313161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_LEVEL_4_2:
313261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel42;
313361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
313461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_LEVEL_5_0:
313561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel5;
313661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
313761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            case V4L2_MPEG_VIDEO_H264_LEVEL_5_1:
313861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevel51;
313961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
314061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            default :
314161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eLevel = OMX_VIDEO_AVCLevelMax;
314261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                status = false;
314361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                break;
314461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
314561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
31467beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano    else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8) {
31477beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        switch (codec_profile.profile) {
31487beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            case V4L2_MPEG_VIDC_VIDEO_VP8_UNUSED:
31497beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                *eProfile = OMX_VIDEO_VP8ProfileMain;
31507beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                break;
31517beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            default:
31527beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                *eProfile = OMX_VIDEO_VP8ProfileMax;
31537beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                status = false;
31547beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                break;
31557beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        }
31567beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        if (!status) {
31577beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            return status;
31587beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        }
31597beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano
31607beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        switch (profile_level.level) {
31617beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            case V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_0:
31627beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                *eLevel = OMX_VIDEO_VP8Level_Version0;
31637beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                break;
31647beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            case V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_1:
31657beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                *eLevel = OMX_VIDEO_VP8Level_Version1;
31667beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                break;
31677beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            default:
31687beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                *eLevel = OMX_VIDEO_VP8LevelMax;
31697beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                status = false;
31707beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                break;
31717beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        }
31727beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano    }
317361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
317461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
3175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
3177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_validate_profile_level(OMX_U32 *eProfile, OMX_U32 *eLevel)
3178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
317961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 new_profile = 0, new_level = 0;
318061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    unsigned const int *profile_tbl = NULL;
318161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    OMX_U32 mb_per_frame, mb_per_sec;
318261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool profile_level_found = false;
318361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
318461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n Init profile table for respective codec");
318561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
318661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    //validate the ht,width,fps,bitrate and set the appropriate profile and level
318761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) {
318861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eProfile == 0) {
318961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!m_profile_set) {
319061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
319161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
319261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                switch (codec_profile.profile) {
319361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    case V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE:
319461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        *eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
319561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
319661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    case V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE:
319761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
319861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
319961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    default:
320061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_LOW("\n %s(): Unknown Error", __func__);
320161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
320261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
320361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
3204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
320561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
320661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eLevel == 0 && !m_level_set) {
320761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            *eLevel = OMX_VIDEO_MPEG4LevelMax;
320861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
320961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
321061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eProfile == OMX_VIDEO_MPEG4ProfileSimple) {
321161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_tbl = (unsigned int const *)mpeg4_profile_level_table;
321261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (*eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple) {
321361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_tbl = (unsigned int const *)
321461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (&mpeg4_profile_level_table[MPEG4_ASP_START]);
321561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
321661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n Unsupported MPEG4 profile type %lu", *eProfile);
3217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return false;
3218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
321961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
322061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eProfile == 0) {
322161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!m_profile_set) {
322261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_AVCProfileBaseline;
322361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
322461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                switch (codec_profile.profile) {
322561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
322661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        *eProfile = OMX_VIDEO_AVCProfileBaseline;
322761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
322861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
322961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        *eProfile = OMX_VIDEO_AVCProfileMain;
323061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
323161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    case V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED:
323261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        *eProfile = OMX_VIDEO_AVCProfileExtended;
323361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
323461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
323561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        *eProfile = OMX_VIDEO_AVCProfileHigh;
323661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
323761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10:
323861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        *eProfile = OMX_VIDEO_AVCProfileHigh10;
323961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
324061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422:
324161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        *eProfile = OMX_VIDEO_AVCProfileHigh422;
324261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
324361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE:
324461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        *eProfile = OMX_VIDEO_AVCProfileHigh444;
324561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
324661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    default:
324761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_LOW("\n %s(): Unknown Error", __func__);
324861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
324961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
325061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
325161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
325261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
325361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eLevel == 0 && !m_level_set) {
325461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            *eLevel = OMX_VIDEO_AVCLevelMax;
325561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
325661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
325761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eProfile == OMX_VIDEO_AVCProfileBaseline) {
325861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_tbl = (unsigned int const *)h264_profile_level_table;
325961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (*eProfile == OMX_VIDEO_AVCProfileHigh) {
326061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_tbl = (unsigned int const *)
326161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (&h264_profile_level_table[H264_HP_START]);
326261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else if (*eProfile == OMX_VIDEO_AVCProfileMain) {
326361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_tbl = (unsigned int const *)
326461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                (&h264_profile_level_table[H264_MP_START]);
326561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
326661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n Unsupported AVC profile type %lu", *eProfile);
3267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return false;
3268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
326961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263) {
327061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eProfile == 0) {
327161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!m_profile_set) {
327261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                *eProfile = OMX_VIDEO_H263ProfileBaseline;
327361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            } else {
327461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                switch (codec_profile.profile) {
327561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    case VEN_PROFILE_H263_BASELINE:
327661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        *eProfile = OMX_VIDEO_H263ProfileBaseline;
327761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        break;
327861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    default:
327961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        DEBUG_PRINT_LOW("\n %s(): Unknown Error", __func__);
328061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                        return false;
328161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
328261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
328361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
328461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
328561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eLevel == 0 && !m_level_set) {
328661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            *eLevel = OMX_VIDEO_H263LevelMax;
328761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
328861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
328961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (*eProfile == OMX_VIDEO_H263ProfileBaseline) {
329061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_tbl = (unsigned int const *)h263_profile_level_table;
329161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else {
329261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_LOW("\n Unsupported H.263 profile type %lu", *eProfile);
3293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return false;
329461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
329561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8) {
32967beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        if (*eProfile == 0) {
32977beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            *eProfile = OMX_VIDEO_VP8ProfileMain;
32987beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        } else {
32997beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            switch (codec_profile.profile) {
33007beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                case V4L2_MPEG_VIDC_VIDEO_VP8_UNUSED:
33017beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                    *eProfile = OMX_VIDEO_VP8ProfileMain;
33027beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                    break;
33037beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                default:
33047beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                    DEBUG_PRINT_ERROR("\n %s(): Unknown VP8 profile", __func__);
33057beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                    return false;
33067beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            }
33077beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        }
33087beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        if (*eLevel == 0) {
33097beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            switch (profile_level.level) {
33107beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                case V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_0:
33117beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                    *eLevel = OMX_VIDEO_VP8Level_Version0;
33127beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                    break;
33137beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                case V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_1:
33147beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                    *eLevel = OMX_VIDEO_VP8Level_Version1;
33157beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                    break;
33167beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                default:
33177beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                    DEBUG_PRINT_ERROR("\n %s(): Unknown VP8 level", __func__);
33187beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano                    return false;
33197beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            }
33207beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano        }
332161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return true;
332261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else {
332361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Invalid codec type");
3324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return false;
332561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
332661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
332761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    mb_per_frame = ((m_sVenc_cfg.input_height + 15) >> 4)*
332861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ((m_sVenc_cfg.input_width + 15)>> 4);
332961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
333061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((mb_per_frame >= 3600) && (m_sVenc_cfg.codectype == (unsigned long) V4L2_PIX_FMT_MPEG4)) {
333161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (codec_profile.profile == (unsigned long) V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE)
333261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
333361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
333461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (codec_profile.profile == (unsigned long) V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE)
333561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            profile_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
333661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
3337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
333861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            new_level = profile_level.level;
333961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            new_profile = codec_profile.profile;
334061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return true;
334161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
334261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
334361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
334461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    mb_per_sec = mb_per_frame * m_sVenc_cfg.fps_num / m_sVenc_cfg.fps_den;
334561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
334661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    do {
334761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (mb_per_frame <= (unsigned int)profile_tbl[0]) {
334861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (mb_per_sec <= (unsigned int)profile_tbl[1]) {
334961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                if (m_sVenc_cfg.targetbitrate <= (unsigned int)profile_tbl[2]) {
335061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    new_level = (int)profile_tbl[3];
335161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    new_profile = (int)profile_tbl[4];
335261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    profile_level_found = true;
335361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    DEBUG_PRINT_LOW("\n Appropriate profile/level found %d/%d\n", new_profile, new_level);
335461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                    break;
335561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                }
335661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            }
335761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
335861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
335961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        profile_tbl = profile_tbl + 5;
336061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } while (profile_tbl[0] != 0);
336161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
336261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (profile_level_found != true) {
336361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n ERROR: Unsupported profile/level\n");
336461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
336561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
336661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
336761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((*eLevel == OMX_VIDEO_MPEG4LevelMax) || (*eLevel == OMX_VIDEO_AVCLevelMax)
33687beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano            || (*eLevel == OMX_VIDEO_H263LevelMax || (*eLevel == OMX_VIDEO_VP8ProfileMax))) {
336961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        *eLevel = new_level;
337061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
337161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
33727beb72122c9b88f2a04e5ef30e370b3d35483d04Jorge Solano Altamirano    DEBUG_PRINT_LOW("%s: Returning with eProfile = %lu\n"
337361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            "Level = %lu", __func__, *eProfile, *eLevel);
337461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
337561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
3376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_ICS_
3378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevbool venc_dev::venc_set_meta_mode(bool mode)
3379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
338061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    metadatamode = 1;
338161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
3382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
3383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif
33846eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal
33856eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittalbool venc_dev::venc_is_video_session_supported(unsigned long width,
338661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned long height)
33876eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal{
338861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if ((width * height < capability.min_width *  capability.min_height) ||
338961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            (width * height > capability.max_width *  capability.max_height)) {
339061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR(
339161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                "Unsupported video resolution WxH = (%d)x(%d) supported range = min (%d)x(%d) - max (%d)x(%d)\n",
339261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                width, height, capability.min_width, capability.min_height,
339361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                capability.max_width, capability.max_height);
339461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
339561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
339661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
339761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n video session supported\n");
339861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return true;
33996eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal}
3400