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