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