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