111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*-------------------------------------------------------------------------- 22e1e93b75bc282dafdff24eb3b473af177e3e35bThierry StrudelCopyright (c) 2010-2017, The Linux Foundation. All rights reserved. 311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRedistribution and use in source and binary forms, with or without 511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelmodification, are permitted provided that the following conditions are met: 611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Redistributions of source code must retain the above copyright 711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel notice, this list of conditions and the following disclaimer. 811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Redistributions in binary form must reproduce the above copyright 911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel notice, this list of conditions and the following disclaimer in the 1011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel documentation and/or other materials provided with the distribution. 1111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Neither the name of The Linux Foundation nor 1211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel the names of its contributors may be used to endorse or promote 1311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel products derived from this software without specific prior written 1411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel permission. 1511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 1711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelIMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 1911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelNON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 2011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 2111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 2211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 2311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 2511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 2611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel--------------------------------------------------------------------------*/ 2811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 2911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <string.h> 3011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <sys/ioctl.h> 3111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <sys/prctl.h> 3211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <sys/eventfd.h> 3311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <unistd.h> 3411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <fcntl.h> 3511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "video_encoder_device_v4l2.h" 3611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "omx_video_encoder.h" 3711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <media/msm_vidc.h> 3811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 3911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <linux/msm_ion.h> 4011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 4111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <math.h> 4211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <media/msm_media_info.h> 4311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <cutils/properties.h> 4411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <media/hardware/HardwareAPI.h> 4511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 4611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ 4711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <media/hardware/HardwareAPI.h> 4811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <gralloc_priv.h> 4911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 5011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 51fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#include <qdMetaData.h> 52fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 53b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel#define ATRACE_TAG ATRACE_TAG_VIDEO 54b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel#include <utils/Trace.h> 55b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel 56d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel#define YUV_STATS_LIBRARY_NAME "libgpustats.so" // UBWC case: use GPU library 57d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel 5811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define ALIGN(x, to_align) ((((unsigned long) x) + (to_align - 1)) & ~(to_align - 1)) 5911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define EXTRADATA_IDX(__num_planes) ((__num_planes) ? (__num_planes) - 1 : 0) 6011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MAXDPB 16 6111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MIN(x,y) (((x) < (y)) ? (x) : (y)) 6211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MAX(x,y) (((x) > (y)) ? (x) : (y)) 6311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define ROUND(__sz, __align) (((__sz) + ((__align>>1))) & (~(__align-1))) 6411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MAX_PROFILE_PARAMS 6 6511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MPEG4_SP_START 0 6611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MPEG4_ASP_START (MPEG4_SP_START + 10) 6711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define H263_BP_START 0 6811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define HEVC_MAIN_START 0 6911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define HEVC_MAIN10_START (HEVC_MAIN_START + 13) 7011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define POLL_TIMEOUT 1000 7111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MAX_SUPPORTED_SLICES_PER_FRAME 28 /* Max supported slices with 32 output buffers */ 7211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 7311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SZ_4K 0x1000 7411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SZ_1M 0x100000 7511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 7611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* MPEG4 profile and level table*/ 7711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic const unsigned int mpeg4_profile_level_table[][MAX_PROFILE_PARAMS]= { 7811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*max mb per frame, max mb per sec, max bitrate, level, profile, dpbmbs*/ 7911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel {99,1485,64000,OMX_VIDEO_MPEG4Level0,OMX_VIDEO_MPEG4ProfileSimple,0}, 8011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel {99,1485,64000,OMX_VIDEO_MPEG4Level1,OMX_VIDEO_MPEG4ProfileSimple,0}, 8111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel {396,5940,128000,OMX_VIDEO_MPEG4Level2,OMX_VIDEO_MPEG4ProfileSimple,0}, 8211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel {396,11880,384000,OMX_VIDEO_MPEG4Level3,OMX_VIDEO_MPEG4ProfileSimple,0}, 8311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel {1200,36000,4000000,OMX_VIDEO_MPEG4Level4a,OMX_VIDEO_MPEG4ProfileSimple,0}, 8411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel {1620,40500,8000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple,0}, 8511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel {3600,108000,12000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple,0}, 8611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel {32400,972000,20000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple,0}, 8711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel {34560,1036800,20000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple,0}, 8811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Please update MPEG4_ASP_START accordingly, while adding new element */ 8911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel {0,0,0,0,0,0}, 9011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 9111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel {99,1485,128000,OMX_VIDEO_MPEG4Level0,OMX_VIDEO_MPEG4ProfileAdvancedSimple,0}, 9211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel {99,1485,128000,OMX_VIDEO_MPEG4Level1,OMX_VIDEO_MPEG4ProfileAdvancedSimple,0}, 9311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel {396,5940,384000,OMX_VIDEO_MPEG4Level2,OMX_VIDEO_MPEG4ProfileAdvancedSimple,0}, 9411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel {396,11880,768000,OMX_VIDEO_MPEG4Level3,OMX_VIDEO_MPEG4ProfileAdvancedSimple,0}, 9511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel {792,23760,3000000,OMX_VIDEO_MPEG4Level4,OMX_VIDEO_MPEG4ProfileAdvancedSimple,0}, 9611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel {1620,48600,8000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileAdvancedSimple,0}, 9711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel {32400,972000,20000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileAdvancedSimple,0}, 9811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel {34560,1036800,20000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileAdvancedSimple,0}, 9911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel {0,0,0,0,0,0}, 10011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}; 10111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 10211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* H264 profile and level table*/ 10311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic const unsigned int h264_profile_level_table[][MAX_PROFILE_PARAMS]= { 104fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel /*max mb per frame, max mb per sec, max bitrate, profile, ignore for h264, dpbmbs*/ 105fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel {99,1485,64000,OMX_VIDEO_AVCLevel1,0,396}, 106fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel {99,1485,128000,OMX_VIDEO_AVCLevel1b,0,396}, 107fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel {396,3000,192000,OMX_VIDEO_AVCLevel11,0,900}, 108fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel {396,6000,384000,OMX_VIDEO_AVCLevel12,0,2376}, 109fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel {396,11880,768000,OMX_VIDEO_AVCLevel13,0,2376}, 110fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel {396,11880,2000000,OMX_VIDEO_AVCLevel2,0,2376}, 111fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel {792,19800,4000000,OMX_VIDEO_AVCLevel21,0,4752}, 112fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel {1620,20250,4000000,OMX_VIDEO_AVCLevel22,0,8100}, 113fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel {1620,40500,10000000,OMX_VIDEO_AVCLevel3,0,8100}, 114fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel {3600,108000,14000000,OMX_VIDEO_AVCLevel31,0,18000}, 115fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel {5120,216000,20000000,OMX_VIDEO_AVCLevel32,0,20480}, 116fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel {8192,245760,20000000,OMX_VIDEO_AVCLevel4,0,32768}, 117fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel {8192,245760,50000000,OMX_VIDEO_AVCLevel41,0,32768}, 118fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel {8704,522240,50000000,OMX_VIDEO_AVCLevel42,0,34816}, 119fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel {22080,589824,135000000,OMX_VIDEO_AVCLevel5,0,110400}, 120fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel {36864,983040,240000000,OMX_VIDEO_AVCLevel51,0,184320}, 121fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel {36864,2073600,240000000,OMX_VIDEO_AVCLevel52,0,184320}, 12211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Please update H264_HP_START accordingly, while adding new element */ 12311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel {0,0,0,0,0,0}, 12411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}; 12511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 12611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* H263 profile and level table*/ 12711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic const unsigned int h263_profile_level_table[][MAX_PROFILE_PARAMS]= { 12811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*max mb per frame, max mb per sec, max bitrate, level, profile, dpbmbs*/ 12911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel {99,1485,64000,OMX_VIDEO_H263Level10,OMX_VIDEO_H263ProfileBaseline,0}, 13011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel {396,5940,128000,OMX_VIDEO_H263Level20,OMX_VIDEO_H263ProfileBaseline,0}, 13111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel {396,11880,384000,OMX_VIDEO_H263Level30,OMX_VIDEO_H263ProfileBaseline,0}, 13211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel {396,11880,2048000,OMX_VIDEO_H263Level40,OMX_VIDEO_H263ProfileBaseline,0}, 13311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel {99,1485,128000,OMX_VIDEO_H263Level45,OMX_VIDEO_H263ProfileBaseline,0}, 13411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel {396,19800,4096000,OMX_VIDEO_H263Level50,OMX_VIDEO_H263ProfileBaseline,0}, 13511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel {810,40500,8192000,OMX_VIDEO_H263Level60,OMX_VIDEO_H263ProfileBaseline,0}, 13611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel {1620,81000,16384000,OMX_VIDEO_H263Level70,OMX_VIDEO_H263ProfileBaseline,0}, 13711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel {32400,972000,20000000,OMX_VIDEO_H263Level70,OMX_VIDEO_H263ProfileBaseline,0}, 13811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel {34560,1036800,20000000,OMX_VIDEO_H263Level70,OMX_VIDEO_H263ProfileBaseline,0}, 13911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel {0,0,0,0,0,0} 14011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}; 14111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 14211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* HEVC profile and level table*/ 14311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic const unsigned int hevc_profile_level_table[][MAX_PROFILE_PARAMS]= { 144fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel /*max mb per frame, max mb per sec, max bitrate, level, ignore profile and dpbmbs for HEVC */ 145fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel {99,1485,128000,OMX_VIDEO_HEVCMainTierLevel1,0,0}, 146fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel {396,11880,1500000,OMX_VIDEO_HEVCMainTierLevel2,0,0}, 147fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel {900,27000,3000000,OMX_VIDEO_HEVCMainTierLevel21,0,0}, 148fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel {2025,60750,6000000,OMX_VIDEO_HEVCMainTierLevel3,0,0}, 149fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel {8640,259200,10000000,OMX_VIDEO_HEVCMainTierLevel31,0,0}, 150fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel {34560,1166400,12000000,OMX_VIDEO_HEVCMainTierLevel4,0,0}, 151fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel {138240,4147200,20000000,OMX_VIDEO_HEVCMainTierLevel41,0,0}, 152fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel {138240,8294400,25000000,OMX_VIDEO_HEVCMainTierLevel5,0,0}, 153fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel {138240,4147200,40000000,OMX_VIDEO_HEVCMainTierLevel51,0,0}, 154fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel {138240,4147200,50000000,OMX_VIDEO_HEVCHighTierLevel41,0,0}, 155fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel {138240,4147200,100000000,OMX_VIDEO_HEVCHighTierLevel5,0,0}, 156fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel {138240,4147200,160000000,OMX_VIDEO_HEVCHighTierLevel51,0,0}, 157fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel {138240,4147200,240000000,OMX_VIDEO_HEVCHighTierLevel52,0,0}, 15811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Please update HEVC_MAIN_START accordingly, while adding new element */ 15911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel {0,0,0,0,0}, 16011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 16111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}; 16211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 16311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 16411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define Log2(number, power) { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) && power < 16) { temp >>=0x1; power++; } } 16511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power); num = q >> power; den = 0x1 << (16 - power); } 16611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 16711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define BUFFER_LOG_LOC "/data/misc/media" 16811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 16911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//constructor 17011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvenc_dev::venc_dev(class omx_venc *venc_class) 17111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 17211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //nothing to do 17311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int i = 0; 17411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_handle = venc_class; 17511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel etb = ebd = ftb = fbd = 0; 17611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_poll_efd = -1; 17711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 17811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 17911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i = 0; i < MAX_PORT; i++) 18011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel streaming[i] = false; 18111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 18211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel stopped = 1; 18311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel paused = false; 18411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_thread_created = false; 18511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_thread_force_stop = false; 18611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel color_format = 0; 18711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel hw_overload = false; 18811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mBatchSize = 0; 1892601808ee2992a94c325d05e4065aba60b01840bThierry Strudel deinterlace_enabled = false; 1902e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel m_roi_enabled = false; 1912e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel pthread_mutex_init(&m_roilock, NULL); 19211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_init(&pause_resume_mlock, NULL); 19311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_cond_init(&pause_resume_cond, NULL); 19411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&input_extradata_info, 0, sizeof(input_extradata_info)); 19511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&output_extradata_info, 0, sizeof(output_extradata_info)); 19611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&idrperiod, 0, sizeof(idrperiod)); 19711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&multislice, 0, sizeof(multislice)); 19811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset (&slice_mode, 0 , sizeof(slice_mode)); 19911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_sVenc_cfg, 0, sizeof(m_sVenc_cfg)); 20011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&rate_ctrl, 0, sizeof(rate_ctrl)); 20111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&bitrate, 0, sizeof(bitrate)); 20211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&intra_period, 0, sizeof(intra_period)); 20311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&codec_profile, 0, sizeof(codec_profile)); 20411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&set_param, 0, sizeof(set_param)); 20511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&time_inc, 0, sizeof(time_inc)); 20611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_sInput_buff_property, 0, sizeof(m_sInput_buff_property)); 20711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_sOutput_buff_property, 0, sizeof(m_sOutput_buff_property)); 20811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&session_qp, 0, sizeof(session_qp)); 2092601808ee2992a94c325d05e4065aba60b01840bThierry Strudel memset(&session_ipb_qp_values, 0, sizeof(session_ipb_qp_values)); 21011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&entropy, 0, sizeof(entropy)); 21111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&dbkfilter, 0, sizeof(dbkfilter)); 21211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&intra_refresh, 0, sizeof(intra_refresh)); 21311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&hec, 0, sizeof(hec)); 21411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&voptimecfg, 0, sizeof(voptimecfg)); 21511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&capability, 0, sizeof(capability)); 21611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&m_debug,0,sizeof(m_debug)); 21711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&hier_layers,0,sizeof(hier_layers)); 21811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is_searchrange_set = false; 21911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enable_mv_narrow_searchrange = false; 22011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel supported_rc_modes = RC_ALL; 22111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&vqzip_sei_info, 0, sizeof(vqzip_sei_info)); 22211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(<rinfo, 0, sizeof(ltrinfo)); 22311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&fd_list, 0, sizeof(fd_list)); 22411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&hybrid_hp, 0, sizeof(hybrid_hp)); 22511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sess_priority.priority = 1; 22611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel operating_rate = 0; 22711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel low_latency_mode = OMX_FALSE; 228fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel memset(&color_space, 0x0, sizeof(color_space)); 229fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel memset(&temporal_layers_config, 0x0, sizeof(temporal_layers_config)); 23011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 23111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char property_value[PROPERTY_VALUE_MAX] = {0}; 23211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.enc.log.in", property_value, "0"); 23311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.in_buffer_log = atoi(property_value); 23411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 23511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.enc.log.out", property_value, "0"); 23611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.out_buffer_log = atoi(property_value); 23711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 23811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.enc.log.extradata", property_value, "0"); 23911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.extradata_log = atoi(property_value); 24011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 24111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _UBWC_ 24211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("debug.gralloc.gfx_ubwc_disable", property_value, "0"); 24311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!(strncmp(property_value, "1", PROPERTY_VALUE_MAX)) || 24411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !(strncmp(property_value, "true", PROPERTY_VALUE_MAX))) { 24511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is_gralloc_source_ubwc = 0; 24611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 24711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is_gralloc_source_ubwc = 1; 24811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 24911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else 25011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is_gralloc_source_ubwc = 0; 25111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 25211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 253fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel property_get("persist.vidc.enc.csc.enable", property_value, "0"); 254fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if(!(strncmp(property_value, "1", PROPERTY_VALUE_MAX)) || 255fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel !(strncmp(property_value, "true", PROPERTY_VALUE_MAX))) { 256fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel is_csc_enabled = 1; 257fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else { 258fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel is_csc_enabled = 0; 259fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 260fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 261fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#ifdef _PQ_ 262fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel property_get("vidc.enc.disable.pq", property_value, "0"); 263fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if(!(strncmp(property_value, "1", PROPERTY_VALUE_MAX)) || 264fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel !(strncmp(property_value, "true", PROPERTY_VALUE_MAX))) { 265fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_pq.is_pq_force_disable = 1; 266fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else { 267fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_pq.is_pq_force_disable = 0; 268fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 269fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#endif // _PQ_ 270fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 27111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel snprintf(m_debug.log_loc, PROPERTY_VALUE_MAX, 27211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "%s", BUFFER_LOG_LOC); 27311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 27411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 27511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvenc_dev::~venc_dev() 27611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 2772e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel if (m_roi_enabled) { 2782e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel std::list<roidata>::iterator iter; 2792e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel pthread_mutex_lock(&m_roilock); 2802e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel for (iter = m_roilist.begin(); iter != m_roilist.end(); iter++) { 2812e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel DEBUG_PRINT_HIGH("roidata with timestamp (%lld) should have been removed already", 2822e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel iter->timestamp); 2832e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel free(iter->info.pRoiMBInfo); 2842e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel } 2852e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel m_roilist.clear(); 2862e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel pthread_mutex_unlock(&m_roilock); 2872e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel } 2882e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel pthread_mutex_destroy(&m_roilock); 28911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 29011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 29111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid* venc_dev::async_venc_message_thread (void *input) 29211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 29311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct venc_msg venc_msg; 29411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_video* omx_venc_base = NULL; 29511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_venc *omx = reinterpret_cast<omx_venc*>(input); 29611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx_venc_base = reinterpret_cast<omx_video*>(input); 29711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE* omxhdr = NULL; 29811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 29911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel prctl(PR_SET_NAME, (unsigned long)"VideoEncCallBackThread", 0, 0, 0); 30011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_plane plane[VIDEO_MAX_PLANES]; 30111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct pollfd pfds[2]; 30211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_buffer v4l2_buf; 30311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_event dqevent; 30411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct statistics stats; 30511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pfds[0].events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI; 30611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pfds[1].events = POLLIN | POLLERR; 30711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pfds[0].fd = omx->handle->m_nDriver_fd; 30811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pfds[1].fd = omx->handle->m_poll_efd; 30911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int error_code = 0,rc=0; 31011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 31111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&stats, 0, sizeof(statistics)); 31211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&v4l2_buf, 0, sizeof(v4l2_buf)); 31311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 31411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (!omx->handle->async_thread_force_stop) { 31511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&omx->handle->pause_resume_mlock); 31611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 31711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->handle->paused) { 31811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_msg.msgcode = VEN_MSG_PAUSE; 31911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_msg.statuscode = VEN_S_SUCCESS; 32011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 32111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->async_message_process(input, &venc_msg) < 0) { 32211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Failed to process pause msg"); 32311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&omx->handle->pause_resume_mlock); 32411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 32511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 32611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 32711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Block here until the IL client resumes us again */ 32811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_cond_wait(&omx->handle->pause_resume_cond, 32911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &omx->handle->pause_resume_mlock); 33011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 33111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_msg.msgcode = VEN_MSG_RESUME; 33211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_msg.statuscode = VEN_S_SUCCESS; 33311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 33411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->async_message_process(input, &venc_msg) < 0) { 33511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Failed to process resume msg"); 33611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&omx->handle->pause_resume_mlock); 33711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 33811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 33911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&stats, 0, sizeof(statistics)); 34011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 34111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 34211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&omx->handle->pause_resume_mlock); 34311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 34411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = poll(pfds, 2, POLL_TIMEOUT); 34511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 34611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!rc) { 34711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Poll timedout, pipeline stalled due to client/firmware ETB: %d, EBD: %d, FTB: %d, FBD: %d", 34811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->handle->etb, omx->handle->ebd, omx->handle->ftb, omx->handle->fbd); 34911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel continue; 35011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (rc < 0 && errno != EINTR && errno != EAGAIN) { 35111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Error while polling: %d, errno = %d", rc, errno); 35211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 35311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 35411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 35511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((pfds[1].revents & POLLIN) || (pfds[1].revents & POLLERR)) { 35611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("async_venc_message_thread interrupted to be exited"); 35711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 35811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 35911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 36011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((pfds[0].revents & POLLIN) || (pfds[0].revents & POLLRDNORM)) { 36111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 36211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.memory = V4L2_MEMORY_USERPTR; 36311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.length = omx->handle->num_output_planes; 36411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.m.planes = plane; 36511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 36611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (!ioctl(pfds[0].fd, VIDIOC_DQBUF, &v4l2_buf)) { 36711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_msg.msgcode=VEN_MSG_OUTPUT_BUFFER_DONE; 36811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_msg.statuscode=VEN_S_SUCCESS; 36911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr=omx_venc_base->m_out_mem_ptr+v4l2_buf.index; 37011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_msg.buf.len= v4l2_buf.m.planes->bytesused; 37111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_msg.buf.offset = v4l2_buf.m.planes->data_offset; 37211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_msg.buf.flags = 0; 37311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_msg.buf.ptrbuffer = (OMX_U8 *)omx_venc_base->m_pOutput_pmem[v4l2_buf.index].buffer; 37411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_msg.buf.clientdata=(void*)omxhdr; 37511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_msg.buf.timestamp = (uint64_t) v4l2_buf.timestamp.tv_sec * (uint64_t) 1000000 + (uint64_t) v4l2_buf.timestamp.tv_usec; 37611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 37711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* TODO: ideally report other types of frames as well 37811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * for now it doesn't look like IL client cares about 37911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * other types 38011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 38111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2_buf.flags & V4L2_QCOM_BUF_FLAG_IDRFRAME) 38211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_msg.buf.flags |= QOMX_VIDEO_PictureTypeIDR; 38311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 38411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2_buf.flags & V4L2_BUF_FLAG_KEYFRAME) 38511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_msg.buf.flags |= OMX_BUFFERFLAG_SYNCFRAME; 38611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 387a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel if (v4l2_buf.flags & V4L2_BUF_FLAG_PFRAME) { 388a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel venc_msg.buf.flags |= OMX_VIDEO_PictureTypeP; 389a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel } else if (v4l2_buf.flags & V4L2_BUF_FLAG_BFRAME) { 390a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel venc_msg.buf.flags |= OMX_VIDEO_PictureTypeB; 391a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel } 392a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel 39311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2_buf.flags & V4L2_QCOM_BUF_FLAG_CODECCONFIG) 39411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_msg.buf.flags |= OMX_BUFFERFLAG_CODECCONFIG; 39511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 39611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2_buf.flags & V4L2_QCOM_BUF_FLAG_EOS) 39711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_msg.buf.flags |= OMX_BUFFERFLAG_EOS; 39811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 39911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->handle->num_output_planes > 1 && v4l2_buf.m.planes->bytesused) 40011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_msg.buf.flags |= OMX_BUFFERFLAG_EXTRADATA; 40111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 40211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omxhdr->nFilledLen) 40311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_msg.buf.flags |= OMX_BUFFERFLAG_ENDOFFRAME; 40411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 40511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->handle->fbd++; 40611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel stats.bytes_generated += venc_msg.buf.len; 40711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 40811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->async_message_process(input,&venc_msg) < 0) { 40911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Wrong ioctl message"); 41011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 41111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 41211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 41311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 41411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 41511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((pfds[0].revents & POLLOUT) || (pfds[0].revents & POLLWRNORM)) { 41611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 41711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.memory = V4L2_MEMORY_USERPTR; 41811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.m.planes = plane; 41911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.length = omx->handle->num_input_planes; 42011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 42111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (!ioctl(pfds[0].fd, VIDIOC_DQBUF, &v4l2_buf)) { 42211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_msg.msgcode=VEN_MSG_INPUT_BUFFER_DONE; 42311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_msg.statuscode=VEN_S_SUCCESS; 42411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omx->handle->ebd++; 42511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 42611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->handle->mBatchSize) { 42711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int bufIndex = omx->handle->mBatchInfo.retrieveBufferAt(v4l2_buf.index); 42811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bufIndex < 0) { 42911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Retrieved invalid buffer %d", v4l2_buf.index); 43011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 43111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 43211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->handle->mBatchInfo.isPending(bufIndex)) { 43311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" EBD for %d [v4l2-id=%d].. batch still pending", 43411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufIndex, v4l2_buf.index); 43511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //do not return to client yet 43611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel continue; 43711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 43811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2_buf.index = bufIndex; 43911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 44011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx_venc_base->mUseProxyColorFormat && !omx_venc_base->mUsesColorConversion) 44111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr = &omx_venc_base->meta_buffer_hdr[v4l2_buf.index]; 44211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 44311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel omxhdr = &omx_venc_base->m_inp_mem_ptr[v4l2_buf.index]; 44411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 44511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_msg.buf.clientdata=(void*)omxhdr; 44611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 44711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("sending EBD %p [id=%d]", omxhdr, v4l2_buf.index); 44811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->async_message_process(input,&venc_msg) < 0) { 44911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Wrong ioctl message"); 45011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 45111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 45211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 45311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 45411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 45511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pfds[0].revents & POLLPRI) { 45611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(pfds[0].fd, VIDIOC_DQEVENT, &dqevent); 45711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 45811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (dqevent.type == V4L2_EVENT_MSM_VIDC_FLUSH_DONE) { 45911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_msg.msgcode = VEN_MSG_FLUSH_INPUT_DONE; 46011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_msg.statuscode = VEN_S_SUCCESS; 46111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 46211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->async_message_process(input,&venc_msg) < 0) { 46311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Wrong ioctl message"); 46411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 46511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 46611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 46711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_msg.msgcode = VEN_MSG_FLUSH_OUPUT_DONE; 46811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_msg.statuscode = VEN_S_SUCCESS; 46911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 47011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->async_message_process(input,&venc_msg) < 0) { 47111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Wrong ioctl message"); 47211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 47311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 47411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_HW_OVERLOAD) { 47511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("HW Overload received"); 47611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_msg.statuscode = VEN_S_EFAIL; 47711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_msg.msgcode = VEN_MSG_HW_OVERLOAD; 47811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 47911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->async_message_process(input,&venc_msg) < 0) { 48011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Wrong ioctl message"); 48111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 48211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 48311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_SYS_ERROR){ 48411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Encoder is in bad state"); 48511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_msg.msgcode = VEN_MSG_INDICATION; 48611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_msg.statuscode=VEN_S_EFAIL; 48711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 48811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (omx->async_message_process(input,&venc_msg) < 0) { 48911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Wrong ioctl message"); 49011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 49111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 49211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 49311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 49411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 49511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* calc avg. fps, bitrate */ 49611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct timeval tv; 49711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel gettimeofday(&tv,NULL); 49811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U64 time_diff = (OMX_U32)((tv.tv_sec * 1000000 + tv.tv_usec) - 49911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (stats.prev_tv.tv_sec * 1000000 + stats.prev_tv.tv_usec)); 50011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (time_diff >= 5000000) { 50111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (stats.prev_tv.tv_sec) { 50211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 num_fbd = omx->handle->fbd - stats.prev_fbd; 50311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel float framerate = num_fbd * 1000000/(float)time_diff; 50411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 bitrate = (stats.bytes_generated * 8/num_fbd) * framerate; 50511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("stats: avg. fps %0.2f, bitrate %d", 50611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel framerate, bitrate); 50711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 50811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel stats.prev_tv = tv; 50911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel stats.bytes_generated = 0; 51011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel stats.prev_fbd = omx->handle->fbd; 51111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 51211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 51311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 51411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 51511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("omx_venc: Async Thread exit"); 51611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return NULL; 51711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 51811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 51911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic const int event_type[] = { 52011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel V4L2_EVENT_MSM_VIDC_FLUSH_DONE, 52111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel V4L2_EVENT_MSM_VIDC_SYS_ERROR 52211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}; 52311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 52411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic OMX_ERRORTYPE subscribe_to_events(int fd) 52511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 52611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 52711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_event_subscription sub; 52811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int array_sz = sizeof(event_type)/sizeof(int); 52911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int i,rc; 53011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&sub, 0, sizeof(sub)); 53111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 53211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (fd < 0) { 53311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid input: %d", fd); 53411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 53511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 53611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 53711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i = 0; i < array_sz; ++i) { 53811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&sub, 0, sizeof(sub)); 53911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sub.type = event_type[i]; 54011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(fd, VIDIOC_SUBSCRIBE_EVENT, &sub); 54111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 54211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 54311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to subscribe event: 0x%x", sub.type); 54411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 54511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 54611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 54711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 54811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (i < array_sz) { 54911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (--i; i >=0 ; i--) { 55011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&sub, 0, sizeof(sub)); 55111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sub.type = event_type[i]; 55211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub); 55311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 55411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) 55511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x", sub.type); 55611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 55711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 55811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel eRet = OMX_ErrorNotImplemented; 55911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 56011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 56111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 56211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 56311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 5642e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudelvoid venc_dev::get_roi_for_timestamp(struct roidata &roi, OMX_TICKS timestamp) 5652e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel{ 5662e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel std::list<roidata>::iterator iter; 5672e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel bool found = false; 5682e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel 5692e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel memset(&roi, 0, sizeof(struct roidata)); 5702e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel roi.dirty = false; 5712e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel 5722e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel /* 5732e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel * look for the roi data which has timestamp nearest and 5742e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel * lower than the etb timestamp, we should not take the 5752e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel * roi data which has the timestamp greater than etb timestamp. 5762e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel */ 5772e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel pthread_mutex_lock(&m_roilock); 5782e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel iter = m_roilist.begin(); 5792e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel while (iter != m_roilist.end()) { 5802e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel if (iter->timestamp <= timestamp) { 5812e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel if (found) { 5822e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel /* we found roidata in previous iteration already and got another 5832e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel * roidata in this iteration, so we will use this iteration's 5842e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel * roidata and free the previous roidata which is no longer used. 5852e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel */ 5862e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel DEBUG_PRINT_LOW("freeing unused roidata with timestamp %lld us", roi.timestamp); 5872e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel free(roi.info.pRoiMBInfo); 5882e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel } 5892e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel found = true; 5902e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel roi = *iter; 5912e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel /* we got roidata so erase the elment in the roi list. 5922e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel * after list erase iterator will point to next element 5932e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel * so we don't need to increment iter after erase. 5942e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel */ 5952e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel iter = m_roilist.erase(iter); 5962e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel } else { 5972e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel iter++; 5982e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel } 5992e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel } 6002e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel if (found) { 6012e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel DEBUG_PRINT_LOW("found roidata with timestamp %lld us", roi.timestamp); 6022e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel } 6032e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel pthread_mutex_unlock(&m_roilock); 6042e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel} 6052e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel 60611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint venc_dev::append_mbi_extradata(void *dst, struct msm_vidc_extradata_header* src) 60711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 60811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_EXTRADATA_MBINFO *mbi = (OMX_QCOM_EXTRADATA_MBINFO *)dst; 60911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 61011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!dst || !src) 61111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 0; 61211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 61311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* TODO: Once Venus 3XX target names are known, nFormat should 2 for those 61411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * targets, since the payload format will be different */ 61511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mbi->nFormat = 2; 61611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mbi->nDataSize = src->data_size; 61711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memcpy(&mbi->data, &src->data, src->data_size); 61811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 61911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return mbi->nDataSize + sizeof(*mbi); 62011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 62111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 622a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudelinline int get_yuv_size(unsigned long fmt, int width, int height) { 623a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel unsigned int y_stride, uv_stride, y_sclines, 624a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel uv_sclines, y_plane, uv_plane; 625a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel unsigned int y_ubwc_plane = 0, uv_ubwc_plane = 0; 626a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel unsigned size = 0; 627a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel 628a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel y_stride = VENUS_Y_STRIDE(fmt, width); 629a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel uv_stride = VENUS_UV_STRIDE(fmt, width); 630a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel y_sclines = VENUS_Y_SCANLINES(fmt, height); 631a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel uv_sclines = VENUS_UV_SCANLINES(fmt, height); 632a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel 633a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel switch (fmt) { 634a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel case COLOR_FMT_NV12: 635a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel y_plane = y_stride * y_sclines; 636a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel uv_plane = uv_stride * uv_sclines; 637a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel size = MSM_MEDIA_ALIGN(y_plane + uv_plane, 4096); 638a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel break; 639a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel default: 640a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel break; 641a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel } 642a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel return size; 643a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel} 644a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel 645fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelbool venc_dev::handle_input_extradata(struct v4l2_buffer buf) 64611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 64711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OTHER_EXTRADATATYPE *p_extra = NULL; 648a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel unsigned int consumed_len = 0, filled_len = 0; 649a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel unsigned int yuv_size = 0, index = 0; 650a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel int enable = 0, i = 0, size = 0; 651a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel unsigned char *pVirt = NULL; 652a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel int height = m_sVenc_cfg.input_height; 653a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel int width = m_sVenc_cfg.input_width; 654fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel OMX_TICKS nTimeStamp = buf.timestamp.tv_sec * 1000000 + buf.timestamp.tv_usec; 655fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel int fd = buf.m.planes[0].reserved[0]; 656a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel bool vqzip_sei_found = false; 65711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 658fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (!EXTRADATA_IDX(num_input_planes)) { 65911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Input extradata not enabled"); 66011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 66111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 66211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 66311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!input_extradata_info.uaddr) { 66411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Extradata buffers not allocated\n"); 665a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel return true; 66611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 66711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 668fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("Processing Extradata for Buffer = %lld", nTimeStamp); // Useful for debugging 669fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 670a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel if (m_sVenc_cfg.inputformat == V4L2_PIX_FMT_NV12 || m_sVenc_cfg.inputformat == V4L2_PIX_FMT_NV21) { 671a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel size = VENUS_BUFFER_SIZE(COLOR_FMT_NV12, width, height); 672a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel yuv_size = get_yuv_size(COLOR_FMT_NV12, width, height); 673a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel pVirt = (unsigned char *)mmap(NULL, size, PROT_READ|PROT_WRITE,MAP_SHARED, fd, 0); 674a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel if (pVirt == MAP_FAILED) { 675a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel DEBUG_PRINT_ERROR("%s Failed to mmap",__func__); 676a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel return false; 677a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel } 678a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel p_extra = (OMX_OTHER_EXTRADATATYPE *) ((unsigned long)(pVirt + yuv_size + 3)&(~3)); 679a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel } 68011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 6812601808ee2992a94c325d05e4065aba60b01840bThierry Strudel index = venc_get_index_from_fd(input_extradata_info.m_ion_dev,fd); 68211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char *p_extradata = input_extradata_info.uaddr + index * input_extradata_info.buffer_size; 68311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OTHER_EXTRADATATYPE *data = (struct OMX_OTHER_EXTRADATATYPE *)p_extradata; 684fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel memset((void *)(data), 0, (input_extradata_info.buffer_size)); // clear stale data in current buffer 68511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 686a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel while (p_extra && (consumed_len + sizeof(OMX_OTHER_EXTRADATATYPE)) <= (size - yuv_size) 687a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel && (consumed_len + p_extra->nSize) <= (size - yuv_size) 688a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel && (filled_len + sizeof(OMX_OTHER_EXTRADATATYPE) <= input_extradata_info.buffer_size) 689a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel && (filled_len + p_extra->nSize <= input_extradata_info.buffer_size) 690a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel && (p_extra->eType != (OMX_EXTRADATATYPE)MSM_VIDC_EXTRADATA_NONE)) { 69111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 692a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel DEBUG_PRINT_LOW("Extradata Type = 0x%x", (OMX_QCOM_EXTRADATATYPE)p_extra->eType); 693a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel switch ((OMX_QCOM_EXTRADATATYPE)p_extra->eType) { 694a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel case OMX_ExtraDataFrameDimension: 695a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel { 696a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel struct msm_vidc_extradata_index *payload; 697a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel OMX_QCOM_EXTRADATA_FRAMEDIMENSION *framedimension_format; 698a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel data->nSize = (sizeof(OMX_OTHER_EXTRADATATYPE) + sizeof(struct msm_vidc_extradata_index) + 3)&(~3); 69911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel data->nVersion.nVersion = OMX_SPEC_VERSION; 70011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel data->nPortIndex = 0; 701a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel data->eType = (OMX_EXTRADATATYPE)MSM_VIDC_EXTRADATA_INDEX; 702a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel data->nDataSize = sizeof(struct msm_vidc_input_crop_payload); 703a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel framedimension_format = (OMX_QCOM_EXTRADATA_FRAMEDIMENSION *)p_extra->data; 704a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel payload = (struct msm_vidc_extradata_index *)(data->data); 705a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel payload->type = (msm_vidc_extradata_type)MSM_VIDC_EXTRADATA_INPUT_CROP; 706a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel payload->input_crop.left = framedimension_format->nDecWidth; 707a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel payload->input_crop.top = framedimension_format->nDecHeight; 708a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel payload->input_crop.width = framedimension_format->nActualWidth; 709a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel payload->input_crop.height = framedimension_format->nActualHeight; 710a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel DEBUG_PRINT_LOW("Height = %d Width = %d Actual Height = %d Actual Width = %d", 711a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel framedimension_format->nDecWidth, framedimension_format->nDecHeight, 712a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel framedimension_format->nActualWidth, framedimension_format->nActualHeight); 713a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel filled_len += data->nSize; 714a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize); 715a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel break; 716fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 717a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel case OMX_ExtraDataQP: 718a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel { 719a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel OMX_QCOM_EXTRADATA_QP * qp_payload = NULL; 720a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel struct msm_vidc_frame_qp_payload *payload; 721a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel data->nSize = (sizeof(OMX_OTHER_EXTRADATATYPE) + sizeof(struct msm_vidc_frame_qp_payload) + 3)&(~3); 722fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel data->nVersion.nVersion = OMX_SPEC_VERSION; 723fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel data->nPortIndex = 0; 724a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel data->eType = (OMX_EXTRADATATYPE)MSM_VIDC_EXTRADATA_FRAME_QP; 725a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel data->nDataSize = sizeof(struct msm_vidc_frame_qp_payload); 726a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel qp_payload = (OMX_QCOM_EXTRADATA_QP *)p_extra->data; 727a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel payload = (struct msm_vidc_frame_qp_payload *)(data->data); 728a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel payload->frame_qp = qp_payload->nQP; 729a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel DEBUG_PRINT_LOW("Frame QP = %d", payload->frame_qp); 730a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel filled_len += data->nSize; 731a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize); 732a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel break; 733a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel } 734a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel case OMX_ExtraDataVQZipSEI: 735a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel DEBUG_PRINT_LOW("VQZIP SEI Found "); 736a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel input_extradata_info.vqzip_sei_found = true; 737a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel break; 738a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel case OMX_ExtraDataFrameInfo: 739a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel { 740a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL; 741a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)(p_extra->data); 742a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel if (frame_info->ePicType == OMX_VIDEO_PictureTypeI) { 743a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel if (venc_set_intra_vop_refresh((OMX_BOOL)true) == false) 744a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel DEBUG_PRINT_ERROR("%s Error in requesting I Frame ", __func__); 745a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel } 746a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel break; 747a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel } 748a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel default: 749a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel DEBUG_PRINT_HIGH("Unknown Extradata 0x%x", (OMX_QCOM_EXTRADATATYPE)p_extra->eType); 750a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel break; 751a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel } 752a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel 753a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel consumed_len += p_extra->nSize; 754a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel p_extra = (OMX_OTHER_EXTRADATATYPE *)((char *)p_extra + p_extra->nSize); 755a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel } 756a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel 757a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel /* 758a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel * Below code is based on these points. 759a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel * 1) _PQ_ not defined : 760a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel * a) Send data to Venus as ROI. 761a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel * b) ROI enabled : Processed under unlocked context. 762a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel * c) ROI disabled : Nothing to fill. 763a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel * d) pq enabled : Not possible. 764a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel * 2) _PQ_ defined, but pq is not enabled : 765a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel * a) Send data to Venus as ROI. 766a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel * b) ROI enabled and dirty : Copy the data to Extradata buffer here 767a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel * b) ROI enabled and no dirty : Nothing to fill 768a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel * d) ROI disabled : Nothing to fill 769a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel * 3) _PQ_ defined and pq is enabled : 770a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel * a) Send data to Venus as PQ. 771a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel * b) ROI enabled and dirty : Copy the ROI contents to pq_roi buffer 772a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel * c) ROI enabled and no dirty : pq_roi is already memset. Hence nothing to do here 773a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel * d) ROI disabled : Just PQ data will be filled by GPU. 774a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel * 4) Normal ROI handling is in #else part as PQ can introduce delays. 775a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel * By this time if client sets next ROI, then we shouldn't process new ROI here. 776a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel */ 777fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 7782e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel struct roidata roi; 7792e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel memset(&roi, 0, sizeof(struct roidata)); 7802e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel roi.dirty = false; 7812e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel if (m_roi_enabled) { 7822e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel get_roi_for_timestamp(roi, nTimeStamp); 7832e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel } 7842e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel 785a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel#ifdef _PQ_ 786a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel pthread_mutex_lock(&m_pq.lock); 787a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel if (m_pq.is_pq_enabled) { 788a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel if (roi.dirty) { 789fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel struct msm_vidc_roi_qp_payload *roiData = 790a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel (struct msm_vidc_roi_qp_payload *)(m_pq.roi_extradata_info.uaddr); 791fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel roiData->upper_qp_offset = roi.info.nUpperQpOffset; 792fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel roiData->lower_qp_offset = roi.info.nLowerQpOffset; 793fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel roiData->b_roi_info = roi.info.bUseRoiInfo; 794fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel roiData->mbi_info_size = roi.info.nRoiMBInfoSize; 795a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel DEBUG_PRINT_HIGH("Using PQ + ROI QP map: Enable = %d", roiData->b_roi_info); 796fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel memcpy(roiData->data, roi.info.pRoiMBInfo, roi.info.nRoiMBInfoSize); 79711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 798a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel filled_len += sizeof(msm_vidc_extradata_header) - sizeof(unsigned int); 799a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel data->nDataSize = m_pq.fill_pq_stats(buf, filled_len); 800a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel data->nSize = ALIGN(sizeof(msm_vidc_extradata_header) + data->nDataSize, 4); 801a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel data->eType = (OMX_EXTRADATATYPE)MSM_VIDC_EXTRADATA_PQ_INFO; 8022e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize); 803a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel } else { 8042e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel if (roi.dirty) { 8052e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel data->nSize = ALIGN(sizeof(OMX_OTHER_EXTRADATATYPE) + 8062e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel sizeof(struct msm_vidc_roi_qp_payload) + 8072e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel roi.info.nRoiMBInfoSize - 2 * sizeof(unsigned int), 4); 8082e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel data->nVersion.nVersion = OMX_SPEC_VERSION; 8092e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel data->nPortIndex = 0; 8102e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel data->eType = (OMX_EXTRADATATYPE)MSM_VIDC_EXTRADATA_ROI_QP; 8112e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel data->nDataSize = sizeof(struct msm_vidc_roi_qp_payload); 8122e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel struct msm_vidc_roi_qp_payload *roiData = 8132e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel (struct msm_vidc_roi_qp_payload *)(data->data); 8142e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel roiData->upper_qp_offset = roi.info.nUpperQpOffset; 8152e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel roiData->lower_qp_offset = roi.info.nLowerQpOffset; 8162e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel roiData->b_roi_info = roi.info.bUseRoiInfo; 8172e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel roiData->mbi_info_size = roi.info.nRoiMBInfoSize; 8182e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel DEBUG_PRINT_HIGH("Using ROI QP map: Enable = %d", roiData->b_roi_info); 8192e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel memcpy(roiData->data, roi.info.pRoiMBInfo, roi.info.nRoiMBInfoSize); 8202e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize); 8212e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel } 822a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel } 823a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel pthread_mutex_unlock(&m_pq.lock); 824a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel#else // _PQ_ 825a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel if (roi.dirty) { 826a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel data->nSize = ALIGN(sizeof(OMX_OTHER_EXTRADATATYPE) + 827a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel sizeof(struct msm_vidc_roi_qp_payload) + 828a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel roi.info.nRoiMBInfoSize - 2 * sizeof(unsigned int), 4); 829a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel data->nVersion.nVersion = OMX_SPEC_VERSION; 830a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel data->nPortIndex = 0; 831a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel data->eType = (OMX_EXTRADATATYPE)MSM_VIDC_EXTRADATA_ROI_QP; 832a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel data->nDataSize = sizeof(struct msm_vidc_roi_qp_payload); 833a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel struct msm_vidc_roi_qp_payload *roiData = 834a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel (struct msm_vidc_roi_qp_payload *)(data->data); 835a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel roiData->upper_qp_offset = roi.info.nUpperQpOffset; 836a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel roiData->lower_qp_offset = roi.info.nLowerQpOffset; 837a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel roiData->b_roi_info = roi.info.bUseRoiInfo; 838a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel roiData->mbi_info_size = roi.info.nRoiMBInfoSize; 839a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel DEBUG_PRINT_HIGH("Using ROI QP map: Enable = %d", roiData->b_roi_info); 840a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel memcpy(roiData->data, roi.info.pRoiMBInfo, roi.info.nRoiMBInfoSize); 841a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize); 842a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel } 843fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#endif // _PQ_ 844fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8452e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel if (m_roi_enabled) { 8462e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel if (roi.dirty) { 8472e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel DEBUG_PRINT_LOW("free roidata with timestamp %lld us", roi.timestamp); 8482e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel free(roi.info.pRoiMBInfo); 8492e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel roi.dirty = false; 8502e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel } 8512e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel } 8522e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel 853fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#ifdef _VQZIP_ 854fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (vqzip_sei_info.enabled && !input_extradata_info.vqzip_sei_found) { 855fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("VQZIP is enabled, But no VQZIP SEI found. Rejecting the session"); 856a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel if (pVirt) 857a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel munmap(pVirt, size); 858a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel return false; //This should be treated as fatal error 859fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 860a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel if (vqzip_sei_info.enabled && pVirt) { 861fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel data->nSize = (sizeof(OMX_OTHER_EXTRADATATYPE) + sizeof(struct VQZipStats) + 3)&(~3); 862fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel data->nVersion.nVersion = OMX_SPEC_VERSION; 863fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel data->nPortIndex = 0; 864fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel data->eType = (OMX_EXTRADATATYPE)MSM_VIDC_EXTRADATA_YUVSTATS_INFO; 865fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel data->nDataSize = sizeof(struct VQZipStats); 866fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel vqzip.fill_stats_data((void*)pVirt, (void*) data->data); 867fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize); 868fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 86911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 87011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel data->nSize = sizeof(OMX_OTHER_EXTRADATATYPE); 87111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel data->nVersion.nVersion = OMX_SPEC_VERSION; 87211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel data->eType = OMX_ExtraDataNone; 87311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel data->nDataSize = 0; 87411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel data->data[0] = 0; 87511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 876a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel if (pVirt) 877a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel munmap(pVirt, size); 878a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel 87911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 88011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 88111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 88211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::handle_output_extradata(void *buffer, int index) 88311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 88411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BUFFERHEADERTYPE *p_bufhdr = (OMX_BUFFERHEADERTYPE *) buffer; 88511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OTHER_EXTRADATATYPE *p_extra = NULL; 88611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 88711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!output_extradata_info.uaddr) { 88811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Extradata buffers not allocated\n"); 88911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 89011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 89111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 89211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra = (OMX_OTHER_EXTRADATATYPE *)ALIGN(p_bufhdr->pBuffer + 89311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_bufhdr->nOffset + p_bufhdr->nFilledLen, 4); 89411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 89511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (output_extradata_info.buffer_size > 89611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_bufhdr->nAllocLen - ALIGN(p_bufhdr->nOffset + p_bufhdr->nFilledLen, 4)) { 89711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Insufficient buffer size for extradata"); 89811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra = NULL; 89911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 90011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (sizeof(msm_vidc_extradata_header) != sizeof(OMX_OTHER_EXTRADATATYPE)) { 90111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* A lot of the code below assumes this condition, so error out if it's not met */ 90211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Extradata ABI mismatch"); 90311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 90411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 90511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 90611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct msm_vidc_extradata_header *p_extradata = NULL; 90711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel do { 90811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extradata = (struct msm_vidc_extradata_header *) (p_extradata ? 90911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((char *)p_extradata) + p_extradata->size : 91011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_extradata_info.uaddr + index * output_extradata_info.buffer_size); 91111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 91211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (p_extradata->type) { 91311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_EXTRADATA_METADATA_MBI: 91411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 91511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 payloadSize = append_mbi_extradata(&p_extra->data, p_extradata); 91611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra->nSize = ALIGN(sizeof(OMX_OTHER_EXTRADATATYPE) + payloadSize, 4); 91711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra->nVersion.nVersion = OMX_SPEC_VERSION; 91811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra->nPortIndex = OMX_DirOutput; 91911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataVideoEncoderMBInfo; 92011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra->nDataSize = payloadSize; 92111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 92211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 92311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_EXTRADATA_METADATA_LTR: 92411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 92511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra->nSize = ALIGN(sizeof(OMX_OTHER_EXTRADATATYPE) + p_extradata->data_size, 4); 92611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra->nVersion.nVersion = OMX_SPEC_VERSION; 92711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra->nPortIndex = OMX_DirOutput; 92811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra->eType = (OMX_EXTRADATATYPE) OMX_ExtraDataVideoLTRInfo; 92911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra->nDataSize = p_extradata->data_size; 9302e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel memcpy(p_extra->data, p_extradata->data, p_extradata->data_size); 9312e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel DEBUG_PRINT_LOW("LTRInfo Extradata = 0x%x", *((OMX_U32 *)p_extra->data)); 93211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 93311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 93411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case MSM_VIDC_EXTRADATA_NONE: 93511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra->nSize = ALIGN(sizeof(OMX_OTHER_EXTRADATATYPE), 4); 93611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra->nVersion.nVersion = OMX_SPEC_VERSION; 93711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra->nPortIndex = OMX_DirOutput; 93811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra->eType = OMX_ExtraDataNone; 93911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra->nDataSize = 0; 94011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 94111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 94211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* No idea what this stuff is, just skip over it */ 94311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Found an unrecognised extradata (%x) ignoring it", 94411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extradata->type); 94511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel continue; 94611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 94711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 94811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra = (OMX_OTHER_EXTRADATATYPE *)(((char *)p_extra) + p_extra->nSize); 94911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } while (p_extradata->type != MSM_VIDC_EXTRADATA_NONE); 95011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 95111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Just for debugging: Traverse the list of extra datas and spit it out onto log */ 95211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra = (OMX_OTHER_EXTRADATATYPE *)ALIGN(p_bufhdr->pBuffer + 95311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_bufhdr->nOffset + p_bufhdr->nFilledLen, 4); 95411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while(p_extra->eType != OMX_ExtraDataNone) 95511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 95611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("[%p/%u] found extradata type %x of size %u (%u) at %p", 95711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_bufhdr->pBuffer, (unsigned int)p_bufhdr->nFilledLen, p_extra->eType, 95811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)p_extra->nSize, (unsigned int)p_extra->nDataSize, p_extra); 95911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 96011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) + 96111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra->nSize); 96211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 96311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 96411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 96511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 96611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 96711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint venc_dev::venc_set_format(int format) 96811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 96911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = true; 97011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 97111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (format) { 97211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel color_format = format; 97311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 97411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (color_format) { 97511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case NV12_128m: 97611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return venc_set_color_format((OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m); 97711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 97811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 97911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 98011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 98111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 98211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel color_format = 0; 98311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = false; 98411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 98511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 98611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 98711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 98811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 989b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry StrudelOMX_ERRORTYPE venc_dev::allocate_extradata(struct extradata_buffer_info *extradata_info, int flags) 99011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 99111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (extradata_info->allocated) { 99211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("2nd allocation return for port = %d",extradata_info->port_index); 99311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 99411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 99511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 99611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 99711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 99811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (extradata_info->buffer_size) { 99911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (extradata_info->ion.ion_alloc_data.handle) { 100011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel munmap((void *)extradata_info->uaddr, extradata_info->size); 100111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(extradata_info->ion.fd_ion_data.fd); 100211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_handle->free_ion_memory(&extradata_info->ion); 100311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 100411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 100511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extradata_info->size = (extradata_info->size + 4095) & (~4095); 100611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 100711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extradata_info->ion.ion_device_fd = venc_handle->alloc_map_ion_memory( 100811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extradata_info->size, 100911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel &extradata_info->ion.ion_alloc_data, 1010b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel &extradata_info->ion.fd_ion_data, flags); 101111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1012fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 101311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (extradata_info->ion.ion_device_fd < 0) { 101411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to alloc extradata memory\n"); 101511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 101611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 101711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 101811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extradata_info->uaddr = (char *)mmap(NULL, 101911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extradata_info->size, 102011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PROT_READ|PROT_WRITE, MAP_SHARED, 102111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extradata_info->ion.fd_ion_data.fd , 0); 102211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 102311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (extradata_info->uaddr == MAP_FAILED) { 102411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to map extradata memory\n"); 102511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(extradata_info->ion.fd_ion_data.fd); 102611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_handle->free_ion_memory(&extradata_info->ion); 102711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorInsufficientResources; 102811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 10292601808ee2992a94c325d05e4065aba60b01840bThierry Strudel extradata_info->m_ion_dev = open("/dev/ion", O_RDONLY); 103011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 103111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 103211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 103311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extradata_info->allocated = OMX_TRUE; 103411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 103511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 103611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 103742adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudelvoid venc_dev::free_extradata(struct extradata_buffer_info *extradata_info) 103811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 103911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 104011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 104142adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel if (extradata_info == NULL) { 104242adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel return; 104311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 104411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 104542adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel if (extradata_info->uaddr) { 104642adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel munmap((void *)extradata_info->uaddr, extradata_info->size); 104742adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel extradata_info->uaddr = NULL; 104842adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel close(extradata_info->ion.fd_ion_data.fd); 104942adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel venc_handle->free_ion_memory(&extradata_info->ion); 105011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 105111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 105242adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel if (extradata_info->m_ion_dev) 105342adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel close(extradata_info->m_ion_dev); 10542601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 105542adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel memset(extradata_info, 0, sizeof(*extradata_info)); 105642adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel extradata_info->ion.fd_ion_data.fd = -1; 105742adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel extradata_info->allocated = OMX_FALSE; 105811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 105942adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel#endif // USE_ION 106042adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel} 1061fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 106242adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudelvoid venc_dev::free_extradata_all() 106342adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel{ 106442adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel free_extradata(&output_extradata_info); 106542adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel free_extradata(&input_extradata_info); 106642adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel#ifdef _PQ_ 106742adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel free_extradata(&m_pq.roi_extradata_info); 1068fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#endif // _PQ_ 106911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 107011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 107111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_get_output_log_flag() 107211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 107311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return (m_debug.out_buffer_log == 1); 107411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 107511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 107611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint venc_dev::venc_output_log_buffers(const char *buffer_addr, int buffer_len) 107711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 10782601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (venc_handle->is_secure_session()) { 10792601808ee2992a94c325d05e4065aba60b01840bThierry Strudel DEBUG_PRINT_ERROR("logging secure output buffers is not allowed!"); 10802601808ee2992a94c325d05e4065aba60b01840bThierry Strudel return -1; 10812601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 10822601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 108311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_debug.outfile) { 108411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int size = 0; 108511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) { 108611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel size = snprintf(m_debug.outfile_name, PROPERTY_VALUE_MAX, "%s/output_enc_%lu_%lu_%p.m4v", 108711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, this); 108811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) { 108911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel size = snprintf(m_debug.outfile_name, PROPERTY_VALUE_MAX, "%s/output_enc_%lu_%lu_%p.264", 109011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, this); 109111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_HEVC) { 109211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel size = snprintf(m_debug.outfile_name, PROPERTY_VALUE_MAX, "%s/output_enc_%ld_%ld_%p.265", 109311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, this); 109411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263) { 109511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel size = snprintf(m_debug.outfile_name, PROPERTY_VALUE_MAX, "%s/output_enc_%lu_%lu_%p.263", 109611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, this); 109711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8) { 109811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel size = snprintf(m_debug.outfile_name, PROPERTY_VALUE_MAX, "%s/output_enc_%lu_%lu_%p.ivf", 109911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, this); 110011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 110111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((size > PROPERTY_VALUE_MAX) && (size < 0)) { 110211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to open output file: %s for logging size:%d", 110311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.outfile_name, size); 110411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 110511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.outfile = fopen(m_debug.outfile_name, "ab"); 110611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_debug.outfile) { 110711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to open output file: %s for logging errno:%d", 110811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.outfile_name, errno); 110911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.outfile_name[0] = '\0'; 111011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return -1; 111111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 111211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 111311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug.outfile && buffer_len) { 111411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("%s buffer_len:%d", __func__, buffer_len); 111511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fwrite(buffer_addr, buffer_len, 1, m_debug.outfile); 111611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 111711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 0; 111811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 111911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 112011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint venc_dev::venc_extradata_log_buffers(char *buffer_addr) 112111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 112211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_debug.extradatafile && m_debug.extradata_log) { 112311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int size = 0; 112411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) { 1125fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel size = snprintf(m_debug.extradatafile_name, PROPERTY_VALUE_MAX, "%s/extradata_enc_%lu_%lu_%p.bin", 112611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, this); 112711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) { 1128fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel size = snprintf(m_debug.extradatafile_name, PROPERTY_VALUE_MAX, "%s/extradata_enc_%lu_%lu_%p.bin", 112911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, this); 113011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_HEVC) { 1131fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel size = snprintf(m_debug.extradatafile_name, PROPERTY_VALUE_MAX, "%s/extradata_enc_%lu_%lu_%p.bin", 113211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, this); 113311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263) { 1134fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel size = snprintf(m_debug.extradatafile_name, PROPERTY_VALUE_MAX, "%s/extradata_enc_%lu_%lu_%p.bin", 113511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, this); 113611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8) { 1137fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel size = snprintf(m_debug.extradatafile_name, PROPERTY_VALUE_MAX, "%s/extradata_enc_%lu_%lu_%p.bin", 113811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, this); 113911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 114011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((size > PROPERTY_VALUE_MAX) && (size < 0)) { 114111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to open extradata file: %s for logging size:%d", 114211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.extradatafile_name, size); 114311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 114411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 114511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.extradatafile = fopen(m_debug.extradatafile_name, "ab"); 114611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_debug.extradatafile) { 114711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to open extradata file: %s for logging errno:%d", 114811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.extradatafile_name, errno); 114911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.extradatafile_name[0] = '\0'; 115011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return -1; 115111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 115211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 115311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1154fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (m_debug.extradatafile && buffer_addr) { 115511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_OTHER_EXTRADATATYPE *p_extra = NULL; 115611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel do { 115711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel p_extra = (OMX_OTHER_EXTRADATATYPE *)(!p_extra ? buffer_addr : 115811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((char *)p_extra) + p_extra->nSize); 115911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fwrite(p_extra, p_extra->nSize, 1, m_debug.extradatafile); 116011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } while (p_extra->eType != OMX_ExtraDataNone); 116111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 116211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 0; 116311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 116411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 116511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint venc_dev::venc_input_log_buffers(OMX_BUFFERHEADERTYPE *pbuffer, int fd, int plane_offset, 116611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long inputformat) { 11672601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (venc_handle->is_secure_session()) { 11682601808ee2992a94c325d05e4065aba60b01840bThierry Strudel DEBUG_PRINT_ERROR("logging secure input buffers is not allowed!"); 11692601808ee2992a94c325d05e4065aba60b01840bThierry Strudel return -1; 11702601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 11712601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 117211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_debug.infile) { 117311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int size = snprintf(m_debug.infile_name, PROPERTY_VALUE_MAX, "%s/input_enc_%lu_%lu_%p.yuv", 117411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.log_loc, m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, this); 117511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((size > PROPERTY_VALUE_MAX) && (size < 0)) { 117611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to open output file: %s for logging size:%d", 117711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.infile_name, size); 117811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 117911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.infile = fopen (m_debug.infile_name, "ab"); 118011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_debug.infile) { 118111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to open input file: %s for logging", m_debug.infile_name); 118211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.infile_name[0] = '\0'; 118311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return -1; 118411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 118511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 118611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 118711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug.infile && pbuffer && pbuffer->nFilledLen) { 118811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int stride, scanlines; 118911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int color_format; 119011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long i, msize; 119111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned char *pvirt = NULL, *ptemp = NULL; 119211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned char *temp = (unsigned char *)pbuffer->pBuffer; 119311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 119411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (inputformat) { 119511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_PIX_FMT_NV12: 119611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel color_format = COLOR_FMT_NV12; 119711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 119811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_PIX_FMT_NV12_UBWC: 119911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel color_format = COLOR_FMT_NV12_UBWC; 120011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 120111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_PIX_FMT_RGB32: 120211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel color_format = COLOR_FMT_RGBA8888; 120311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 120411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_PIX_FMT_RGBA8888_UBWC: 120511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel color_format = COLOR_FMT_RGBA8888_UBWC; 120611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 120711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 120811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel color_format = COLOR_FMT_NV12; 120911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Default format NV12 is set for logging [%lu]", inputformat); 121011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 121111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 121211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 121311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel msize = VENUS_BUFFER_SIZE(color_format, m_sVenc_cfg.input_width, m_sVenc_cfg.input_height); 121411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel const unsigned int extra_size = VENUS_EXTRADATA_SIZE(m_sVenc_cfg.input_width, m_sVenc_cfg.input_height); 121511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 121611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (metadatamode == 1) { 121711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pvirt= (unsigned char *)mmap(NULL, msize, PROT_READ|PROT_WRITE,MAP_SHARED, fd, plane_offset); 121811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pvirt == MAP_FAILED) { 121911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("%s mmap failed", __func__); 122011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return -1; 122111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 122211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ptemp = pvirt; 122311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 122411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ptemp = temp; 122511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 122611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 122711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (color_format == COLOR_FMT_NV12) { 122811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel stride = VENUS_Y_STRIDE(color_format, m_sVenc_cfg.input_width); 122911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel scanlines = VENUS_Y_SCANLINES(color_format, m_sVenc_cfg.input_height); 123011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 123111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i = 0; i < m_sVenc_cfg.input_height; i++) { 123211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fwrite(ptemp, m_sVenc_cfg.input_width, 1, m_debug.infile); 123311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ptemp += stride; 123411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 123511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (metadatamode == 1) { 123611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ptemp = pvirt + (stride * scanlines); 123711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 123811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ptemp = (unsigned char *)pbuffer->pBuffer + (stride * scanlines); 123911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 124011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i = 0; i < m_sVenc_cfg.input_height/2; i++) { 124111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fwrite(ptemp, m_sVenc_cfg.input_width, 1, m_debug.infile); 124211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ptemp += stride; 124311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 124411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (color_format == COLOR_FMT_RGBA8888) { 124511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel stride = VENUS_RGB_STRIDE(color_format, m_sVenc_cfg.input_width); 124611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel scanlines = VENUS_RGB_SCANLINES(color_format, m_sVenc_cfg.input_height); 124711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 124811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i = 0; i < m_sVenc_cfg.input_height; i++) { 124911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fwrite(ptemp, m_sVenc_cfg.input_width * 4, 1, m_debug.infile); 125011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ptemp += stride; 125111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 125211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (color_format == COLOR_FMT_NV12_UBWC || color_format == COLOR_FMT_RGBA8888_UBWC) { 125311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (color_format == COLOR_FMT_NV12_UBWC) { 125411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel msize -= 2 * extra_size; 125511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 125611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fwrite(ptemp, msize, 1, m_debug.infile); 125711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 125811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 125911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (metadatamode == 1 && pvirt) { 126011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel munmap(pvirt, msize); 126111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 126211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 126311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 126411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 0; 126511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 126611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 126711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_open(OMX_U32 codec) 126811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 126911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int r; 127011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int alignment = 0,buffer_size = 0, temp =0; 127111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 127211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_STRING device_name = (OMX_STRING)"/dev/video33"; 127311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char property_value[PROPERTY_VALUE_MAX] = {0}; 127411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char platform_name[PROPERTY_VALUE_MAX] = {0}; 127511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel FILE *soc_file = NULL; 127611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char buffer[10]; 127711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 127811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("ro.board.platform", platform_name, "0"); 127911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.enc.narrow.searchrange", property_value, "0"); 128011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enable_mv_narrow_searchrange = atoi(property_value); 128111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 128211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!strncmp(platform_name, "msm8610", 7)) { 128311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel device_name = (OMX_STRING)"/dev/video/q6_enc"; 128411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel supported_rc_modes = (RC_ALL & ~RC_CBR_CFR); 128511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 128611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_nDriver_fd = open (device_name, O_RDWR); 128711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((int)m_nDriver_fd < 0) { 128811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Omx_venc::Comp Init Returning failure"); 128911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 129011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 129111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_poll_efd = eventfd(0, 0); 129211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_poll_efd < 0) { 129311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to open event fd(%s)", strerror(errno)); 129411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 129511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 129611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("m_nDriver_fd = %u", (unsigned int)m_nDriver_fd); 129711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 129811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // set the basic configuration of the video encoder driver 129911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.input_width = OMX_CORE_QCIF_WIDTH; 130011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.input_height= OMX_CORE_QCIF_HEIGHT; 130111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.dvs_width = OMX_CORE_QCIF_WIDTH; 130211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.dvs_height = OMX_CORE_QCIF_HEIGHT; 130311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.fps_num = 30; 130411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.fps_den = 1; 130511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.targetbitrate = 64000; 130611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.inputformat= V4L2_DEFAULT_OUTPUT_COLOR_FMT; 130711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 130811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_codec = codec; 130911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 131011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (codec == OMX_VIDEO_CodingMPEG4) { 131111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.codectype = V4L2_PIX_FMT_MPEG4; 131211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_profile.profile = V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE; 131311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profile_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_2; 131411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel session_qp_range.minqp = 1; 131511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel session_qp_range.maxqp = 31; 131611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (codec == OMX_VIDEO_CodingH263) { 131711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.codectype = V4L2_PIX_FMT_H263; 131811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_profile.profile = VEN_PROFILE_H263_BASELINE; 131911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profile_level.level = VEN_LEVEL_H263_20; 132011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel session_qp_range.minqp = 1; 132111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel session_qp_range.maxqp = 31; 132211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (codec == OMX_VIDEO_CodingAVC) { 132311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.codectype = V4L2_PIX_FMT_H264; 132411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE; 132511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profile_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_0; 132611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel session_qp_range.minqp = 1; 132711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel session_qp_range.maxqp = 51; 132811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (codec == OMX_VIDEO_CodingVP8) { 132911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.codectype = V4L2_PIX_FMT_VP8; 133011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_profile.profile = V4L2_MPEG_VIDC_VIDEO_VP8_UNUSED; 133111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profile_level.level = V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_0; 133211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel session_qp_range.minqp = 1; 133311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel session_qp_range.maxqp = 128; 133411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (codec == OMX_VIDEO_CodingHEVC) { 133511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.codectype = V4L2_PIX_FMT_HEVC; 133611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel session_qp_range.minqp = 1; 133711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel session_qp_range.maxqp = 51; 133811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_profile.profile = V4L2_MPEG_VIDC_VIDEO_HEVC_PROFILE_MAIN; 133911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profile_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_1; 134011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 134111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel session_qp_values.minqp = session_qp_range.minqp; 134211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel session_qp_values.maxqp = session_qp_range.maxqp; 13432601808ee2992a94c325d05e4065aba60b01840bThierry Strudel session_ipb_qp_values.min_i_qp = session_qp_range.minqp; 13442601808ee2992a94c325d05e4065aba60b01840bThierry Strudel session_ipb_qp_values.max_i_qp = session_qp_range.maxqp; 13452601808ee2992a94c325d05e4065aba60b01840bThierry Strudel session_ipb_qp_values.min_p_qp = session_qp_range.minqp; 13462601808ee2992a94c325d05e4065aba60b01840bThierry Strudel session_ipb_qp_values.max_p_qp = session_qp_range.maxqp; 13472601808ee2992a94c325d05e4065aba60b01840bThierry Strudel session_ipb_qp_values.min_b_qp = session_qp_range.minqp; 13482601808ee2992a94c325d05e4065aba60b01840bThierry Strudel session_ipb_qp_values.max_b_qp = session_qp_range.maxqp; 134911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 135011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ret; 135111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = subscribe_to_events(m_nDriver_fd); 135211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 135311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 135411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Subscribe Event Failed"); 135511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 135611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 135711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 135811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_fmtdesc fdesc; 135911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 136011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_requestbuffers bufreq; 136111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_capability cap; 136211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 136311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(m_nDriver_fd, VIDIOC_QUERYCAP, &cap); 136411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 136511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 136611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to query capabilities"); 136711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 136811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Capabilities: driver_name = %s, card = %s, bus_info = %s," 136911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " version = %d, capabilities = %x", cap.driver, cap.card, 137011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel cap.bus_info, cap.version, cap.capabilities); 137111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 137211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 137311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret=0; 137411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 137511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fdesc.index=0; 137611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 137711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (ioctl(m_nDriver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) { 137811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("fmt: description: %s, fmt: %x, flags = %x", fdesc.description, 137911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fdesc.pixelformat, fdesc.flags); 138011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fdesc.index++; 138111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 138211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 138311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 138411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fdesc.index=0; 138511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 138611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel while (ioctl(m_nDriver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) { 138711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("fmt: description: %s, fmt: %x, flags = %x", fdesc.description, 138811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fdesc.pixelformat, fdesc.flags); 138911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fdesc.index++; 139011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 139111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 139211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is_thulium_v1 = false; 139311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel soc_file= fopen("/sys/devices/soc0/soc_id", "r"); 139411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (soc_file) { 139511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fread(buffer, 1, 4, soc_file); 139611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fclose(soc_file); 139711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (atoi(buffer) == 246) { 139811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel soc_file = fopen("/sys/devices/soc0/revision", "r"); 139911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (soc_file) { 140011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fread(buffer, 1, 4, soc_file); 140111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fclose(soc_file); 140211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (atoi(buffer) == 1) { 140311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is_thulium_v1 = true; 140411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("is_thulium_v1 = TRUE"); 140511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 140611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 140711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 140811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 140911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 141011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (venc_handle->is_secure_session()) { 141111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sOutput_buff_property.alignment = SZ_1M; 141211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sInput_buff_property.alignment = SZ_1M; 141311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 141411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sOutput_buff_property.alignment = SZ_4K; 141511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sInput_buff_property.alignment = SZ_4K; 141611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 141711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 141811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&fmt, 0, sizeof(fmt)); 141911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 142011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height = m_sVenc_cfg.dvs_height; 142111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width = m_sVenc_cfg.dvs_width; 142211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.codectype; 142311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 142411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*TODO: Return values not handled properly in this function anywhere. 142511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Need to handle those.*/ 142611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt); 142711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 142811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 142911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set format on capture port"); 143011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 143111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 143211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 143311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sOutput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage; 143411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 143511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&fmt, 0, sizeof(fmt)); 143611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 143711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height; 143811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width; 143911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = V4L2_DEFAULT_OUTPUT_COLOR_FMT; 1440fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel fmt.fmt.pix_mp.colorspace = V4L2_COLORSPACE_470_SYSTEM_BG; 144111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 144211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt); 144311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sInput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage; 144411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 144511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.memory = V4L2_MEMORY_USERPTR; 144611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count = 2; 144711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 144811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 144911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq); 145011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sInput_buff_property.mincount = m_sInput_buff_property.actualcount = bufreq.count; 145111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 145211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 145311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count = 2; 145411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq); 145511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sOutput_buff_property.mincount = m_sOutput_buff_property.actualcount = bufreq.count; 145611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 145711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(venc_handle->is_secure_session()) { 145811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_SECURE; 145911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = 1; 146011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("ioctl: open secure device"); 146111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret=ioctl(m_nDriver_fd, VIDIOC_S_CTRL,&control); 146211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 146311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ioctl: open secure dev fail, rc %d", ret); 146411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 146511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 146611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 146711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 146811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel resume_in_stopped = 0; 146911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel metadatamode = 0; 147011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 147111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDEO_HEADER_MODE; 147211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE; 147311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 147411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling IOCTL to disable seq_hdr in sync_frame id=%d, val=%d", control.id, control.value); 147511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 147611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) 147711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set control"); 147811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 147911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_frmsizeenum frmsize; 148011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 148111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //Get the hardware capabilities 148211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset((void *)&frmsize,0,sizeof(frmsize)); 148311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frmsize.index = 0; 148411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel frmsize.pixel_format = m_sVenc_cfg.codectype; 148511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(m_nDriver_fd, VIDIOC_ENUM_FRAMESIZES, &frmsize); 148611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 148711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret || frmsize.type != V4L2_FRMSIZE_TYPE_STEPWISE) { 148811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to get framesizes"); 148911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 149011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 149111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 149211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (frmsize.type == V4L2_FRMSIZE_TYPE_STEPWISE) { 149311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel capability.min_width = frmsize.stepwise.min_width; 149411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel capability.max_width = frmsize.stepwise.max_width; 149511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel capability.min_height = frmsize.stepwise.min_height; 149611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel capability.max_height = frmsize.stepwise.max_height; 149711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 149811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 149911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //Initialize non-default parameters 150011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8) { 150111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_P_FRAMES; 150211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = 0x7fffffff; 150311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) 150411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set V4L2_CID_MPEG_VIDC_VIDEO_NUM_P_FRAME\n"); 150511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 150611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 150711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel property_get("vidc.debug.turbo", property_value, "0"); 150811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (atoi(property_value)) { 150911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Turbo mode debug property enabled"); 151011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_SET_PERF_LEVEL; 151111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO; 151211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) { 151311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set turbo mode"); 151411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 151511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 151611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1517fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#ifdef _PQ_ 1518fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if (codec == OMX_VIDEO_CodingAVC && !m_pq.is_pq_force_disable) { 1519fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_pq.init(V4L2_DEFAULT_OUTPUT_COLOR_FMT); 1520fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_pq.get_caps(); 1521fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 1522fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#endif // _PQ_ 1523fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 152411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_extradata_info.port_index = OUTPUT_PORT; 152511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_extradata_info.port_index = CAPTURE_PORT; 15262601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 152711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 152811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 152911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 153011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic OMX_ERRORTYPE unsubscribe_to_events(int fd) 153111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 153211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE eRet = OMX_ErrorNone; 153311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_event_subscription sub; 153411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int array_sz = sizeof(event_type)/sizeof(int); 153511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int i,rc; 153611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 153711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (fd < 0) { 153811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid input: %d", fd); 153911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 154011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 154111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 154211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (i = 0; i < array_sz; ++i) { 154311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&sub, 0, sizeof(sub)); 154411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sub.type = event_type[i]; 154511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub); 154611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 154711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 154811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x", sub.type); 154911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 155011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 155111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 155211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 155311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return eRet; 155411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 155511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 155611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid venc_dev::venc_close() 155711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 155811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_close: fd = %u", (unsigned int)m_nDriver_fd); 155911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 156011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((int)m_nDriver_fd >= 0) { 156111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("venc_close E"); 156211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 156311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(eventfd_write(m_poll_efd, 1)) { 156411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("eventfd_write failed for fd: %d, errno = %d, force stop async_thread", m_poll_efd, errno); 156511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_thread_force_stop = true; 156611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 156711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 156811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (async_thread_created) 156911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_join(m_tid,NULL); 157011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 157111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("venc_close X"); 157211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsubscribe_to_events(m_nDriver_fd); 157311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(m_poll_efd); 157411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel close(m_nDriver_fd); 157511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_nDriver_fd = -1; 157611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 157711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1578fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#ifdef _PQ_ 1579fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_pq.deinit(); 1580fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#endif // _PQ_ 1581fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 1582fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#ifdef _VQZIP_ 1583fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel vqzip.deinit(); 1584fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#endif 1585fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 158611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug.infile) { 158711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fclose(m_debug.infile); 158811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.infile = NULL; 158911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 159011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 159111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug.outfile) { 159211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fclose(m_debug.outfile); 159311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.outfile = NULL; 159411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 159511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 159611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_debug.extradatafile) { 159711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fclose(m_debug.extradatafile); 159811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_debug.extradatafile = NULL; 159911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 160011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 160111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 160211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_buf_req(OMX_U32 *min_buff_count, 160311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 *actual_buff_count, 160411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 *buff_size, 160511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 port) 160611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 160711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void)min_buff_count, (void)buff_size; 160811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long temp_count = 0; 160911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 161011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (port == 0) { 161111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (*actual_buff_count > m_sInput_buff_property.mincount) { 161211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp_count = m_sInput_buff_property.actualcount; 161311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sInput_buff_property.actualcount = *actual_buff_count; 161411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("I/P Count set to %u", (unsigned int)*actual_buff_count); 161511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 161611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 161711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (*actual_buff_count > m_sOutput_buff_property.mincount) { 161811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp_count = m_sOutput_buff_property.actualcount; 161911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sOutput_buff_property.actualcount = *actual_buff_count; 162011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("O/P Count set to %u", (unsigned int)*actual_buff_count); 162111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 162211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 162311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 162411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 162511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 162611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 162711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 162811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_loaded_start() 162911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 163011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 163111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 163211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 163311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_loaded_stop() 163411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 163511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 163611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 163711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 163811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_loaded_start_done() 163911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 164011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 164111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 164211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 164311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_loaded_stop_done() 164411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 164511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 164611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 164711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 164811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_get_seq_hdr(void *buffer, 164911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned buffer_size, unsigned *header_len) 165011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 165111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (void) buffer, (void) buffer_size, (void) header_len; 165211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 165311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 165411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 165511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_get_buf_req(OMX_U32 *min_buff_count, 165611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 *actual_buff_count, 165711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 *buff_size, 165811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 port) 165911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 166011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 166111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_requestbuffers bufreq; 166211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int buf_size = 0, extra_data_size = 0, client_extra_data_size = 0; 166311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ret; 166411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int extra_idx = 0; 166511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 166611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (port == 0) { 166711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 166811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height; 166911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width; 167011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.inputformat; 1671fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel fmt.fmt.pix_mp.colorspace = V4L2_COLORSPACE_470_SYSTEM_BG; 167211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(m_nDriver_fd, VIDIOC_G_FMT, &fmt); 167311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sInput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage; 167411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.memory = V4L2_MEMORY_USERPTR; 167511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 167611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (*actual_buff_count) 167711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count = *actual_buff_count; 167811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 167911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count = 2; 168011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 168111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Increase buffer-header count for metadata-mode on input port 168211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // to improve buffering and reduce bottlenecks in clients 168311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (metadatamode && (bufreq.count < 9)) { 168411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("FW returned buffer count = %d , overwriting with 9", 168511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count); 168611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count = 9; 168711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1688a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel 168911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_sVenc_cfg.input_height * m_sVenc_cfg.input_width >= 3840*2160) { 169011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Increasing buffer count = %d to 11", bufreq.count); 169111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count = 11; 169211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 169311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 169411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int actualCount = bufreq.count; 169511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Request MAX_V4L2_BUFS from V4L2 in batch mode. 169611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Keep the original count for the client 169711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (metadatamode && mBatchSize) { 169811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count = MAX_V4L2_BUFS; 169911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 170011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 170111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 170211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq); 170311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 170411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 170511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("VIDIOC_REQBUFS OUTPUT_MPLANE Failed"); 170611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 170711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 170811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 170911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height; 171011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width; 171111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.inputformat; 171211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(m_nDriver_fd, VIDIOC_G_FMT, &fmt); 171311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sInput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage; 171411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 171511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (metadatamode && mBatchSize) { 171611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sInput_buff_property.mincount = m_sInput_buff_property.actualcount = actualCount; 171711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 171811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sInput_buff_property.mincount = m_sInput_buff_property.actualcount = bufreq.count; 171911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 172011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 172111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *min_buff_count = m_sInput_buff_property.mincount; 172211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *actual_buff_count = m_sInput_buff_property.actualcount; 172311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 172411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // For ION memory allocations of the allocated buffer size 172511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // must be 4k aligned, hence aligning the input buffer 172611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // size to 4k. 172711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sInput_buff_property.datasize = ALIGN(m_sInput_buff_property.datasize, SZ_4K); 172811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 172911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *buff_size = m_sInput_buff_property.datasize; 173011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel num_input_planes = fmt.fmt.pix_mp.num_planes; 173111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra_idx = EXTRADATA_IDX(num_input_planes); 173211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 173311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 173411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra_data_size = fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage; 173511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extra_idx >= VIDEO_MAX_PLANES) { 173611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d\n", extra_idx); 173711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 173811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1739fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel input_extradata_info.buffer_size = ALIGN(extra_data_size, SZ_4K); 1740fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel input_extradata_info.count = MAX_V4L2_BUFS; 174111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_extradata_info.size = input_extradata_info.buffer_size * input_extradata_info.count; 174211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 174311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 174411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int extra_idx = 0; 174511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&fmt, 0, sizeof(fmt)); 174611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 174711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height = m_sVenc_cfg.dvs_height; 174811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width = m_sVenc_cfg.dvs_width; 174911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.codectype; 175011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 175111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt); 175211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sOutput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage; 175311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 175411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height = m_sVenc_cfg.dvs_height; 175511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width = m_sVenc_cfg.dvs_width; 175611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.codectype; 175711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 175811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(m_nDriver_fd, VIDIOC_G_FMT, &fmt); 175911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sOutput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage; 176011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.memory = V4L2_MEMORY_USERPTR; 176111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 176211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (mBatchSize) { 176311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // If we're in batch mode, we'd like to end up in a situation where 176411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // driver is able to own mBatchSize buffers and we'd also own atleast 176511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // mBatchSize buffers 176611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count = MAX(*actual_buff_count, mBatchSize) + mBatchSize; 176711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (*actual_buff_count) { 176811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count = *actual_buff_count; 176911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 177011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count = 2; 177111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 177211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 177311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 177411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq); 177511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 177611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 177711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("VIDIOC_REQBUFS CAPTURE_MPLANE Failed"); 177811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 177911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 178011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 178111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sOutput_buff_property.mincount = m_sOutput_buff_property.actualcount = bufreq.count; 178211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *min_buff_count = m_sOutput_buff_property.mincount; 178311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *actual_buff_count = m_sOutput_buff_property.actualcount; 178411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *buff_size = m_sOutput_buff_property.datasize; 178511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel num_output_planes = fmt.fmt.pix_mp.num_planes; 178611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra_idx = EXTRADATA_IDX(num_output_planes); 178711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 178811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 178911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra_data_size = fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage; 179011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extra_idx >= VIDEO_MAX_PLANES) { 179111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d", extra_idx); 179211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 179311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 179411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 179511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_extradata_info.buffer_size = extra_data_size; 179611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_extradata_info.count = m_sOutput_buff_property.actualcount; 179711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_extradata_info.size = output_extradata_info.buffer_size * output_extradata_info.count; 179811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 179911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 180011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 180111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 180211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 180311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_param(void *paramData, OMX_INDEXTYPE index) 180411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 180511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_param:: venc-720p"); 180611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 180711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_requestbuffers bufreq; 180811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ret; 1809a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel bool isCBR; 181011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 181111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch ((int)index) { 181211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamPortDefinition: 181311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 181411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_PORTDEFINITIONTYPE *portDefn; 181511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData; 181611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamPortDefinition"); 181711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 181811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (portDefn->nPortIndex == PORT_INDEX_IN) { 181911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_encode_framerate(portDefn->format.video.xFramerate, 0)) { 182011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 182111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 182211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 182311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_color_format(portDefn->format.video.eColorFormat)) { 182411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 182511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1826fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#ifdef _PQ_ 1827fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel venc_try_enable_pq(); 1828fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel #endif // _PQ_ 1829fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 183011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (enable_mv_narrow_searchrange && 183111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_sVenc_cfg.input_width * m_sVenc_cfg.input_height) >= 183211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_CORE_1080P_WIDTH * OMX_CORE_1080P_HEIGHT)) { 183311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (venc_set_searchrange() == false) { 183411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Failed to set search range"); 183511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 183611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 183711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_sVenc_cfg.input_height != portDefn->format.video.nFrameHeight || 183811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.input_width != portDefn->format.video.nFrameWidth) { 183911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Basic parameter has changed"); 184011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.input_height = portDefn->format.video.nFrameHeight; 184111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.input_width = portDefn->format.video.nFrameWidth; 184211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 184311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&fmt, 0, sizeof(fmt)); 184411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 184511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height; 184611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width; 184711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.inputformat; 1848fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel fmt.fmt.pix_mp.colorspace = V4L2_COLORSPACE_470_SYSTEM_BG; 184911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 185011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt)) { 185111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("VIDIOC_S_FMT OUTPUT_MPLANE Failed"); 185211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel hw_overload = errno == EBUSY; 185311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 185411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 185511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 185611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sInput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage; 185711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.memory = V4L2_MEMORY_USERPTR; 185811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count = portDefn->nBufferCountActual; 185911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 186011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 186111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq)) { 186211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("VIDIOC_REQBUFS OUTPUT_MPLANE Failed"); 186311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 186411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 186511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 186611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bufreq.count == portDefn->nBufferCountActual) 186711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sInput_buff_property.mincount = m_sInput_buff_property.actualcount = bufreq.count; 186811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 186911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (portDefn->nBufferCountActual >= m_sInput_buff_property.mincount) 187011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sInput_buff_property.actualcount = portDefn->nBufferCountActual; 187111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (num_input_planes > 1) 187211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel input_extradata_info.count = m_sInput_buff_property.actualcount + 1; 187311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 187411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 187511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 187611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("input: actual: %u, min: %u, count_req: %u", 187711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->nBufferCountActual, (unsigned int)m_sInput_buff_property.mincount, bufreq.count); 187811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (portDefn->nPortIndex == PORT_INDEX_OUT) { 187911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.dvs_height = portDefn->format.video.nFrameHeight; 188011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.dvs_width = portDefn->format.video.nFrameWidth; 188111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 188211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&fmt, 0, sizeof(fmt)); 188311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 188411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height = m_sVenc_cfg.dvs_height; 188511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width = m_sVenc_cfg.dvs_width; 188611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.codectype; 188711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 188811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt)) { 188911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("VIDIOC_S_FMT CAPTURE_MPLANE Failed"); 189011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel hw_overload = errno == EBUSY; 189111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 189211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 189311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 189411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sOutput_buff_property.datasize = fmt.fmt.pix_mp.plane_fmt[0].sizeimage; 189511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 189611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_target_bitrate(portDefn->format.video.nBitrate, 0)) { 189711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 189811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 189911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 190011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sOutput_buff_property.actualcount = portDefn->nBufferCountActual; 190111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.memory = V4L2_MEMORY_USERPTR; 190211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count = portDefn->nBufferCountActual; 190311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 190411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 190511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq)) { 190611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Request for setting o/p buffer count failed: requested: %u, current: %u", 190711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->nBufferCountActual, (unsigned int)m_sOutput_buff_property.actualcount); 190811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 190911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 191011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 191111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bufreq.count == portDefn->nBufferCountActual) 191211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sOutput_buff_property.mincount = m_sOutput_buff_property.actualcount = bufreq.count; 191311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 191411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (portDefn->nBufferCountActual >= m_sOutput_buff_property.mincount) 191511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sOutput_buff_property.actualcount = portDefn->nBufferCountActual; 191611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 191711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (num_output_planes > 1) 191811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel output_extradata_info.count = m_sOutput_buff_property.actualcount; 191911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 192011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Output: actual: %u, min: %u, count_req: %u", 192111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)portDefn->nBufferCountActual, (unsigned int)m_sOutput_buff_property.mincount, bufreq.count); 192211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 192311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamPortDefinition"); 192411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 192511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 192611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 192711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 192811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoPortFormat: 192911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 193011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt; 193111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel portFmt =(OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData; 193211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoPortFormat"); 193311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 193411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (portFmt->nPortIndex == (OMX_U32) PORT_INDEX_IN) { 193511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_color_format(portFmt->eColorFormat)) { 193611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 193711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 193811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (portFmt->nPortIndex == (OMX_U32) PORT_INDEX_OUT) { 193911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_encode_framerate(portFmt->xFramerate, 0)) { 194011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 194111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 194211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 194311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoPortFormat"); 194411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1945fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#ifdef _PQ_ 1946fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel venc_try_enable_pq(); 1947fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#endif // _PQ_ 194811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1949fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 195011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 195111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoBitrate: 195211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 195311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_BITRATETYPE* pParam; 195411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam = (OMX_VIDEO_PARAM_BITRATETYPE*)paramData; 195511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoBitrate"); 195611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 195711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) { 195811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_target_bitrate(pParam->nTargetBitrate, 0)) { 195911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Target Bit Rate setting failed"); 196011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 196111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 196211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 196311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_ratectrl_cfg(pParam->eControlRate)) { 196411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Rate Control setting failed"); 196511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 196611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 1967fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#ifdef _PQ_ 1968fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel venc_try_enable_pq(); 1969fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#endif // _PQ_ 197011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 197111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoBitrate"); 197211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 197311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 197411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 197511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 197611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoMpeg4: 197711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 197811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_MPEG4TYPE* pParam; 197911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 bFrames = 0; 198011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 198111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam = (OMX_VIDEO_PARAM_MPEG4TYPE*)paramData; 198211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoMpeg4"); 198311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 198411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) { 198511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_voptiming_cfg(pParam->nTimeIncRes)) { 198611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Request for setting vop_timing failed"); 198711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 198811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 198911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 199011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_profile_set = false; 199111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_level_set = false; 199211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc_off_level = (int)pParam->eLevel; 199311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_profile_level (pParam->eProfile, pParam->eLevel)) { 199411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Unsuccessful in updating Profile and level"); 199511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 199611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 199711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam->eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple) { 199811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam->nBFrames) { 199911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFrames = pParam->nBFrames; 200011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 200111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 200211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam->nBFrames) { 200311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Warning: B frames not supported"); 200411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFrames = 0; 200511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 200611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 200711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 200811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 200911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_intra_period (pParam->nPFrames,bFrames)) { 201011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Request for setting intra period failed"); 201111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 201211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 201311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 201411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_multislice_cfg(OMX_IndexParamVideoMpeg4,pParam->nSliceHeaderSpacing)) { 201511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Unsuccessful in updating slice_config"); 201611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 201711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 201811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 201911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoMpeg4"); 202011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 202111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 202211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 202311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 202411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoH263: 202511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 202611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_H263TYPE* pParam = (OMX_VIDEO_PARAM_H263TYPE*)paramData; 202711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoH263"); 202811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 bFrames = 0; 202911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 203011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) { 203111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_profile_set = false; 203211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_level_set = false; 203311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc_off_level = (int)pParam->eLevel; 203411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_profile_level (pParam->eProfile, pParam->eLevel)) { 203511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Unsuccessful in updating Profile and level"); 203611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 203711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 203811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 203911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam->nBFrames) 204011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("WARNING: B frame not supported for H.263"); 204111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 204211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (venc_set_intra_period (pParam->nPFrames, bFrames) == false) { 204311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Request for setting intra period failed"); 204411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 204511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 204611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 204711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoH263"); 204811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 204911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 205011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 205111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 205211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoAvc: 205311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 205411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoAvc"); 205511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_AVCTYPE* pParam = (OMX_VIDEO_PARAM_AVCTYPE*)paramData; 205611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 bFrames = 0; 205711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 205811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) { 205911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("pParam->eProfile :%d ,pParam->eLevel %d", 206011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eProfile,pParam->eLevel); 206111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 206211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_profile_set = false; 206311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_level_set = false; 206411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc_off_level = (int)pParam->eLevel; 206511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_profile_level (pParam->eProfile,pParam->eLevel)) { 206611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Unsuccessful in updating Profile and level %d, %d", 206711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eProfile, pParam->eLevel); 206811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 206911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 207011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((pParam->eProfile != OMX_VIDEO_AVCProfileBaseline) && 207111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (pParam->eProfile != (OMX_VIDEO_AVCPROFILETYPE) QOMX_VIDEO_AVCProfileConstrainedBaseline)) { 207211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam->nBFrames) { 207311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFrames = pParam->nBFrames; 207411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 207511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 207611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam->nBFrames) { 207711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Warning: B frames not supported"); 207811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bFrames = 0; 207911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 208011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 208111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 208211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 208311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_intra_period (pParam->nPFrames, bFrames)) { 208411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Request for setting intra period failed"); 208511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 208611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 208711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 208811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_entropy_config (pParam->bEntropyCodingCABAC, pParam->nCabacInitIdc)) { 208911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Request for setting Entropy failed"); 209011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 209111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 209211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 209311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_inloop_filter (pParam->eLoopFilterMode)) { 209411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Request for setting Inloop filter failed"); 209511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 209611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 209711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 209811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_multislice_cfg(OMX_IndexParamVideoAvc, pParam->nSliceHeaderSpacing)) { 209911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("WARNING: Unsuccessful in updating slice_config"); 210011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 210111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 210211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 210311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoAvc"); 210411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 210511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 210611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //TBD, lot of other variables to be updated, yet to decide 210711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 210811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 210911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case (OMX_INDEXTYPE)OMX_IndexParamVideoVp8: 211011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 211111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoVp8"); 211211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_VP8TYPE* pParam = (OMX_VIDEO_PARAM_VP8TYPE*)paramData; 211311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc_off_level = (int)pParam->eLevel; 211411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_profile_level (pParam->eProfile, pParam->eLevel)) { 211511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Unsuccessful in updating Profile and level %d, %d", 211611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eProfile, pParam->eLevel); 211711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 211811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 211911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(venc_set_vpx_error_resilience(pParam->bErrorResilientMode) == false) { 212011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Failed to set vpx error resilience"); 212111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 212211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 21232601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if(!venc_set_ltrmode(1, ltrinfo.count)) { 212411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Failed to enable ltrmode"); 212511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 212611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 212711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 212811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // For VP8, hier-p and ltr are mutually exclusive features in firmware 212911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Disable hier-p if ltr is enabled. 213011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_codec == OMX_VIDEO_CodingVP8) { 213111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Disable Hier-P as LTR is being set"); 213211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_hier_layers(QOMX_HIERARCHICALCODING_P, 0)) { 213311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Disabling Hier P count failed"); 213411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 213511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 213611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 213711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 213811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 213911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case (OMX_INDEXTYPE)OMX_IndexParamVideoHevc: 214011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 214111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoHevc"); 214211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_HEVCTYPE* pParam = (OMX_VIDEO_PARAM_HEVCTYPE*)paramData; 214311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc_off_level = (int)pParam->eLevel; 214411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_profile_level (pParam->eProfile, pParam->eLevel)) { 214511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Unsuccessful in updating Profile and level %d, %d", 214611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pParam->eProfile, pParam->eLevel); 214711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 214811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 214911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_inloop_filter(OMX_VIDEO_AVCLoopFilterEnable)) 215011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("WARN: Request for setting Inloop filter failed for HEVC encoder"); 215111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 2152fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel OMX_U32 fps = m_sVenc_cfg.fps_num ? m_sVenc_cfg.fps_num / m_sVenc_cfg.fps_den : 30; 2153fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel OMX_U32 nPFrames = pParam->nKeyFrameInterval > 0 ? pParam->nKeyFrameInterval - 1 : fps - 1; 2154fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (!venc_set_intra_period (nPFrames, 0 /* nBFrames */)) { 215511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Request for setting intra period failed"); 215611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 215711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 215811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 215911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 216011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoIntraRefresh: 216111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 216211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoIntraRefresh"); 216311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_INTRAREFRESHTYPE *intra_refresh = 216411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_VIDEO_PARAM_INTRAREFRESHTYPE *)paramData; 216511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 216611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (intra_refresh->nPortIndex == (OMX_U32) PORT_INDEX_OUT) { 216711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (venc_set_intra_refresh(intra_refresh->eRefreshMode, intra_refresh->nCirMBs) == false) { 216811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Setting Intra refresh failed"); 216911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 217011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 217111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 217211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoIntraRefresh"); 217311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 217411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 217511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 217611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 217711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoErrorCorrection: 217811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 217911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoErrorCorrection"); 218011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *error_resilience = 218111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)paramData; 218211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 218311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (error_resilience->nPortIndex == (OMX_U32) PORT_INDEX_OUT) { 218411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (venc_set_error_resilience(error_resilience) == false) { 218511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Setting Intra refresh failed"); 218611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 218711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 218811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 218911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoErrorCorrection"); 219011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 219111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 219211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 219311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 219411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoProfileLevelCurrent: 219511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 219611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoProfileLevelCurrent"); 219711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_PROFILELEVELTYPE *profile_level = 219811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData; 219911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 220011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (profile_level->nPortIndex == (OMX_U32) PORT_INDEX_OUT) { 220111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_profile_set = false; 220211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_level_set = false; 220311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc_off_level = (int)profile_level->eLevel; 220411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_profile_level (profile_level->eProfile, 220511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profile_level->eLevel)) { 220611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("WARNING: Unsuccessful in updating Profile and level"); 220711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 220811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 220911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 221011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoProfileLevelCurrent"); 221111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 221211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 221311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 221411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 221511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoQuantization: 221611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 221711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoQuantization"); 221811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_PARAM_QUANTIZATIONTYPE *session_qp = 221911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_VIDEO_PARAM_QUANTIZATIONTYPE *)paramData; 222011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (session_qp->nPortIndex == (OMX_U32) PORT_INDEX_OUT) { 222111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (venc_set_session_qp (session_qp->nQpI, 222211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel session_qp->nQpP, 222311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel session_qp->nQpB) == false) { 222411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Setting Session QP failed"); 222511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 222611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 222711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 222811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoQuantization"); 222911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 223011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 223111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 223211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 223311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case QOMX_IndexParamVideoInitialQp: 223411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 223511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_EXTNINDEX_VIDEO_INITIALQP * initqp = 223611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (QOMX_EXTNINDEX_VIDEO_INITIALQP *)paramData; 223711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (initqp->bEnableInitQp) { 223811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Enable initial QP: %d", (int)initqp->bEnableInitQp); 223911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(venc_enable_initial_qp(initqp) == false) { 224011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Failed to enable initial QP"); 224111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUnsupportedSetting; 224211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 224311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else 224411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: setting QOMX_IndexParamVideoEnableInitialQp"); 224511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 224611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 224711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamVideoQPRange: 224811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 224911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_param:OMX_QcomIndexParamVideoQPRange"); 225011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_VIDEO_PARAM_QPRANGETYPE *session_qp_range = 225111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_QCOM_VIDEO_PARAM_QPRANGETYPE *)paramData; 225211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 225311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(session_qp_range->nPortIndex == (OMX_U32)PORT_INDEX_OUT) { 225411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(venc_set_session_qp_range (session_qp_range->minQP, 225511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel session_qp_range->maxQP) == false) { 225611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Setting QP Range[%u %u] failed", 225711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)session_qp_range->minQP, (unsigned int)session_qp_range->maxQP); 225811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 225911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 226011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel session_qp_values.minqp = session_qp_range->minQP; 226111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel session_qp_values.maxqp = session_qp_range->maxQP; 226211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 226311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 226411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_QcomIndexParamVideoQPRange"); 226511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 226611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 226711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 226811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 22692601808ee2992a94c325d05e4065aba60b01840bThierry Strudel case OMX_QcomIndexParamVideoIPBQPRange: 22702601808ee2992a94c325d05e4065aba60b01840bThierry Strudel { 22712601808ee2992a94c325d05e4065aba60b01840bThierry Strudel DEBUG_PRINT_LOW("venc_set_param:OMX_QcomIndexParamVideoIPBQPRange"); 22722601808ee2992a94c325d05e4065aba60b01840bThierry Strudel OMX_QCOM_VIDEO_PARAM_IPB_QPRANGETYPE *qp = 22732601808ee2992a94c325d05e4065aba60b01840bThierry Strudel (OMX_QCOM_VIDEO_PARAM_IPB_QPRANGETYPE *)paramData; 22742601808ee2992a94c325d05e4065aba60b01840bThierry Strudel OMX_U32 min_IPB_packed_QP = 0; 22752601808ee2992a94c325d05e4065aba60b01840bThierry Strudel OMX_U32 max_IPB_packed_QP = 0; 22762601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (((qp->minIQP >= session_qp_range.minqp) && (qp->maxIQP <= session_qp_range.maxqp)) && 22772601808ee2992a94c325d05e4065aba60b01840bThierry Strudel ((qp->minPQP >= session_qp_range.minqp) && (qp->maxPQP <= session_qp_range.maxqp)) && 22782601808ee2992a94c325d05e4065aba60b01840bThierry Strudel ((qp->minBQP >= session_qp_range.minqp) && (qp->maxBQP <= session_qp_range.maxqp))) { 22792601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 22802601808ee2992a94c325d05e4065aba60b01840bThierry Strudel /* When creating the packet, pack the qp value as 22812601808ee2992a94c325d05e4065aba60b01840bThierry Strudel * 0xbbppii, where ii = qp range for I-frames, 22822601808ee2992a94c325d05e4065aba60b01840bThierry Strudel * pp = qp range for P-frames, etc. */ 22832601808ee2992a94c325d05e4065aba60b01840bThierry Strudel min_IPB_packed_QP = qp->minIQP | qp->minPQP << 8 | qp->minBQP << 16; 22842601808ee2992a94c325d05e4065aba60b01840bThierry Strudel max_IPB_packed_QP = qp->maxIQP | qp->maxPQP << 8 | qp->maxBQP << 16; 22852601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 22862601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (qp->nPortIndex == (OMX_U32)PORT_INDEX_OUT) { 22872601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (venc_set_session_qp_range_packed(min_IPB_packed_QP, 22882601808ee2992a94c325d05e4065aba60b01840bThierry Strudel max_IPB_packed_QP) == false) { 22892601808ee2992a94c325d05e4065aba60b01840bThierry Strudel DEBUG_PRINT_ERROR("ERROR: Setting IPB QP Range[%d %d] failed", 22902601808ee2992a94c325d05e4065aba60b01840bThierry Strudel min_IPB_packed_QP, max_IPB_packed_QP); 22912601808ee2992a94c325d05e4065aba60b01840bThierry Strudel return false; 22922601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } else { 22932601808ee2992a94c325d05e4065aba60b01840bThierry Strudel session_ipb_qp_values.min_i_qp = qp->minIQP; 22942601808ee2992a94c325d05e4065aba60b01840bThierry Strudel session_ipb_qp_values.max_i_qp = qp->maxIQP; 22952601808ee2992a94c325d05e4065aba60b01840bThierry Strudel session_ipb_qp_values.min_p_qp = qp->minPQP; 22962601808ee2992a94c325d05e4065aba60b01840bThierry Strudel session_ipb_qp_values.max_p_qp = qp->maxPQP; 22972601808ee2992a94c325d05e4065aba60b01840bThierry Strudel session_ipb_qp_values.min_b_qp = qp->minBQP; 22982601808ee2992a94c325d05e4065aba60b01840bThierry Strudel session_ipb_qp_values.max_b_qp = qp->maxBQP; 22992601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 23002601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } else { 23012601808ee2992a94c325d05e4065aba60b01840bThierry Strudel DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_QcomIndexParamVideoIPBQPRange"); 23022601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 23032601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } else { 23042601808ee2992a94c325d05e4065aba60b01840bThierry Strudel DEBUG_PRINT_ERROR("Wrong qp values: IQP range[%u %u], PQP range[%u,%u], BQP[%u,%u] range allowed range[%u %u]", 23052601808ee2992a94c325d05e4065aba60b01840bThierry Strudel (unsigned int)qp->minIQP, (unsigned int)qp->maxIQP , (unsigned int)qp->minPQP, 23062601808ee2992a94c325d05e4065aba60b01840bThierry Strudel (unsigned int)qp->maxPQP, (unsigned int)qp->minBQP, (unsigned int)qp->maxBQP, 23072601808ee2992a94c325d05e4065aba60b01840bThierry Strudel (unsigned int)session_qp_range.minqp, (unsigned int)session_qp_range.maxqp); 23082601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 23092601808ee2992a94c325d05e4065aba60b01840bThierry Strudel break; 23102601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 231111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexEnableSliceDeliveryMode: 231211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 231311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_EXTNINDEX_PARAMTYPE* pParam = 231411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (QOMX_EXTNINDEX_PARAMTYPE*)paramData; 231511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 231611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam->nPortIndex == PORT_INDEX_OUT) { 231711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (venc_set_slice_delivery_mode(pParam->bEnable) == false) { 231811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setting slice delivery mode failed"); 231911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUnsupportedSetting; 232011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 232111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 232211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_QcomIndexEnableSliceDeliveryMode " 232311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "called on wrong port(%u)", (unsigned int)pParam->nPortIndex); 232411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadPortIndex; 232511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 232611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 232711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 232811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 232911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_ExtraDataFrameDimension: 233011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 233111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_param: OMX_ExtraDataFrameDimension"); 233211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BOOL extra_data = *(OMX_BOOL *)(paramData); 233311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 233411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (venc_set_extradata(OMX_ExtraDataFrameDimension, extra_data) == false) { 233511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Setting OMX_ExtraDataFrameDimension failed"); 233611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 233711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 233811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 233911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extradata = true; 234011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 234111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 234211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_ExtraDataVideoEncoderSliceInfo: 234311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 234411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_param: OMX_ExtraDataVideoEncoderSliceInfo"); 234511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BOOL extra_data = *(OMX_BOOL *)(paramData); 234611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 234711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (venc_set_extradata(OMX_ExtraDataVideoEncoderSliceInfo, extra_data) == false) { 234811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Setting OMX_ExtraDataVideoEncoderSliceInfo failed"); 234911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 235011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 235111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 235211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extradata = true; 235311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 235411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 235511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_ExtraDataVideoEncoderMBInfo: 235611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 235711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_param: OMX_ExtraDataVideoEncoderMBInfo"); 235811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_BOOL extra_data = *(OMX_BOOL *)(paramData); 235911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 236011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (venc_set_extradata(OMX_ExtraDataVideoEncoderMBInfo, extra_data) == false) { 236111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Setting OMX_ExtraDataVideoEncoderMBInfo failed"); 236211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 236311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 236411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 236511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extradata = true; 236611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 236711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 23682e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel case OMX_ExtraDataVideoLTRInfo: 23692e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel { 23702e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel DEBUG_PRINT_LOW("venc_set_param: OMX_ExtraDataVideoLTRInfo"); 23712e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel OMX_BOOL extra_data = *(OMX_BOOL *)(paramData); 23722e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel 23732e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel if (venc_set_extradata(OMX_ExtraDataVideoLTRInfo, extra_data) == false) { 23742e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel DEBUG_PRINT_ERROR("ERROR: Setting OMX_ExtraDataVideoLTRInfo failed"); 23752e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel return false; 23762e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel } 23772e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel 23782e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel extradata = true; 23792e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel break; 23802e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel } 238111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamSequenceHeaderWithIDR: 238211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 238311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel PrependSPSPPSToIDRFramesParams * pParam = 238411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (PrependSPSPPSToIDRFramesParams *)paramData; 238511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 238611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set inband sps/pps: %d", pParam->bEnable); 238711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(venc_set_inband_video_header(pParam->bEnable) == false) { 238811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: set inband sps/pps failed"); 238911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUnsupportedSetting; 239011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 239111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 239211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 239311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 239411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamH264AUDelimiter: 239511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 239611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_VIDEO_CONFIG_H264_AUD * pParam = 239711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_QCOM_VIDEO_CONFIG_H264_AUD *)paramData; 239811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 239911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set AU delimiters: %d", pParam->bEnable); 240011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(venc_set_au_delimiter(pParam->bEnable) == false) { 240111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: set H264 AU delimiter failed"); 240211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUnsupportedSetting; 240311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 240411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 240511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 240611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 240711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamMBIStatisticsMode: 240811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 240911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QOMX_VIDEO_MBI_STATISTICS * pParam = 241011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_QOMX_VIDEO_MBI_STATISTICS *)paramData; 241111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 241211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set MBI Dump mode: %d", pParam->eMBIStatisticsType); 241311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(venc_set_mbi_statistics_mode(pParam->eMBIStatisticsType) == false) { 241411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: set MBI Statistics mode failed"); 241511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUnsupportedSetting; 241611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 241711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 241811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 241911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 242011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 242111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexConfigH264EntropyCodingCabac: 242211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 242311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_VIDEO_H264ENTROPYCODINGTYPE * pParam = 242411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (QOMX_VIDEO_H264ENTROPYCODINGTYPE *)paramData; 242511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 242611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("set Entropy info : %d", pParam->bCabac); 242711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(venc_set_entropy_config (pParam->bCabac, 0) == false) { 242811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: set Entropy failed"); 242911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUnsupportedSetting; 243011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 243111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 243211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 243311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 243411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 243511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexHierarchicalStructure: 243611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 243711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_VIDEO_HIERARCHICALLAYERS* pParam = 243811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (QOMX_VIDEO_HIERARCHICALLAYERS*)paramData; 243911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 244011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam->nPortIndex == PORT_INDEX_OUT) { 244111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_hier_layers(pParam->eHierarchicalCodingType, pParam->nNumLayers)) { 244211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setting Hier P count failed"); 244311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 244411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 244511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 244611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_QcomIndexHierarchicalStructure called on wrong port(%d)", (int)pParam->nPortIndex); 244711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 244811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 244911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 245011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // For VP8, hier-p and ltr are mutually exclusive features in firmware 245111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Disable ltr if hier-p is enabled. 245211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_codec == OMX_VIDEO_CodingVP8) { 245311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Disable LTR as HIER-P is being set"); 24542601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if(!venc_set_ltrmode(0, 0)) { 245511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Failed to disable ltrmode"); 245611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 245711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 245811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 245911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 246011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamPerfLevel: 246111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 246211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_VIDEO_PARAM_PERF_LEVEL *pParam = 246311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_QCOM_VIDEO_PARAM_PERF_LEVEL *)paramData; 246411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Set perf level: %d", pParam->ePerfLevel); 246511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_perf_level(pParam->ePerfLevel)) { 246611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Failed to set perf level to %d", pParam->ePerfLevel); 246711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 246811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 246911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel performance_level.perflevel = (unsigned int) pParam->ePerfLevel; 247011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 247111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 247211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 247311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamH264VUITimingInfo: 247411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 247511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_VIDEO_PARAM_VUI_TIMING_INFO *pParam = 247611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_QCOM_VIDEO_PARAM_VUI_TIMING_INFO *)paramData; 247711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Set VUI timing info: %d", pParam->bEnable); 247811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(venc_set_vui_timing_info(pParam->bEnable) == false) { 247911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Failed to set vui timing info to %d", pParam->bEnable); 248011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 248111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 248211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vui_timing_info.enabled = (unsigned int) pParam->bEnable; 248311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 248411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 248511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 248611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QTIIndexParamVQZIPSEIType: 248711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 248811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QTI_VIDEO_PARAM_VQZIP_SEI_TYPE*pParam = 248911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_QTI_VIDEO_PARAM_VQZIP_SEI_TYPE *)paramData; 249011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Enable VQZIP SEI: %d", pParam->bEnable); 249111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(venc_set_vqzip_sei_type(pParam->bEnable) == false) { 249211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Failed to set VQZIP SEI type %d", pParam->bEnable); 249311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 249411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 249511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 249611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 249711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamPeakBitrate: 249811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 249911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_VIDEO_PARAM_PEAK_BITRATE *pParam = 250011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_QCOM_VIDEO_PARAM_PEAK_BITRATE *)paramData; 250111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Set peak bitrate: %u", (unsigned int)pParam->nPeakBitrate); 250211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(venc_set_peak_bitrate(pParam->nPeakBitrate) == false) { 250311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Failed to set peak bitrate to %u", (unsigned int)pParam->nPeakBitrate); 250411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 250511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 250611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel peak_bitrate.peakbitrate = (unsigned int) pParam->nPeakBitrate; 250711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 250811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 250911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 251011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamSetMVSearchrange: 251111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 251211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_config: OMX_QcomIndexParamSetMVSearchrange"); 251311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel is_searchrange_set = true; 251411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_searchrange()) { 251511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Failed to set search range"); 251611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 251711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 251811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 251911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 252011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamVideoLTRCount: 252111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 252211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_param: OMX_QcomIndexParamVideoLTRCount"); 252311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_VIDEO_PARAM_LTRCOUNT_TYPE* pParam = 252411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_QCOM_VIDEO_PARAM_LTRCOUNT_TYPE*)paramData; 252511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam->nCount > 0) { 252611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (venc_set_ltrmode(1, pParam->nCount) == false) { 252711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Enable LTR mode failed"); 252811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 252911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 253011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 253111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (venc_set_ltrmode(0, 0) == false) { 253211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Disable LTR mode failed"); 253311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 253411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 253511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 253611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 253711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 253811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamVideoHybridHierpMode: 253911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 254011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_hybrid_hierp((QOMX_EXTNINDEX_VIDEO_HYBRID_HP_MODE*)paramData)) { 254111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setting hybrid Hier-P mode failed"); 254211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 254311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 254411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 254511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 254611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamBatchSize: 254711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 254811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_U32TYPE* pParam = 254911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_PARAM_U32TYPE*)paramData; 255011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 255111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam->nPortIndex == PORT_INDEX_OUT) { 255211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("For the moment, client-driven batching not supported" 255311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel " on output port"); 255411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUnsupportedSetting; 255511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 255611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 255711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_batch_size(pParam->nU32)) { 255811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed setting batch size as %d", pParam->nU32); 255911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUnsupportedSetting; 256011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 256111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 256211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 256311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexParamVencAspectRatio: 256411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 256511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_aspectratio(paramData)) { 256611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Setting OMX_QcomIndexParamVencAspectRatio failed"); 256711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUnsupportedSetting; 256811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 256911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 257011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 257111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QTIIndexParamLowLatencyMode: 257211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 257311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_EXTNINDEX_VIDEO_VENC_LOW_LATENCY_MODE* pParam = 257411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (QOMX_EXTNINDEX_VIDEO_VENC_LOW_LATENCY_MODE*)paramData; 257511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_low_latency(pParam->bLowLatencyMode)) { 257611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Setting OMX_QTIIndexParamLowLatencyMode failed"); 257711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUnsupportedSetting; 257811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 257911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 258011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 258111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QTIIndexParamVideoEnableRoiInfo: 258211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 258311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 25842e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel OMX_QTI_VIDEO_PARAM_ENABLE_ROIINFO *pParam = 25852e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel (OMX_QTI_VIDEO_PARAM_ENABLE_ROIINFO *)paramData; 25862e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel if (pParam->bEnableRoiInfo == OMX_FALSE) { 25872e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel DEBUG_PRINT_INFO("OMX_QTIIndexParamVideoEnableRoiInfo: bEnableRoiInfo is false"); 25882e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel break; 25892e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel } 259011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_sVenc_cfg.codectype != V4L2_PIX_FMT_H264 && 259111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.codectype != V4L2_PIX_FMT_HEVC) { 259211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("OMX_QTIIndexParamVideoEnableRoiInfo is not supported for %lu codec", m_sVenc_cfg.codectype); 259311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUnsupportedSetting; 259411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 259511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 259611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_ROI_QP; 259711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Setting param OMX_QTIIndexParamVideoEnableRoiInfo"); 259811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) { 259911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Setting OMX_QTIIndexParamVideoEnableRoiInfo failed"); 260011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUnsupportedSetting; 260111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 26022e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel m_roi_enabled = true; 2603fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#ifdef _PQ_ 2604fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_pq.pConfig.a_qp.roi_enabled = (OMX_U32)true; 2605b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel allocate_extradata(&m_pq.roi_extradata_info, ION_FLAG_CACHED); 2606b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel m_pq.configure(m_sVenc_cfg.input_width, m_sVenc_cfg.input_height); 2607fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#endif // _PQ_ 260811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 260911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 261011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexConfigVideoVencLowLatencyMode: 261111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 261211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_ENABLETYPE *pParam = (QOMX_ENABLETYPE*)paramData; 261311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 261411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_lowlatency_mode(pParam->bEnable)) { 261511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setting low latency mode failed"); 261611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUnsupportedSetting; 261711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 261811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 261911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 2620fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case OMX_IndexParamAndroidVideoTemporalLayering: 2621fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel { 2622fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (venc_set_temporal_layers( 2623fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel (OMX_VIDEO_PARAM_ANDROID_TEMPORALLAYERINGTYPE*)paramData) != OMX_ErrorNone) { 2624fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("set_param: Failed to configure temporal layers"); 2625fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return false; 2626fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 2627fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 2628fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 2629fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel case OMX_QTIIndexParamDisablePQ: 2630fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel { 2631fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel QOMX_DISABLETYPE * pParam = (QOMX_DISABLETYPE *)paramData; 2632fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_LOW("venc_set_param: OMX_QTIIndexParamDisablePQ: %d", pParam->bDisable); 2633fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel#ifdef _PQ_ 2634bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel m_pq.is_pq_force_disable = (pParam->bDisable == OMX_TRUE); 2635fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel#endif 2636fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel break; 2637fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel } 2638a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel case OMX_QTIIndexParamIframeSizeType: 2639a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel { 2640a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel QOMX_VIDEO_IFRAMESIZE* pParam = 2641a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel (QOMX_VIDEO_IFRAMESIZE *)paramData; 2642a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel isCBR = rate_ctrl.rcmode == V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_CBR_VFR || 2643a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel rate_ctrl.rcmode == V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_CBR_CFR; 2644a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel if (!isCBR) { 2645a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel DEBUG_PRINT_ERROR("venc_set_param: OMX_QTIIndexParamIframeSizeType not allowed for this configuration isCBR(%d)", 2646a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel isCBR); 2647a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel return OMX_ErrorUnsupportedSetting; 2648a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel } 2649a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel if (!venc_set_iframesize_type(pParam->eType)) { 2650a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel DEBUG_PRINT_ERROR("ERROR: Setting OMX_QTIIndexParamIframeSizeType failed"); 2651a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel return OMX_ErrorUnsupportedSetting; 2652a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel } 2653a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel break; 2654a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel } 265511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexParamVideoSliceFMO: 265611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 265711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Unsupported parameter in venc_set_param: %u", 265811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel index); 265911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 266011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //case 266111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 266211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 266311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 266411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 266511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 266611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_check_valid_config() 266711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 266811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (streaming[OUTPUT_PORT] && streaming[CAPTURE_PORT] && 266911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264 && hier_layers.hier_mode == HIER_P_HYBRID) || 267011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_sVenc_cfg.codectype == V4L2_PIX_FMT_HEVC && hier_layers.hier_mode == HIER_P))) { 267111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("venc_set_config not allowed run time for following usecases"); 267211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("For H264 : When Hybrid Hier P enabled"); 267311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("For H265 : When Hier P enabled"); 267411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 267511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 267611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 267711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 267811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 267911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_config(void *configData, OMX_INDEXTYPE index) 268011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 268111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 268211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Inside venc_set_config"); 268311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 268411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!venc_check_valid_config()) { 268511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("venc_set_config not allowed for this configuration"); 268611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 268711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 268811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 268911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch ((int)index) { 269011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexConfigVideoBitrate: 269111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 269211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_CONFIG_BITRATETYPE *bit_rate = (OMX_VIDEO_CONFIG_BITRATETYPE *) 269311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel configData; 269411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_config: OMX_IndexConfigVideoBitrate"); 269511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 269611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bit_rate->nPortIndex == (OMX_U32)PORT_INDEX_OUT) { 269711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (venc_set_target_bitrate(bit_rate->nEncodeBitrate, 1) == false) { 269811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Setting Target Bit rate failed"); 269911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 270011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 270111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 270211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexConfigVideoBitrate"); 270311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 270411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 270511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 270611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 270711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexConfigVideoFramerate: 270811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 270911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CONFIG_FRAMERATETYPE *frame_rate = (OMX_CONFIG_FRAMERATETYPE *) 271011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel configData; 271111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_config: OMX_IndexConfigVideoFramerate"); 271211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 271311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (frame_rate->nPortIndex == (OMX_U32)PORT_INDEX_OUT) { 271411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (venc_set_encode_framerate(frame_rate->xEncodeFramerate, 1) == false) { 271511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Setting Encode Framerate failed"); 271611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 271711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 2718fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#ifdef _PQ_ 2719fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel venc_try_enable_pq(); 2720fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#endif // _PQ_ 272111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 272211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexConfigVideoFramerate"); 272311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 272411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 272511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 272611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 272711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case QOMX_IndexConfigVideoIntraperiod: 272811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 272911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_param:QOMX_IndexConfigVideoIntraperiod"); 273011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_VIDEO_INTRAPERIODTYPE *intraperiod = 273111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (QOMX_VIDEO_INTRAPERIODTYPE *)configData; 273211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 273311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (intraperiod->nPortIndex == (OMX_U32) PORT_INDEX_OUT) { 273411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (venc_set_intra_period(intraperiod->nPFrames, intraperiod->nBFrames) == false) { 273511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Request for setting intra period failed"); 273611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 273711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 273811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 273911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 274011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 274111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 274211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexConfigVideoIntraVOPRefresh: 274311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 274411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CONFIG_INTRAREFRESHVOPTYPE *intra_vop_refresh = (OMX_CONFIG_INTRAREFRESHVOPTYPE *) 274511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel configData; 274611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_config: OMX_IndexConfigVideoIntraVOPRefresh"); 274711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 274811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (intra_vop_refresh->nPortIndex == (OMX_U32)PORT_INDEX_OUT) { 274911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (venc_set_intra_vop_refresh(intra_vop_refresh->IntraRefreshVOP) == false) { 275011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Setting Encode Framerate failed"); 275111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 275211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 275311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 275411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexConfigVideoFramerate"); 275511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 275611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 275711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 275811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 275911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexConfigCommonRotate: 276011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 276111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_CONFIG_ROTATIONTYPE *config_rotation = 276211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel reinterpret_cast<OMX_CONFIG_ROTATIONTYPE*>(configData); 276311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 nFrameWidth; 276411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!config_rotation) { 276511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 276611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 276711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (true == deinterlace_enabled) { 276811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Rotation is not supported with deinterlacing"); 276911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 277011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 277111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(venc_set_vpe_rotation(config_rotation->nRotation) == false) { 277211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Dimension Change for Rotation failed"); 277311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 277411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 277511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 277611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 277711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 277811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexConfigVideoAVCIntraPeriod: 277911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 278011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_CONFIG_AVCINTRAPERIOD *avc_iperiod = (OMX_VIDEO_CONFIG_AVCINTRAPERIOD*) configData; 278111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_param: OMX_IndexConfigVideoAVCIntraPeriod"); 278211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 278311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (venc_set_idr_period(avc_iperiod->nPFrames, avc_iperiod->nIDRPeriod) 278411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel == false) { 278511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Setting " 278611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX_IndexConfigVideoAVCIntraPeriod failed"); 278711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 278811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 278911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 279011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 279111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexConfigCommonDeinterlace: 279211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 279311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_CONFIG_DEINTERLACE *deinterlace = (OMX_VIDEO_CONFIG_DEINTERLACE *) configData; 279411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_config: OMX_IndexConfigCommonDeinterlace"); 279511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(deinterlace->nPortIndex == (OMX_U32)PORT_INDEX_OUT) { 279611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_sVenc_cfg.dvs_width == m_sVenc_cfg.input_height && 279711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.dvs_height == m_sVenc_cfg.input_width) 279811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 279911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Deinterlace not supported with rotation"); 280011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 280111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 280211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(venc_set_deinterlace(deinterlace->nEnable) == false) { 280311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Setting Deinterlace failed"); 280411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 280511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 280611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 280711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexConfigCommonDeinterlace"); 280811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 280911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 281011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 281111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexConfigVideoVp8ReferenceFrame: 281211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 281311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_VP8REFERENCEFRAMETYPE* vp8refframe = (OMX_VIDEO_VP8REFERENCEFRAMETYPE*) configData; 281411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_config: OMX_IndexConfigVideoVp8ReferenceFrame"); 281511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((vp8refframe->nPortIndex == (OMX_U32)PORT_INDEX_IN) && 281611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (vp8refframe->bUseGoldenFrame)) { 281711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(venc_set_useltr(0x1) == false) { 281811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: use goldenframe failed"); 281911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 282011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 282111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if((vp8refframe->nPortIndex == (OMX_U32)PORT_INDEX_IN) && 282211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (vp8refframe->bGoldenFrameRefresh)) { 282311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(venc_set_markltr(0x1) == false) { 282411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Setting goldenframe failed"); 282511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 282611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 282711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 282811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexConfigVideoVp8ReferenceFrame"); 282911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 283011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 283111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 283211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexConfigVideoLTRUse: 283311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 283411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_VIDEO_CONFIG_LTRUSE_TYPE* pParam = (OMX_QCOM_VIDEO_CONFIG_LTRUSE_TYPE*)configData; 283511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_config: OMX_QcomIndexConfigVideoLTRUse"); 283611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam->nPortIndex == (OMX_U32)PORT_INDEX_IN) { 283711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (venc_set_useltr(pParam->nID) == false) { 283811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Use LTR failed"); 283911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 284011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 284111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 284211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_QcomIndexConfigVideoLTRUse"); 284311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 284411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 284511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 284611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexConfigVideoLTRMark: 284711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 284811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_VIDEO_CONFIG_LTRMARK_TYPE* pParam = (OMX_QCOM_VIDEO_CONFIG_LTRMARK_TYPE*)configData; 284911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_config: OMX_QcomIndexConfigVideoLTRMark"); 285011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pParam->nPortIndex == (OMX_U32)PORT_INDEX_IN) { 285111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (venc_set_markltr(pParam->nID) == false) { 285211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Mark LTR failed"); 285311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 285411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 285511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 285611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_QcomIndexConfigVideoLTRMark"); 285711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 285811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 285911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 286011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexConfigPerfLevel: 286111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 286211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL *perf = 286311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL *)configData; 286411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Set perf level: %d", perf->ePerfLevel); 286511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_perf_level(perf->ePerfLevel)) { 286611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Failed to set perf level to %d", perf->ePerfLevel); 286711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 286811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 286911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel performance_level.perflevel = (unsigned int) perf->ePerfLevel; 287011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 287111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 287211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 287311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexConfigVideoVencPerfMode: 287411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 287511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_EXTNINDEX_VIDEO_PERFMODE *pParam = (QOMX_EXTNINDEX_VIDEO_PERFMODE *) configData; 287611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_config: OMX_QcomIndexConfigVideoVencPerfMode"); 287711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (venc_set_perf_mode(pParam->nPerfMode) == false) { 287811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set V4L2_CID_MPEG_VIDC_VIDEO_PERF_MODE"); 287911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 288011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 288111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 288211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 288311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexConfigNumHierPLayers: 288411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 288511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_EXTNINDEX_VIDEO_HIER_P_LAYERS *pParam = 288611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (QOMX_EXTNINDEX_VIDEO_HIER_P_LAYERS *) configData; 288711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_config: OMX_QcomIndexConfigNumHierPLayers"); 288811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (venc_set_hierp_layers(pParam->nNumHierLayers) == false) { 288911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set OMX_QcomIndexConfigNumHierPLayers"); 289011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 289111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 289211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 289311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 289411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexConfigBaseLayerId: 289511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 289611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SKYPE_VIDEO_CONFIG_BASELAYERPID* pParam = 289711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_SKYPE_VIDEO_CONFIG_BASELAYERPID*) configData; 289811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (venc_set_baselayerid(pParam->nPID) == false) { 289911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set OMX_QcomIndexConfigBaseLayerId failed"); 290011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUnsupportedSetting; 290111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 290211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 290311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 2904fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case OMX_IndexParamAndroidVideoTemporalLayering: 2905fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel { 2906fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("TemporalLayer: Changing layer-configuration dynamically is not supported!"); 2907fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return false; 2908fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 290911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QcomIndexConfigQp: 291011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 291111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_SKYPE_VIDEO_CONFIG_QP* pParam = 291211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (OMX_SKYPE_VIDEO_CONFIG_QP*) configData; 291311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (venc_set_qp(pParam->nQP) == false) { 291411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set OMX_QcomIndexConfigQp failed"); 291511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUnsupportedSetting; 291611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 291711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 291811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 291911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexConfigPriority: 292011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 292111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_U32TYPE *priority = (OMX_PARAM_U32TYPE *)configData; 292211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Set_config: priority %d",priority->nU32); 292311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_priority(priority->nU32)) { 292411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set priority"); 292511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 292611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 292711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 292811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 292911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexConfigOperatingRate: 293011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 293111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PARAM_U32TYPE *rate = (OMX_PARAM_U32TYPE *)configData; 293211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Set_config: operating rate %d", rate->nU32); 293311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_operatingrate(rate->nU32)) { 293411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set operating rate"); 293511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 293611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 293711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 293811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 293911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef SUPPORT_CONFIG_INTRA_REFRESH 294011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_IndexConfigAndroidIntraRefresh: 294111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 294211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE *intra_refresh = (OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE *)configData; 294311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("OMX_IndexConfigAndroidIntraRefresh : num frames = %d", intra_refresh->nRefreshPeriod); 294411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 294511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (intra_refresh->nPortIndex == (OMX_U32) PORT_INDEX_OUT) { 294611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 mb_size = m_sVenc_cfg.codectype == V4L2_PIX_FMT_HEVC ? 32 : 16; 294711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 num_mbs_per_frame = (ALIGN(m_sVenc_cfg.dvs_height, mb_size)/mb_size) * (ALIGN(m_sVenc_cfg.dvs_width, mb_size)/mb_size); 294811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 num_intra_refresh_mbs = ceil(num_mbs_per_frame / intra_refresh->nRefreshPeriod); 294911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 295011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (venc_set_intra_refresh(OMX_VIDEO_IntraRefreshRandom, num_intra_refresh_mbs) == false) { 295111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Setting Intra refresh failed"); 295211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 295311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 295411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 295511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexConfigVideoIntraRefreshType"); 295611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 295711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 295811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 295911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 296011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QTIIndexConfigVideoBlurResolution: 296111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 296211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_QTI_VIDEO_CONFIG_BLURINFO *blur = (OMX_QTI_VIDEO_CONFIG_BLURINFO *)configData; 296311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (blur->nPortIndex == (OMX_U32)PORT_INDEX_IN) { 296411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Set_config: blur resolution: %d", blur->eTargetResol); 296511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(!venc_set_blur_resolution(blur)) { 296611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set Blur Resolution"); 296711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 296811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 296911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 297011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_QTIIndexConfigVideoBlurResolution"); 297111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 297211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 297311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 297411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 29752601808ee2992a94c325d05e4065aba60b01840bThierry Strudel case OMX_QcomIndexConfigH264Transform8x8: 29762601808ee2992a94c325d05e4065aba60b01840bThierry Strudel { 29772601808ee2992a94c325d05e4065aba60b01840bThierry Strudel OMX_CONFIG_BOOLEANTYPE *pEnable = (OMX_CONFIG_BOOLEANTYPE *) configData; 29782601808ee2992a94c325d05e4065aba60b01840bThierry Strudel DEBUG_PRINT_LOW("venc_set_config: OMX_QcomIndexConfigH264Transform8x8"); 29792601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (venc_h264_transform_8x8(pEnable->bEnabled) == false) { 29802601808ee2992a94c325d05e4065aba60b01840bThierry Strudel DEBUG_PRINT_ERROR("Failed to set OMX_QcomIndexConfigH264Transform8x8"); 29812601808ee2992a94c325d05e4065aba60b01840bThierry Strudel return false; 29822601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 29832601808ee2992a94c325d05e4065aba60b01840bThierry Strudel break; 29842601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 2985fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case OMX_QTIIndexConfigDescribeColorAspects: 2986fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel { 2987fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DescribeColorAspectsParams *params = (DescribeColorAspectsParams *)configData; 2988fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 2989fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel OMX_U32 color_space = MSM_VIDC_BT601_6_625; 2990fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel OMX_U32 full_range = 0; 2991fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel OMX_U32 matrix_coeffs = MSM_VIDC_MATRIX_601_6_625; 2992fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel OMX_U32 transfer_chars = MSM_VIDC_TRANSFER_601_6_625; 2993fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 2994fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel switch((ColorAspects::Primaries)(params->sAspects.mPrimaries)) { 2995fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case ColorAspects::PrimariesBT709_5: 2996fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel color_space = MSM_VIDC_BT709_5; 2997fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 2998fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case ColorAspects::PrimariesBT470_6M: 2999fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel color_space = MSM_VIDC_BT470_6_M; 3000fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 3001fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case ColorAspects::PrimariesBT601_6_625: 3002fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel color_space = MSM_VIDC_BT601_6_625; 3003fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 3004fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case ColorAspects::PrimariesBT601_6_525: 3005fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel color_space = MSM_VIDC_BT601_6_525; 3006fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 3007fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case ColorAspects::PrimariesGenericFilm: 3008fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel color_space = MSM_VIDC_GENERIC_FILM; 3009fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 3010fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case ColorAspects::PrimariesBT2020: 3011fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel color_space = MSM_VIDC_BT2020; 3012fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 3013fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel default: 3014fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel color_space = MSM_VIDC_BT601_6_625; 3015fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel //params->sAspects.mPrimaries = ColorAspects::PrimariesBT601_6_625; 3016fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 3017fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 3018fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel switch((ColorAspects::Range)params->sAspects.mRange) { 3019fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case ColorAspects::RangeFull: 3020fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel full_range = 1; 3021fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 3022fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case ColorAspects::RangeLimited: 3023fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel full_range = 0; 3024fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 3025fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel default: 3026fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 3027fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 3028fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel switch((ColorAspects::Transfer)params->sAspects.mTransfer) { 3029fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case ColorAspects::TransferSMPTE170M: 3030fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel transfer_chars = MSM_VIDC_TRANSFER_601_6_525; 3031fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 3032fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case ColorAspects::TransferUnspecified: 3033fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel transfer_chars = MSM_VIDC_TRANSFER_UNSPECIFIED; 3034fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 3035fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case ColorAspects::TransferGamma22: 3036fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel transfer_chars = MSM_VIDC_TRANSFER_BT_470_6_M; 3037fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 3038fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case ColorAspects::TransferGamma28: 3039fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel transfer_chars = MSM_VIDC_TRANSFER_BT_470_6_BG; 3040fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 3041fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case ColorAspects::TransferSMPTE240M: 3042fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel transfer_chars = MSM_VIDC_TRANSFER_SMPTE_240M; 3043fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 3044fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case ColorAspects::TransferLinear: 3045fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel transfer_chars = MSM_VIDC_TRANSFER_LINEAR; 3046fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 3047fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case ColorAspects::TransferXvYCC: 3048fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel transfer_chars = MSM_VIDC_TRANSFER_IEC_61966; 3049fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 3050fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case ColorAspects::TransferBT1361: 3051fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel transfer_chars = MSM_VIDC_TRANSFER_BT_1361; 3052fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 3053fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case ColorAspects::TransferSRGB: 3054fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel transfer_chars = MSM_VIDC_TRANSFER_SRGB; 3055fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 3056fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel default: 3057fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel //params->sAspects.mTransfer = ColorAspects::TransferSMPTE170M; 3058fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel transfer_chars = MSM_VIDC_TRANSFER_601_6_625; 3059fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 3060fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 3061fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel switch((ColorAspects::MatrixCoeffs)params->sAspects.mMatrixCoeffs) { 3062fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case ColorAspects::MatrixUnspecified: 3063fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel matrix_coeffs = MSM_VIDC_MATRIX_UNSPECIFIED; 3064fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 3065fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case ColorAspects::MatrixBT709_5: 3066fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel matrix_coeffs = MSM_VIDC_MATRIX_BT_709_5; 3067fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 3068fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case ColorAspects::MatrixBT470_6M: 3069fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel matrix_coeffs = MSM_VIDC_MATRIX_FCC_47; 3070fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 3071fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case ColorAspects::MatrixBT601_6: 3072fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel matrix_coeffs = MSM_VIDC_MATRIX_601_6_525; 3073fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 3074fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case ColorAspects::MatrixSMPTE240M: 3075fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel transfer_chars = MSM_VIDC_MATRIX_SMPTE_240M; 3076fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 3077fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case ColorAspects::MatrixBT2020: 3078fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel matrix_coeffs = MSM_VIDC_MATRIX_BT_2020; 3079fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 3080fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case ColorAspects::MatrixBT2020Constant: 3081fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel matrix_coeffs = MSM_VIDC_MATRIX_BT_2020_CONST; 3082fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 3083fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel default: 3084fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel //params->sAspects.mMatrixCoeffs = ColorAspects::MatrixBT601_6; 3085fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel matrix_coeffs = MSM_VIDC_MATRIX_601_6_625; 3086fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 3087fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 3088fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (!venc_set_colorspace(color_space, full_range, 3089fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel transfer_chars, matrix_coeffs)) { 3090fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 3091fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Failed to set operating rate"); 3092fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return false; 3093fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 3094fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 3095fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 3096fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case OMX_QTIIndexConfigVideoRoiInfo: 3097fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel { 3098fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if(!venc_set_roi_qp_info((OMX_QTI_VIDEO_CONFIG_ROIINFO *)configData)) { 3099fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Failed to set ROI QP info"); 3100fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return false; 3101fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 3102fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 3103fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 310411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 310511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Unsupported config index = %u", index); 310611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 310711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 310811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 310911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 311011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 311111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 311211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelunsigned venc_dev::venc_stop( void) 311311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 311411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct venc_msg venc_msg; 311511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_requestbuffers bufreq; 311611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0, ret = 0; 311711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 311811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!stopped) { 311911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enum v4l2_buf_type cap_type; 312011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 312111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (streaming[OUTPUT_PORT]) { 312211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel cap_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 312311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_STREAMOFF, &cap_type); 312411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 312511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 312611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to call streamoff on driver: capability: %d, %d", 312711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel cap_type, rc); 312811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else 312911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel streaming[OUTPUT_PORT] = false; 313011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 313111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Releasing registered buffers from driver on o/p port"); 313211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.memory = V4L2_MEMORY_USERPTR; 313311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count = 0; 313411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 313511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(m_nDriver_fd, VIDIOC_REQBUFS, &bufreq); 313611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 313711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 313811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: VIDIOC_REQBUFS OUTPUT MPLANE Failed"); 313911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 314011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 314111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 314211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 314311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!rc && streaming[CAPTURE_PORT]) { 314411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel cap_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 314511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_STREAMOFF, &cap_type); 314611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 314711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 314811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to call streamoff on driver: capability: %d, %d", 314911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel cap_type, rc); 315011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else 315111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel streaming[CAPTURE_PORT] = false; 315211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 315311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Releasing registered buffers from driver on capture port"); 315411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.memory = V4L2_MEMORY_USERPTR; 315511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count = 0; 315611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 315711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(m_nDriver_fd, VIDIOC_REQBUFS, &bufreq); 315811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 315911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 316011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: VIDIOC_REQBUFS CAPTURE MPLANE Failed"); 316111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 316211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 316311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 316411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 316511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!rc && !ret) { 316611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_stop_done(); 316711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel stopped = 1; 316811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*set flag to re-configure when started again*/ 316911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel resume_in_stopped = 1; 317011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 317111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 317211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 317311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 317411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return rc; 317511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 317611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 317711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelunsigned venc_dev::venc_pause(void) 317811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 317911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&pause_resume_mlock); 318011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel paused = true; 318111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&pause_resume_mlock); 318211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 0; 318311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 318411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 318511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelunsigned venc_dev::venc_resume(void) 318611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 318711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&pause_resume_mlock); 318811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel paused = false; 318911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&pause_resume_mlock); 319011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 319111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return pthread_cond_signal(&pause_resume_cond); 319211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 319311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 319411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelunsigned venc_dev::venc_start_done(void) 319511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 319611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct venc_msg venc_msg; 319711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_msg.msgcode = VEN_MSG_START; 319811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_msg.statuscode = VEN_S_SUCCESS; 319911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_handle->async_message_process(venc_handle,&venc_msg); 320011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 0; 320111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 320211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 320311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelunsigned venc_dev::venc_stop_done(void) 320411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 320511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct venc_msg venc_msg; 320642adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel free_extradata_all(); 320711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_msg.msgcode=VEN_MSG_STOP; 320811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_msg.statuscode=VEN_S_SUCCESS; 320911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_handle->async_message_process(venc_handle,&venc_msg); 321011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 0; 321111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 321211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 321311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelunsigned venc_dev::venc_set_message_thread_id(pthread_t tid) 321411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 321511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel async_thread_created = true; 321611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_tid=tid; 321711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 0; 321811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 321911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 322011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_vqzip_defaults() 322111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 322211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 322311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0, num_mbs_per_frame; 322411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 322511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel num_mbs_per_frame = m_sVenc_cfg.input_height * m_sVenc_cfg.input_width; 322611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 322711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (num_mbs_per_frame) { 322811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_CORE_720P_WIDTH * OMX_CORE_720P_HEIGHT: 322911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_CORE_1080P_WIDTH * OMX_CORE_1080P_HEIGHT: 323011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_CORE_4KUHD_WIDTH * OMX_CORE_4KUHD_HEIGHT: 323111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_CORE_4KDCI_WIDTH * OMX_CORE_4KDCI_HEIGHT: 323211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 323311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 323411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("VQZIP is not supported for this resoultion : %lu X %lu", 323511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.input_width, m_sVenc_cfg.input_height); 323611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 323711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 323811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 323911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL; 324011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_OFF; 324111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 324211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) 324311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set Rate Control OFF for VQZIP"); 324411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_P_FRAMES; 324511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = INT_MAX; 324611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 324711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 324811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) 324911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set P frame period for VQZIP"); 325011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 325111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_B_FRAMES; 325211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = 0; 325311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 325411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 325511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) 325611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set B frame period for VQZIP"); 325711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 325811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_PERF_MODE; 325911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_VIDEO_PERF_MAX_QUALITY; 326011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 326111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 326211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) 326311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set Max quality for VQZIP"); 326411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 326511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_IDR_PERIOD; 326611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = 1; 326711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 326811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 326911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) 327011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set IDR period for VQZIP"); 327111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 327211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 327311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 327411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 327511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelunsigned venc_dev::venc_start(void) 327611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 327711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enum v4l2_buf_type buf_type; 327811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ret, r; 327911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 328011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 328111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&control, 0, sizeof(control)); 328211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 328311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("%s(): Check Profile/Level set in driver before start", 328411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel __func__); 328511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_level_set = false; 328611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 328711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_profile_level(0, 0)) { 328811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s(): Driver Profile/Level is NOT SET", 328911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel __func__); 329011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 329111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("%s(): Driver Profile[%lu]/Level[%lu] successfully SET", 329211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel __func__, codec_profile.profile, profile_level.level); 329311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 329411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 3295fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#ifdef _PQ_ 3296fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel /* 3297fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel * Make sure that PQ is still applicable for given configuration. 3298fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel * This call mainly disables PQ if current encoder configuration 3299fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel * doesn't support PQ. PQ cann't enabled here as buffer allocation 3300fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel * is already done by this time. 3301fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel */ 3302fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel venc_try_enable_pq(); 3303fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#endif // _PQ_ 3304fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 330511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (vqzip_sei_info.enabled && !venc_set_vqzip_defaults()) 330611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 1; 330711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 330811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) 330911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_set_low_latency((OMX_BOOL)!intra_period.num_bframes); 331011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 3311fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // re-configure the temporal layers as RC-mode and key-frame interval 3312fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // might have changed since the client last configured the layers. 3313fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (temporal_layers_config.nPLayers) { 3314fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (venc_set_temporal_layers_internal() != OMX_ErrorNone) { 3315fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Re-configuring temporal layers failed !"); 3316fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else { 3317fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // request buffers on capture port again since internal (scratch)- 3318fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // buffer requirements may change (i.e if we switch from non-hybrid 3319fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // to hybrid mode and vice-versa) 3320fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel struct v4l2_requestbuffers bufreq; 3321fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 3322fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel bufreq.memory = V4L2_MEMORY_USERPTR; 3323fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel bufreq.count = m_sOutput_buff_property.actualcount; 3324fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel bufreq.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 3325fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_REQBUFS, &bufreq)) { 3326fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Request bufs failed while reconfiguring layers"); 3327fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 3328fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 3329fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 3330fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 333111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_config_print(); 333211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 333311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(resume_in_stopped){ 333411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /*set buffercount when restarted*/ 333511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_reconfig_reqbufs(); 333611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel resume_in_stopped = 0; 333711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 333811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 333911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Check if slice_delivery mode is enabled & max slices is sufficient for encoding complete frame */ 334011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (slice_mode.enable && multislice.mslice_size && 334111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_sVenc_cfg.dvs_width * m_sVenc_cfg.dvs_height)/(256 * multislice.mslice_size) >= MAX_SUPPORTED_SLICES_PER_FRAME) { 334211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("slice_mode: %lu, max slices (%lu) should be less than (%d)", slice_mode.enable, 334311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_sVenc_cfg.dvs_width * m_sVenc_cfg.dvs_height)/(256 * multislice.mslice_size), 334411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel MAX_SUPPORTED_SLICES_PER_FRAME); 334511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 1; 334611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 334711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 334811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 334911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing"); 335011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret=ioctl(m_nDriver_fd, VIDIOC_STREAMON,&buf_type); 335111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 335211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) 335311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 1; 335411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 335511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel streaming[CAPTURE_PORT] = true; 335611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 335711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* 335811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Workaround for Skype usecase. Skpye doesn't like SPS\PPS come as 335911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel seperate buffer. It wants SPS\PPS with IDR frame FTB. 336011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 336111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 336211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_handle->m_slowLatencyMode.bLowLatencyMode) { 336311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_REQUEST_SEQ_HEADER; 336411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = 1; 336511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 336611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 336711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("failed to request seq header"); 336811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 1; 336911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 337011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 337111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 337211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* This is intentionally done after SEQ_HEADER check. Because 337311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * PIC_ORDER_CNT is tightly coupled with lowlatency. Low latency 337411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * flag is also overloaded not to send SPS in separate buffer. 337511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Hence lowlatency setting is done after SEQ_HEADER check. 337611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Don't change this sequence unless you know what you are doing. 337711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 337811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 337911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) 338011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel venc_set_low_latency((OMX_BOOL)!intra_period.num_bframes); 338111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 338211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel stopped = 0; 338311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 0; 338411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 338511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 338611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelinline const char* hiermode_string(int val) 338711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 338811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch(val) 338911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 339011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case HIER_NONE: 339111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return "No Hier"; 339211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case HIER_P: 339311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return "Hier-P"; 339411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case HIER_B: 339511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return "Hier-B"; 339611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case HIER_P_HYBRID: 339711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return "Hybrid Hier-P"; 339811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 339911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return "No hier"; 340011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 340111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 340211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 340311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelinline const char* bitrate_type_string(int val) 340411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 340511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch(val) 340611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 340711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_CID_MPEG_VIDC_VIDEO_VENC_BITRATE_DISABLE: 340811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return "CUMULATIVE"; 340911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_CID_MPEG_VIDC_VIDEO_VENC_BITRATE_ENABLE: 341011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return "LAYER WISE"; 341111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 341211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return "Unknown Bitrate Type"; 341311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 341411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 341511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 3416fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelstatic const char *codec_as_string(unsigned long codec) { 3417fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel switch (codec) { 3418fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_H264: 3419fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return "H264"; 3420fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_MPEG4: 3421fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return "MPEG4"; 3422fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_H263: 3423fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return "H263"; 3424fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_HEVC: 3425fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return "HEVC"; 3426fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_VP8: 3427fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return "VP8"; 3428fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel default: 3429fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return "UNKOWN"; 3430fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 3431fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel} 3432fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 343311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid venc_dev::venc_config_print() 343411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 343511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 3436fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("ENC_CONFIG: Codec: %s, Profile %ld, level : %ld", 3437fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel codec_as_string(m_sVenc_cfg.codectype), codec_profile.profile, profile_level.level); 343811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 343911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("ENC_CONFIG: Input Width: %ld, Height:%ld, Fps: %ld", 344011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, 344111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.fps_num/m_sVenc_cfg.fps_den); 344211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 344311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("ENC_CONFIG: Output Width: %ld, Height:%ld, Fps: %ld", 344411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.dvs_width, m_sVenc_cfg.dvs_height, 344511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.fps_num/m_sVenc_cfg.fps_den); 344611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 3447fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("ENC_CONFIG: Color Space: Primaries = %u, Range = %u, Transfer Chars = %u, Matrix Coeffs = %u", 3448fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel color_space.primaries, color_space.range, color_space.transfer_chars, color_space.matrix_coeffs); 3449fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 345011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("ENC_CONFIG: Bitrate: %ld, RC: %ld, P - Frames : %ld, B - Frames = %ld", 345111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bitrate.target_bitrate, rate_ctrl.rcmode, intra_period.num_pframes, intra_period.num_bframes); 345211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 345311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("ENC_CONFIG: qpI: %ld, qpP: %ld, qpb: %ld", 345411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel session_qp.iframeqp, session_qp.pframeqp, session_qp.bframeqp); 345511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 345611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("ENC_CONFIG: Init_qpI: %ld, Init_qpP: %ld, Init_qpb: %ld", 345711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel init_qp.iframeqp, init_qp.pframeqp, init_qp.bframeqp); 345811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 345911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("ENC_CONFIG: minQP: %lu, maxQP: %lu", 346011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel session_qp_values.minqp, session_qp_values.maxqp); 346111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 346211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("ENC_CONFIG: VOP_Resolution: %ld, Slice-Mode: %ld, Slize_Size: %ld", 346311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel voptimecfg.voptime_resolution, multislice.mslice_mode, 346411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel multislice.mslice_size); 346511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 346611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("ENC_CONFIG: EntropyMode: %d, CabacModel: %ld", 346711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel entropy.longentropysel, entropy.cabacmodel); 346811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 346911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("ENC_CONFIG: DB-Mode: %ld, alpha: %ld, Beta: %ld", 347011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dbkfilter.db_mode, dbkfilter.slicealpha_offset, 347111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dbkfilter.slicebeta_offset); 347211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 347311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("ENC_CONFIG: IntraMB/Frame: %ld, HEC: %ld, IDR Period: %ld", 347411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel intra_refresh.mbcount, hec.header_extension, idrperiod.idrperiod); 347511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 347611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("ENC_CONFIG: LTR Enabled: %d, Count: %d", 347711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ltrinfo.enabled, ltrinfo.count); 347811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 3479fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (temporal_layers_config.nPLayers) { 3480fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("ENC_CONFIG: Temporal layers: P-layers: %u, B-layers: %u, Adjusted I-frame-interval: %lu", 3481fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel temporal_layers_config.nPLayers, temporal_layers_config.nBLayers, 3482fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel intra_period.num_pframes + intra_period.num_bframes + 1); 348311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 3484fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel for (OMX_U32 l = 0; temporal_layers_config.bIsBitrateRatioValid 3485fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel && (l < temporal_layers_config.nPLayers + temporal_layers_config.nBLayers); ++l) { 3486fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("ENC_CONFIG: Temporal layers: layer[%d] bitrate %% = %u%%", 3487fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel l, temporal_layers_config.nTemporalLayerBitrateFraction[l]); 3488fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 3489fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else { 3490fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 3491fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("ENC_CONFIG: Hier layers: %d, Hier Mode: %s VPX_ErrorResilience: %d", 3492fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel hier_layers.numlayers, hiermode_string(hier_layers.hier_mode), vpx_err_resilience.enable); 349311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 3494fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("ENC_CONFIG: Hybrid_HP PARAMS: Layers: %d, Frame Interval : %d, MinQP: %d, Max_QP: %d", 3495fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel hybrid_hp.nHpLayers, hybrid_hp.nKeyFrameInterval, hybrid_hp.nMinQuantizer, hybrid_hp.nMaxQuantizer); 3496fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 3497fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("ENC_CONFIG: Hybrid_HP PARAMS: Layer0: %d, Layer1: %d, Later2: %d, Layer3: %d, Layer4: %d, Layer5: %d", 3498fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel hybrid_hp.nTemporalLayerBitrateRatio[0], hybrid_hp.nTemporalLayerBitrateRatio[1], 3499fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel hybrid_hp.nTemporalLayerBitrateRatio[2], hybrid_hp.nTemporalLayerBitrateRatio[3], 3500fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel hybrid_hp.nTemporalLayerBitrateRatio[4], hybrid_hp.nTemporalLayerBitrateRatio[5]); 3501fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 350211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 350311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("ENC_CONFIG: Performace level: %d", performance_level.perflevel); 350411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 350511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("ENC_CONFIG: VUI timing info enabled: %d", vui_timing_info.enabled); 350611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 350711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("ENC_CONFIG: Peak bitrate: %d", peak_bitrate.peakbitrate); 350811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 350911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("ENC_CONFIG: Session Priority: %u", sess_priority.priority); 351011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 35112e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel DEBUG_PRINT_HIGH("ENC_CONFIG: ROI : %u", m_roi_enabled); 3512fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#ifdef _PQ_ 3513fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("ENC_CONFIG: Adaptive QP (PQ): %u", m_pq.is_pq_enabled); 3514fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#endif // _PQ_ 3515fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 351611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("ENC_CONFIG: Operating Rate: %u", operating_rate); 351711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 351811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 351911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_reconfig_reqbufs() 352011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 352111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_requestbuffers bufreq; 352211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 352311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.memory = V4L2_MEMORY_USERPTR; 352411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count = m_sInput_buff_property.actualcount; 352511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 352611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq)) { 352711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("VIDIOC_REQBUFS OUTPUT_MPLANE Failed when resume"); 352811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 352911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 353011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 353111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.memory = V4L2_MEMORY_USERPTR; 353211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count = m_sOutput_buff_property.actualcount; 353311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 353411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq)) 353511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 353611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Request for setting o/p buffer count failed when resume"); 353711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 353811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 353911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 354011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 354111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 354211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelunsigned venc_dev::venc_flush( unsigned port) 354311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 354411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_encoder_cmd enc; 354511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("in %s", __func__); 354611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 354742adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel unsigned int cookie = 0; 354842adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel for (unsigned int i = 0; i < (sizeof(fd_list)/sizeof(fd_list[0])); i++) { 354942adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel cookie = fd_list[i]; 355042adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel if (cookie != 0) { 355142adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel if (!ioctl(input_extradata_info.m_ion_dev, ION_IOC_FREE, &cookie)) { 355242adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel DEBUG_PRINT_HIGH("Freed handle = %u", cookie); 355342adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel } 355442adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel fd_list[i] = 0; 355542adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel } 355642adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel } 355742adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel 355811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enc.cmd = V4L2_ENC_QCOM_CMD_FLUSH; 355911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enc.flags = V4L2_QCOM_CMD_FLUSH_OUTPUT | V4L2_QCOM_CMD_FLUSH_CAPTURE; 356011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 356111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_ENCODER_CMD, &enc)) { 356211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Flush Port (%d) Failed ", port); 356311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return -1; 356411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 356511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 356611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return 0; 356711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 356811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 356911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 357011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//allocating I/P memory from pmem and register with the device 357111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 357211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 357311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_use_buf(void *buf_addr, unsigned port,unsigned index) 357411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 357511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 357611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct pmem *pmem_tmp; 357711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_buffer buf; 357811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_plane plane[VIDEO_MAX_PLANES]; 357911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 358011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int extra_idx; 358111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int extradata_index = 0; 358211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 358311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_tmp = (struct pmem *)buf_addr; 358411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_use_buf:: pmem_tmp = %p", pmem_tmp); 358511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 358611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (port == PORT_INDEX_IN) { 358711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra_idx = EXTRADATA_IDX(num_input_planes); 358811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 358911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((num_input_planes > 1) && (extra_idx)) { 3590b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel rc = allocate_extradata(&input_extradata_info, ION_FLAG_CACHED); 359111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 359211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) 359311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to allocate extradata: %d\n", rc); 359411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 359511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.index = index; 359611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 359711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.memory = V4L2_MEMORY_USERPTR; 359811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].length = pmem_tmp->size; 359911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].m.userptr = (unsigned long)pmem_tmp->buffer; 360011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].reserved[0] = pmem_tmp->fd; 360111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].reserved[1] = 0; 360211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].data_offset = pmem_tmp->offset; 360311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.m.planes = plane; 360411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.length = num_input_planes; 360511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 360611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelif (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 36072601808ee2992a94c325d05e4065aba60b01840bThierry Strudel extradata_index = venc_get_index_from_fd(input_extradata_info.m_ion_dev, pmem_tmp->fd); 360811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (extradata_index < 0 ) { 360911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Extradata index calculation went wrong for fd = %d", pmem_tmp->fd); 361011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 361111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 361211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].length = input_extradata_info.buffer_size; 361311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].m.userptr = (unsigned long) (input_extradata_info.uaddr + extradata_index * input_extradata_info.buffer_size); 361411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 361511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].reserved[0] = input_extradata_info.ion.fd_ion_data.fd; 361611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 361711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].reserved[1] = input_extradata_info.buffer_size * extradata_index; 361811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].data_offset = 0; 361911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extra_idx >= VIDEO_MAX_PLANES) { 362011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d\n", extra_idx); 362111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 362211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 362311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 362411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 362511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Registering [%d] fd=%d size=%d userptr=%lu", index, 362611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_tmp->fd, plane[0].length, plane[0].m.userptr); 362711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_PREPARE_BUF, &buf); 362811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 362911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) 363011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("VIDIOC_PREPARE_BUF Failed"); 363111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (port == PORT_INDEX_OUT) { 363211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra_idx = EXTRADATA_IDX(num_output_planes); 363311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 363411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((num_output_planes > 1) && (extra_idx)) { 3635b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel rc = allocate_extradata(&output_extradata_info, 0); 363611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 363711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) 363811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to allocate extradata: %d", rc); 363911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 364011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 364111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.index = index; 364211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 364311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.memory = V4L2_MEMORY_USERPTR; 364411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].length = pmem_tmp->size; 364511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].m.userptr = (unsigned long)pmem_tmp->buffer; 364611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].reserved[0] = pmem_tmp->fd; 364711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].reserved[1] = 0; 364811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].data_offset = pmem_tmp->offset; 364911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.m.planes = plane; 365011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.length = num_output_planes; 365111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 365211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 365311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].length = output_extradata_info.buffer_size; 365411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].m.userptr = (unsigned long) (output_extradata_info.uaddr + index * output_extradata_info.buffer_size); 365511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 365611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].reserved[0] = output_extradata_info.ion.fd_ion_data.fd; 365711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 365811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].reserved[1] = output_extradata_info.buffer_size * index; 365911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].data_offset = 0; 366011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extra_idx >= VIDEO_MAX_PLANES) { 366111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d", extra_idx); 366211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 366311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 366411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 366511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_PREPARE_BUF, &buf); 366611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 366711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) 366811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("VIDIOC_PREPARE_BUF Failed"); 366911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 367011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: venc_use_buf:Invalid Port Index "); 367111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 367211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 367311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 367411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 367511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 367611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 367711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_free_buf(void *buf_addr, unsigned port) 367811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 367911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct pmem *pmem_tmp; 368011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct venc_bufferpayload dev_buffer; 368111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 368211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&dev_buffer, 0, sizeof(dev_buffer)); 368311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pmem_tmp = (struct pmem *)buf_addr; 368411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 368511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (port == PORT_INDEX_IN) { 368611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer; 368711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dev_buffer.fd = pmem_tmp->fd; 368811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dev_buffer.maped_size = pmem_tmp->size; 368911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dev_buffer.sz = pmem_tmp->size; 369011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dev_buffer.offset = pmem_tmp->offset; 369111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_free_buf:pbuffer = %p,fd = %x, offset = %d, maped_size = %d", \ 369211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dev_buffer.pbuffer, \ 369311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dev_buffer.fd, \ 369411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dev_buffer.offset, \ 369511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dev_buffer.maped_size); 369611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 369711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (port == PORT_INDEX_OUT) { 369811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer; 369911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dev_buffer.fd = pmem_tmp->fd; 370011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dev_buffer.sz = pmem_tmp->size; 370111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dev_buffer.maped_size = pmem_tmp->size; 370211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dev_buffer.offset = pmem_tmp->offset; 370311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 370411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_free_buf:pbuffer = %p,fd = %x, offset = %d, maped_size = %d", \ 370511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dev_buffer.pbuffer, \ 370611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dev_buffer.fd, \ 370711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dev_buffer.offset, \ 370811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dev_buffer.maped_size); 370911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 371011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: venc_free_buf:Invalid Port Index "); 371111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 371211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 371311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 371411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 371511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 371611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 371711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_color_align(OMX_BUFFERHEADERTYPE *buffer, 371811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 width, OMX_U32 height) 371911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 372011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 y_stride = VENUS_Y_STRIDE(COLOR_FMT_NV12, width), 372111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel y_scanlines = VENUS_Y_SCANLINES(COLOR_FMT_NV12, height), 372211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel uv_stride = VENUS_UV_STRIDE(COLOR_FMT_NV12, width), 372311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel uv_scanlines = VENUS_UV_SCANLINES(COLOR_FMT_NV12, height), 372411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel src_chroma_offset = width * height; 372511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 372611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer->nAllocLen >= VENUS_BUFFER_SIZE(COLOR_FMT_NV12, width, height)) { 372711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8* src_buf = buffer->pBuffer, *dst_buf = buffer->pBuffer; 372811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //Do chroma first, so that we can convert it in-place 372911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel src_buf += width * height; 373011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dst_buf += y_stride * y_scanlines; 373111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (int line = height / 2 - 1; line >= 0; --line) { 373211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memmove(dst_buf + line * uv_stride, 373311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel src_buf + line * width, 373411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel width); 373511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 373611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 373711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dst_buf = src_buf = buffer->pBuffer; 373811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //Copy the Y next 373911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (int line = height - 1; line > 0; --line) { 374011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memmove(dst_buf + line * y_stride, 374111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel src_buf + line * width, 374211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel width); 374311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 374411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 374511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to align Chroma. from %u to %u : \ 374611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Insufficient bufferLen=%u v/s Required=%u", 374711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)(width*height), (unsigned int)src_chroma_offset, (unsigned int)buffer->nAllocLen, 374811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VENUS_BUFFER_SIZE(COLOR_FMT_NV12, width, height)); 374911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 375011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 375111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 375211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 375311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 375411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 375511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_get_performance_level(OMX_U32 *perflevel) 375611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 375711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!perflevel) { 375811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Null pointer error"); 375911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 376011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 376111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *perflevel = performance_level.perflevel; 376211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 376311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 376411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 376511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 376611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_get_vui_timing_info(OMX_U32 *enabled) 376711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 376811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!enabled) { 376911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Null pointer error"); 377011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 377111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 377211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *enabled = vui_timing_info.enabled; 377311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 377411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 377511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 377611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 377711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_get_vqzip_sei_info(OMX_U32 *enabled) 377811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 377911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!enabled) { 378011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Null pointer error"); 378111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 378211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 378311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *enabled = vqzip_sei_info.enabled; 378411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 378511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 378611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 378711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 378811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_get_peak_bitrate(OMX_U32 *peakbitrate) 378911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 379011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!peakbitrate) { 379111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Null pointer error"); 379211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 379311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 379411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *peakbitrate = peak_bitrate.peakbitrate; 379511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 379611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 379711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 379811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 379911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_get_batch_size(OMX_U32 *size) 380011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 380111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!size) { 380211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Null pointer error"); 380311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 380411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 380511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *size = mBatchSize; 380611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 380711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 380811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 380911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 381011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_empty_buf(void *buffer, void *pmem_data_buf, unsigned index, unsigned fd) 381111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 381211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct pmem *temp_buffer; 381311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_buffer buf; 381411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_requestbuffers bufreq; 381511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_plane plane[VIDEO_MAX_PLANES]; 381611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0, extra_idx; 381711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct OMX_BUFFERHEADERTYPE *bufhdr; 381811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel LEGACY_CAM_METADATA_TYPE * meta_buf = NULL; 381911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel temp_buffer = (struct pmem *)buffer; 382011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 382111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset (&buf, 0, sizeof(buf)); 382211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset (&plane, 0, sizeof(plane)); 382311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 382411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer == NULL) { 382511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: venc_etb: buffer is NULL"); 382611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 382711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 382811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 382911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufhdr = (OMX_BUFFERHEADERTYPE *)buffer; 383011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.memory = V4L2_MEMORY_USERPTR; 383111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count = m_sInput_buff_property.actualcount; 383211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 383311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 3834fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_LOW("Input buffer length %u, Timestamp = %lld", (unsigned int)bufhdr->nFilledLen, bufhdr->nTimeStamp); 383511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 383611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pmem_data_buf) { 383711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("\n Internal PMEM addr for i/p Heap UseBuf: %p", pmem_data_buf); 383811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].m.userptr = (unsigned long)pmem_data_buf; 383911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].data_offset = bufhdr->nOffset; 384011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].length = bufhdr->nAllocLen; 384111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].bytesused = bufhdr->nFilledLen; 384211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 384311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // -------------------------------------------------------------------------------------- 384411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // [Usage] [metadatamode] [Type] [color_format] [Where is buffer info] 384511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // --------------------------------------------------------------------------------------- 384611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Camera-2 1 CameraSource 0 meta-handle 384711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Camera-3 1 GrallocSource 0 gralloc-private-handle 384811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // surface encode (RBG) 1 GrallocSource 1 bufhdr (color-converted) 384911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // CPU (Eg: MediaCodec) 0 -- 0 bufhdr 385011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // --------------------------------------------------------------------------------------- 385111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (metadatamode) { 385211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].m.userptr = index; 385311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel meta_buf = (LEGACY_CAM_METADATA_TYPE *)bufhdr->pBuffer; 385411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 385511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!meta_buf) { 385611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //empty EOS buffer 385711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!bufhdr->nFilledLen && (bufhdr->nFlags & OMX_BUFFERFLAG_EOS)) { 385811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].data_offset = bufhdr->nOffset; 385911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].length = bufhdr->nAllocLen; 386011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].bytesused = bufhdr->nFilledLen; 386111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_empty_buf: empty EOS buffer"); 386211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 386311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 386411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 386511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!color_format) { 386611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 386711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (meta_buf->buffer_type == LEGACY_CAM_SOURCE) { 386811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel native_handle_t *hnd = (native_handle_t*)meta_buf->meta_handle; 386911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!hnd) { 387011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: venc_etb: handle is NULL"); 387111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 387211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 3873a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel int usage = 0; 3874a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel usage = MetaBufferUtil::getIntAt(hnd, 0, MetaBufferUtil::INT_USAGE); 3875a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel usage = usage > 0 ? usage : 0; 3876a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel 3877a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel if ((usage & private_handle_t::PRIV_FLAGS_ITU_R_601_FR) 3878a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel && (is_csc_enabled)) { 3879a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel buf.flags |= V4L2_MSM_BUF_FLAG_YUV_601_709_CLAMP; 3880a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel } 388111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 388211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!streaming[OUTPUT_PORT] && !(m_sVenc_cfg.inputformat == V4L2_PIX_FMT_RGB32 || 388311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.inputformat == V4L2_PIX_FMT_RGBA8888_UBWC)) { 3884a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel 3885fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel struct v4l2_format fmt; 388611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COLOR_FORMATTYPE color_format = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 3887fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 3888b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel color_format = (OMX_COLOR_FORMATTYPE)MetaBufferUtil::getIntAt(hnd, 0, MetaBufferUtil::INT_COLORFORMAT); 388911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 3890fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel memset(&fmt, 0, sizeof(fmt)); 3891fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (usage & private_handle_t::PRIV_FLAGS_ITU_R_709 || 3892fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel usage & private_handle_t::PRIV_FLAGS_ITU_R_601) { 3893fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Camera buffer color format is not 601_FR."); 3894fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR(" This leads to unknown color space"); 3895fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 3896fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (usage & private_handle_t::PRIV_FLAGS_ITU_R_601_FR) { 3897fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (is_csc_enabled) { 3898a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel struct v4l2_control control; 3899a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_VPE_CSC; 3900a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel control.value = V4L2_CID_MPEG_VIDC_VIDEO_VPE_CSC_ENABLE; 3901a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) { 3902a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel DEBUG_PRINT_ERROR("venc_empty_buf: Failed to set VPE CSC for 601_to_709"); 3903a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel } else { 3904a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel DEBUG_PRINT_INFO("venc_empty_buf: Will convert 601-FR to 709"); 3905a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel fmt.fmt.pix_mp.colorspace = V4L2_COLORSPACE_REC709; 3906a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel venc_set_colorspace(MSM_VIDC_BT709_5, 1, 3907a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel MSM_VIDC_TRANSFER_BT709_5, MSM_VIDC_MATRIX_BT_709_5); 3908a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel } 3909fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else { 3910fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel venc_set_colorspace(MSM_VIDC_BT601_6_525, 1, 3911fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel MSM_VIDC_TRANSFER_601_6_525, MSM_VIDC_MATRIX_601_6_525); 3912fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel fmt.fmt.pix_mp.colorspace = V4L2_COLORSPACE_470_SYSTEM_BG; 3913fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 3914fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 3915fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 3916fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_sVenc_cfg.inputformat = V4L2_PIX_FMT_NV12; 3917fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height; 3918fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width; 3919fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (usage & private_handle_t::PRIV_FLAGS_UBWC_ALIGNED) { 3920fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_sVenc_cfg.inputformat = V4L2_PIX_FMT_NV12_UBWC; 3921fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 3922fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 3923b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel if (color_format > 0 && !venc_set_color_format(color_format)) { 392411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed setting color format in Camerasource %lx", m_sVenc_cfg.inputformat); 392511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 392611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 392711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 392811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq)) { 392911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("VIDIOC_REQBUFS OUTPUT_MPLANE Failed"); 393011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 393111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 393211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 393311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 393411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Setting batch mode is sticky. We do not expect camera to change 393511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // between batch and normal modes at runtime. 393611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (mBatchSize) { 3937b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel if ((unsigned int)MetaBufferUtil::getBatchSize(hnd) != mBatchSize) { 393811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Don't support dynamic batch sizes (changed from %d->%d)", 3939b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel mBatchSize, MetaBufferUtil::getBatchSize(hnd)); 394011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 394111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 394211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 394311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return venc_empty_batch ((OMX_BUFFERHEADERTYPE*)buffer, index); 394411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 394511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 3946b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel int offset = MetaBufferUtil::getIntAt(hnd, 0, MetaBufferUtil::INT_OFFSET); 3947b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel int length = MetaBufferUtil::getIntAt(hnd, 0, MetaBufferUtil::INT_SIZE); 3948b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel if (offset < 0 || length < 0) { 3949b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel DEBUG_PRINT_ERROR("Invalid meta buffer handle!"); 3950b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel return false; 395111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 3952b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel plane[0].data_offset = offset; 3953b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel plane[0].length = length; 3954b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel plane[0].bytesused = length; 395511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_empty_buf: camera buf: fd = %d filled %d of %d flag 0x%x format 0x%lx", 395611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd, plane[0].bytesused, plane[0].length, buf.flags, m_sVenc_cfg.inputformat); 395711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (meta_buf->buffer_type == kMetadataBufferTypeGrallocSource) { 395811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VideoGrallocMetadata *meta_buf = (VideoGrallocMetadata *)bufhdr->pBuffer; 395911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel private_handle_t *handle = (private_handle_t *)meta_buf->pHandle; 3960fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 3961fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (!handle) { 3962fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("%s : handle is null!", __FUNCTION__); 3963fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return false; 3964fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 3965fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 396611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!streaming[OUTPUT_PORT]) { 3967fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel int color_space = 0; 3968fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // Moment of truth... actual colorspace is known here.. 3969fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel ColorSpace_t colorSpace = ITU_R_601; 3970fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (getMetaData(handle, GET_COLOR_SPACE, &colorSpace) == 0) { 3971fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_INFO("ENC_CONFIG: gralloc ColorSpace = %d (601=%d 601_FR=%d 709=%d)", 3972fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel colorSpace, ITU_R_601, ITU_R_601_FR, ITU_R_709); 3973fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 3974fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 397511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 397611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&fmt, 0, sizeof(fmt)); 397711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 3978fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 3979fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel bool isUBWC = (handle->flags & private_handle_t::PRIV_FLAGS_UBWC_ALIGNED) && is_gralloc_source_ubwc; 398011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (handle->format == HAL_PIXEL_FORMAT_NV12_ENCODEABLE) { 3981fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_sVenc_cfg.inputformat = isUBWC ? V4L2_PIX_FMT_NV12_UBWC : V4L2_PIX_FMT_NV12; 3982fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_INFO("ENC_CONFIG: Input Color = NV12 %s", isUBWC ? "UBWC" : "Linear"); 398311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (handle->format == HAL_PIXEL_FORMAT_RGBA_8888) { 3984fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // In case of RGB, conversion to YUV is handled within encoder. 3985fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // Disregard the Colorspace in gralloc-handle in case of RGB and use 3986fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // [a] 601 for non-UBWC case : C2D output is (apparently) 601-LR 3987fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // [b] 601 for UBWC case : Venus can convert to 601-LR or FR. use LR for now. 3988fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel colorSpace = ITU_R_601; 3989fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_sVenc_cfg.inputformat = isUBWC ? V4L2_PIX_FMT_RGBA8888_UBWC : V4L2_PIX_FMT_RGB32; 3990fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_INFO("ENC_CONFIG: Input Color = RGBA8888 %s", isUBWC ? "UBWC" : "Linear"); 3991fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else if (handle->format == QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m) { 3992fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_sVenc_cfg.inputformat = V4L2_PIX_FMT_NV12; 3993fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_INFO("ENC_CONFIG: Input Color = NV12 Linear"); 3994fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 3995fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 3996fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // If device recommendation (persist.vidc.enc.csc.enable) is to use 709, force CSC 3997fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (colorSpace == ITU_R_601_FR && is_csc_enabled) { 3998fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel struct v4l2_control control; 3999fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_VPE_CSC; 4000fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.value = V4L2_CID_MPEG_VIDC_VIDEO_VPE_CSC_ENABLE; 4001fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) { 4002fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("venc_empty_buf: Failed to set VPE CSC for 601_to_709"); 400311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 4004fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_INFO("venc_empty_buf: Will convert 601-FR to 709"); 4005fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel buf.flags = V4L2_MSM_BUF_FLAG_YUV_601_709_CLAMP; 4006fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel colorSpace = ITU_R_709; 400711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 400811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 4009fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4010fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel msm_vidc_h264_color_primaries_values primary; 4011fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel msm_vidc_h264_transfer_chars_values transfer; 4012fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel msm_vidc_h264_matrix_coeff_values matrix; 4013fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel OMX_U32 range; 4014fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4015fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel switch (colorSpace) { 4016fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case ITU_R_601_FR: 4017fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel { 4018fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel primary = MSM_VIDC_BT601_6_525; 4019fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel range = 1; // full 4020fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel transfer = MSM_VIDC_TRANSFER_601_6_525; 4021fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel matrix = MSM_VIDC_MATRIX_601_6_525; 4022fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4023fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel fmt.fmt.pix_mp.colorspace = V4L2_COLORSPACE_470_SYSTEM_BG; 4024fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 4025fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 4026fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case ITU_R_709: 4027fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel { 4028fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel primary = MSM_VIDC_BT709_5; 4029fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel range = 0; // limited 4030fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel transfer = MSM_VIDC_TRANSFER_BT709_5; 4031fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel matrix = MSM_VIDC_MATRIX_BT_709_5; 4032fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4033fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel fmt.fmt.pix_mp.colorspace = V4L2_COLORSPACE_REC709; 4034fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 4035fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 4036fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel default: 4037fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel { 4038fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // 601 or something else ? assume 601 4039fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel primary = MSM_VIDC_BT601_6_625; 4040fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel range = 0; //limited 4041fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel transfer = MSM_VIDC_TRANSFER_601_6_625; 4042fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel matrix = MSM_VIDC_MATRIX_601_6_625; 4043fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4044fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel fmt.fmt.pix_mp.colorspace = V4L2_COLORSPACE_470_SYSTEM_BG; 4045fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 4046fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 4047fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 4048fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_INFO("ENC_CONFIG: selected ColorSpace = %d (601=%d 601_FR=%d 709=%d)", 4049fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel colorSpace, ITU_R_601, ITU_R_601_FR, ITU_R_709); 4050fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel venc_set_colorspace(primary, range, transfer, matrix); 4051fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 405211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.inputformat; 405311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height; 405411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width; 405511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt)) { 405611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed setting color format in Grallocsource %lx", m_sVenc_cfg.inputformat); 405711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 405811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 405911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq)) { 406011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("VIDIOC_REQBUFS OUTPUT_MPLANE Failed"); 406111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 406211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 406311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 406411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 406511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd = handle->fd; 406611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].data_offset = 0; 406711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].length = handle->size; 406811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].bytesused = handle->size; 406911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_empty_buf: Opaque camera buf: fd = %d " 407011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ": filled %d of %d format 0x%lx", fd, plane[0].bytesused, plane[0].length, m_sVenc_cfg.inputformat); 407111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 407211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 407311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].m.userptr = (unsigned long) bufhdr->pBuffer; 407411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].data_offset = bufhdr->nOffset; 407511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].length = bufhdr->nAllocLen; 407611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].bytesused = bufhdr->nFilledLen; 407711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_empty_buf: Opaque non-camera buf: fd = %d filled %d of %d", 407811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd, plane[0].bytesused, plane[0].length); 407911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 408011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 408111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].m.userptr = (unsigned long) bufhdr->pBuffer; 408211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].data_offset = bufhdr->nOffset; 408311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].length = bufhdr->nAllocLen; 408411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].bytesused = bufhdr->nFilledLen; 408511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_empty_buf: non-camera buf: fd = %d filled %d of %d", 408611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fd, plane[0].bytesused, plane[0].length); 408711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 408811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 408911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 409011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra_idx = EXTRADATA_IDX(num_input_planes); 409111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 409211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 40932601808ee2992a94c325d05e4065aba60b01840bThierry Strudel int extradata_index = venc_get_index_from_fd(input_extradata_info.m_ion_dev,fd); 409411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (extradata_index < 0 ) { 409511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Extradata index calculation went wrong for fd = %d", fd); 409611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorBadParameter; 409711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 409811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 409911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].bytesused = 0; 410011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].length = input_extradata_info.buffer_size; 410111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].m.userptr = (unsigned long) (input_extradata_info.uaddr + extradata_index * input_extradata_info.buffer_size); 410211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 410311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].reserved[0] = input_extradata_info.ion.fd_ion_data.fd; 410411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 410511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].reserved[1] = input_extradata_info.buffer_size * extradata_index; 4106fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel plane[extra_idx].reserved[2] = input_extradata_info.size; 410711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].data_offset = 0; 410811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extra_idx >= VIDEO_MAX_PLANES) { 410911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Extradata index higher than expected: %d\n", extra_idx); 411011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 411111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 411211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 4113fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#ifdef _PQ_ 4114b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel if (!streaming[OUTPUT_PORT]) { 4115fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_pq.is_YUV_format_uncertain = false; 4116b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel if(venc_check_for_pq()) { 4117b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel /* 4118b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel * This is the place where all parameters for deciding 4119b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel * PQ enablement are available. Evaluate PQ for the final time. 4120b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel */ 4121b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel m_pq.reinit(m_sVenc_cfg.inputformat); 4122b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel venc_configure_pq(); 4123b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } 4124fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 4125fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#endif // _PQ_ 4126fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 412711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.index = index; 412811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 412911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.memory = V4L2_MEMORY_USERPTR; 413011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].reserved[0] = fd; 413111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].reserved[1] = 0; 413211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.m.planes = plane; 413311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.length = num_input_planes; 4134a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel buf.timestamp.tv_sec = bufhdr->nTimeStamp / 1000000; 4135a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel buf.timestamp.tv_usec = (bufhdr->nTimeStamp % 1000000); 413611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 4137a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel if (!handle_input_extradata(buf)) { 4138a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel DEBUG_PRINT_ERROR("%s Failed to handle input extradata", __func__); 4139a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel return false; 4140a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel } 4141b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("ETB-TS", bufhdr->nTimeStamp / 1000); 4142b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel 414311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bufhdr->nFlags & OMX_BUFFERFLAG_EOS) 414411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.flags |= V4L2_QCOM_BUF_FLAG_EOS; 414511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 4146fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (m_debug.in_buffer_log) { 4147fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel venc_input_log_buffers(bufhdr, fd, plane[0].data_offset, m_sVenc_cfg.inputformat); 4148fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 4149fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (m_debug.extradata_log && extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 4150fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Extradata Addr 0x%llx, Buffer Addr = 0x%x", (OMX_U64)input_extradata_info.uaddr, (unsigned int)plane[extra_idx].m.userptr); 4151fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel venc_extradata_log_buffers((char *)plane[extra_idx].m.userptr); 4152fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 415311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_QBUF, &buf); 415411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 415511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 415611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to qbuf (etb) to driver"); 415711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 415811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 415911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 416011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel etb++; 416111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 416211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!streaming[OUTPUT_PORT]) { 416311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enum v4l2_buf_type buf_type; 416411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 416511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ret; 4166fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 416711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(m_nDriver_fd, VIDIOC_STREAMON, &buf_type); 416811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 416911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 417011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to call streamon"); 417111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (errno == EBUSY) { 417211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel hw_overload = true; 417311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 417411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 417511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 417611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel streaming[OUTPUT_PORT] = true; 417711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 417811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 417911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 418011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 418111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 418211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 418311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_empty_batch(OMX_BUFFERHEADERTYPE *bufhdr, unsigned index) 418411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 418511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_buffer buf; 4186fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel struct v4l2_plane plane[VIDEO_MAX_PLANES]; 4187fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel int rc = 0, extra_idx, numBufs; 418811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 418911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel LEGACY_CAM_METADATA_TYPE * meta_buf = NULL; 419011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel native_handle_t *hnd = NULL; 419111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 419211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bufhdr == NULL) { 419311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s: buffer is NULL", __func__); 419411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 419511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 419611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 419711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool status = true; 419811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (metadatamode) { 4199fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel plane[0].m.userptr = index; 420011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel meta_buf = (LEGACY_CAM_METADATA_TYPE *)bufhdr->pBuffer; 420111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 420211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!color_format) { 420311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (meta_buf->buffer_type == LEGACY_CAM_SOURCE) { 420411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel hnd = (native_handle_t*)meta_buf->meta_handle; 420511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!hnd) { 420611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("venc_empty_batch: invalid handle !"); 420711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 4208b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } else if (MetaBufferUtil::getBatchSize(hnd) > kMaxBuffersInBatch) { 420911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("venc_empty_batch: Too many buffers (%d) in batch. " 4210b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel "Max = %d", MetaBufferUtil::getBatchSize(hnd), kMaxBuffersInBatch); 421111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 421211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 4213b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel DEBUG_PRINT_LOW("venc_empty_batch: Batch of %d bufs", MetaBufferUtil::getBatchSize(hnd)); 421411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 421511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Batch supported for CameraSource buffers only !"); 421611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 421711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 421811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 421911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Batch supported for Camera buffers only !"); 422011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 422111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 422211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 422311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Batch supported for metabuffer mode only !"); 422411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 422511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 422611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 422711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (status) { 422811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_TICKS bufTimeStamp = 0ll; 4229b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel int numBufs = MetaBufferUtil::getBatchSize(hnd); 423011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int v4l2Ids[kMaxBuffersInBatch] = {-1}; 423111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (int i = 0; i < numBufs; ++i) { 423211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel v4l2Ids[i] = mBatchInfo.registerBuffer(index); 423311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2Ids[i] < 0) { 423411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to register buffer"); 423511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // TODO: cleanup the map and purge all slots of current index 423611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 423711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 423811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 423911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 424011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (int i = 0; i < numBufs; ++i) { 424111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int v4l2Id = v4l2Ids[i]; 4242a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel int usage = 0; 424311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 424411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&buf, 0, sizeof(buf)); 424511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&plane, 0, sizeof(plane)); 424611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 424711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Batch: registering %d as %d", index, v4l2Id); 424811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.index = (unsigned)v4l2Id; 424911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 425011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.memory = V4L2_MEMORY_USERPTR; 4251b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel plane[0].reserved[0] = MetaBufferUtil::getFdAt(hnd, i); 4252fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel plane[0].reserved[1] = 0; 4253b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel plane[0].data_offset = MetaBufferUtil::getIntAt(hnd, i, MetaBufferUtil::INT_OFFSET); 4254fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel plane[0].m.userptr = (unsigned long)meta_buf; 4255b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel plane[0].length = plane[0].bytesused = MetaBufferUtil::getIntAt(hnd, i, MetaBufferUtil::INT_SIZE); 4256fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel buf.m.planes = plane; 4257fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel buf.length = num_input_planes; 4258fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4259a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel usage = MetaBufferUtil::getIntAt(hnd, i, MetaBufferUtil::INT_USAGE); 4260a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel usage = usage > 0 ? usage : 0; 4261a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel 4262a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel if ((usage & private_handle_t::PRIV_FLAGS_ITU_R_601_FR) 4263a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel && (is_csc_enabled)) { 4264a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel buf.flags |= V4L2_MSM_BUF_FLAG_YUV_601_709_CLAMP; 4265a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel } 4266a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel 4267fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel extra_idx = EXTRADATA_IDX(num_input_planes); 4268fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4269fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 4270fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel int fd = plane[0].reserved[0]; 4271fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel int extradata_index = venc_get_index_from_fd(input_extradata_info.m_ion_dev, fd); 4272fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (extradata_index < 0) { 4273fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Extradata index calculation went wrong for fd = %d", fd); 4274fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return OMX_ErrorBadParameter; 4275fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 4276fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4277fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel plane[extra_idx].bytesused = 0; 4278fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel plane[extra_idx].length = input_extradata_info.buffer_size; 4279fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel plane[extra_idx].m.userptr = (unsigned long) (input_extradata_info.uaddr + extradata_index * input_extradata_info.buffer_size); 4280fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel plane[extra_idx].reserved[0] = input_extradata_info.ion.fd_ion_data.fd; 4281fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel plane[extra_idx].reserved[1] = input_extradata_info.buffer_size * extradata_index; 4282fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel plane[extra_idx].reserved[2] = input_extradata_info.size; 4283fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel plane[extra_idx].data_offset = 0; 4284fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else if (extra_idx >= VIDEO_MAX_PLANES) { 4285fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Extradata index higher than expected: %d\n", extra_idx); 4286fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return false; 4287fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 4288fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4289fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#ifdef _PQ_ 4290b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel if (!streaming[OUTPUT_PORT]) { 4291fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_pq.is_YUV_format_uncertain = false; 4292b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel if(venc_check_for_pq()) { 4293b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel m_pq.reinit(m_sVenc_cfg.inputformat); 4294b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel venc_configure_pq(); 4295b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } 4296fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 4297fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#endif // _PQ_ 4298fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 429911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_PREPARE_BUF, &buf); 430011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) 430111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("VIDIOC_PREPARE_BUF Failed"); 430211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 430311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bufhdr->nFlags & OMX_BUFFERFLAG_EOS) 430411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.flags |= V4L2_QCOM_BUF_FLAG_EOS; 430511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (i != numBufs - 1) { 430611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.flags |= V4L2_MSM_BUF_FLAG_DEFER; 430711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("for buffer %d (etb #%d) in batch of %d, marking as defer", 430811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel i, etb + 1, numBufs); 430911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 431011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 431111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // timestamp differences from camera are in nano-seconds 4312b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel bufTimeStamp = bufhdr->nTimeStamp + MetaBufferUtil::getIntAt(hnd, i, MetaBufferUtil::INT_TIMESTAMP) / 1000; 431311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 431411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Q Batch [%d of %d] : buf=%p fd=%d len=%d TS=%lld", 4315fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel i, numBufs, bufhdr, plane[0].reserved[0], plane[0].length, bufTimeStamp); 431611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.timestamp.tv_sec = bufTimeStamp / 1000000; 431711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.timestamp.tv_usec = (bufTimeStamp % 1000000); 431811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 43192e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel if (!handle_input_extradata(buf)) { 43202e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel DEBUG_PRINT_ERROR("%s Failed to handle input extradata", __func__); 43212e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel return false; 43222e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel } 4323b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel VIDC_TRACE_INT_LOW("ETB-TS", bufTimeStamp / 1000); 4324b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel 432511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_QBUF, &buf); 432611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 432711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("%s: Failed to qbuf (etb) to driver", __func__); 432811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 432911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 433011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 433111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel etb++; 433211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 433311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 433411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 433511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (status && !streaming[OUTPUT_PORT]) { 433611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enum v4l2_buf_type buf_type; 433711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 433811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ret; 433911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(m_nDriver_fd, VIDIOC_STREAMON, &buf_type); 434011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 434111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to call streamon"); 434211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (errno == EBUSY) { 434311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel hw_overload = true; 434411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 434511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 434611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 434711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel streaming[OUTPUT_PORT] = true; 434811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 434911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 435011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 435111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return status; 435211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 435311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 435411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_fill_buf(void *buffer, void *pmem_data_buf,unsigned index,unsigned fd) 435511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 435611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct pmem *temp_buffer = NULL; 435711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct venc_buffer frameinfo; 435811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_buffer buf; 435911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_plane plane[VIDEO_MAX_PLANES]; 436011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 436111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int extra_idx; 436211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct OMX_BUFFERHEADERTYPE *bufhdr; 436311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 436411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (buffer == NULL) 436511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 436611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 436711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufhdr = (OMX_BUFFERHEADERTYPE *)buffer; 436811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 436911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (pmem_data_buf) { 437011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Internal PMEM addr for o/p Heap UseBuf: %p", pmem_data_buf); 437111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].m.userptr = (unsigned long)pmem_data_buf; 437211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 437311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Shared PMEM addr for o/p PMEM UseBuf/AllocateBuf: %p", bufhdr->pBuffer); 437411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].m.userptr = (unsigned long)bufhdr->pBuffer; 437511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 437611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 437711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&buf, 0, sizeof(buf)); 437811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&plane, 0, sizeof(plane)); 437911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 438011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.index = index; 438111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 438211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.memory = V4L2_MEMORY_USERPTR; 438311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].length = bufhdr->nAllocLen; 438411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].bytesused = bufhdr->nFilledLen; 438511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].reserved[0] = fd; 438611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].reserved[1] = 0; 438711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[0].data_offset = bufhdr->nOffset; 438811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.m.planes = plane; 438911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.length = num_output_planes; 439011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.flags = 0; 439111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 43922601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (venc_handle->is_secure_session()) { 4393a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel if (venc_handle->allocate_native_handle) { 4394a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel native_handle_t *handle_t = (native_handle_t *)(bufhdr->pBuffer); 4395a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel plane[0].length = handle_t->data[3]; 4396a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel } else { 4397a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel output_metabuffer *meta_buf = (output_metabuffer *)(bufhdr->pBuffer); 4398a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel native_handle_t *handle_t = meta_buf->nh; 4399a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel plane[0].length = handle_t->data[3]; 4400a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel } 44012601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 44022601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 440311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (mBatchSize) { 440411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Should always mark first buffer as DEFER, since 0 % anything is 0, just offset by 1 440511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // This results in the first batch being of size mBatchSize + 1, but thats good because 440611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // we need an extra FTB for the codec specific data. 440711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 440811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!ftb || ftb % mBatchSize) { 440911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel buf.flags |= V4L2_MSM_BUF_FLAG_DEFER; 441011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("for ftb buffer %d marking as defer", ftb + 1); 441111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 441211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 441311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 441411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel extra_idx = EXTRADATA_IDX(num_output_planes); 441511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 441611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) { 441711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].bytesused = 0; 441811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].length = output_extradata_info.buffer_size; 441911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].m.userptr = (unsigned long) (output_extradata_info.uaddr + index * output_extradata_info.buffer_size); 442011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION 442111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].reserved[0] = output_extradata_info.ion.fd_ion_data.fd; 442211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 442311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].reserved[1] = output_extradata_info.buffer_size * index; 442411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel plane[extra_idx].data_offset = 0; 442511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (extra_idx >= VIDEO_MAX_PLANES) { 442611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Extradata index higher than expected: %d", extra_idx); 442711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 442811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 442911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 443011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_QBUF, &buf); 443111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 443211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 443311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to qbuf (ftb) to driver"); 443411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 443511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 443611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 443711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ftb++; 443811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 443911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 444011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 444111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_inband_video_header(OMX_BOOL enable) 444211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 444311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 444411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 444511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDEO_HEADER_MODE; 444611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(enable) { 444711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_I_FRAME; 444811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 444911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE; 445011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 445111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 445211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Set inband sps/pps: %d", enable); 445311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control) < 0) { 445411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Request for inband sps/pps failed"); 445511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 445611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 445711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 445811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 445911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 446011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_au_delimiter(OMX_BOOL enable) 446111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 446211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 446311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 446411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_H264_AU_DELIMITER; 446511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(enable) { 446611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_VIDEO_H264_AU_DELIMITER_ENABLED; 446711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 446811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_VIDEO_H264_AU_DELIMITER_DISABLED; 446911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 447011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 447111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Set au delimiter: %d", enable); 447211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control) < 0) { 447311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Request to set AU delimiter failed"); 447411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 447511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 447611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 447711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 447811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 447911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_mbi_statistics_mode(OMX_U32 mode) 448011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 448111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 448211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 448311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_MBI_STATISTICS_MODE; 448411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = mode; 448511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 448611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Set MBI dumping mode: %d", mode); 448711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control) < 0) { 448811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Setting MBI mode failed"); 448911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 449011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 449111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 449211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 449311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 44942601808ee2992a94c325d05e4065aba60b01840bThierry Strudelint venc_dev::venc_get_index_from_fd(OMX_U32 ion_fd, OMX_U32 buffer_fd) 449511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 44962601808ee2992a94c325d05e4065aba60b01840bThierry Strudel unsigned int cookie = buffer_fd; 44972601808ee2992a94c325d05e4065aba60b01840bThierry Strudel struct ion_fd_data fdData; 44982601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 44992601808ee2992a94c325d05e4065aba60b01840bThierry Strudel memset(&fdData, 0, sizeof(fdData)); 45002601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fdData.fd = buffer_fd; 45012601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (ion_fd && !ioctl(ion_fd, ION_IOC_IMPORT, &fdData)) { 45022601808ee2992a94c325d05e4065aba60b01840bThierry Strudel cookie = fdData.handle; 450342adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel DEBUG_PRINT_HIGH("FD = %u imported handle = %u", fdData.fd, fdData.handle); 45042601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 45052601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 4506fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel for (unsigned int i = 0; i < (sizeof(fd_list)/sizeof(fd_list[0])); i++) { 45072601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (fd_list[i] == cookie) { 450811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("FD is present at index = %d", i); 450942adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel if (ion_fd && !ioctl(ion_fd, ION_IOC_FREE, &fdData.handle)) { 451042adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel DEBUG_PRINT_HIGH("freed handle = %u", cookie); 451142adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel } 451211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return i; 451311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 451411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 451542adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel 4516fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel for (unsigned int i = 0; i < (sizeof(fd_list)/sizeof(fd_list[0])); i++) 451711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (fd_list[i] == 0) { 451811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("FD added at index = %d", i); 45192601808ee2992a94c325d05e4065aba60b01840bThierry Strudel fd_list[i] = cookie; 452011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return i; 45212601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 452211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return -EINVAL; 452311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 452411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 452511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_vqzip_sei_type(OMX_BOOL enable) 452611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 4527a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel struct v4l2_control sei_control = {0,0}, yuvstats_control = {0,0}; 452811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 452911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Set VQZIP SEI: %d", enable); 453011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sei_control.id = V4L2_CID_MPEG_VIDC_VIDEO_VQZIP_SEI; 453111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel yuvstats_control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 453211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 453311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(enable) { 453411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sei_control.value = V4L2_CID_MPEG_VIDC_VIDEO_VQZIP_SEI_ENABLE; 4535a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel yuvstats_control.value = V4L2_MPEG_VIDC_EXTRADATA_YUV_STATS; 453611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 453711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sei_control.value = V4L2_CID_MPEG_VIDC_VIDEO_VQZIP_SEI_DISABLE; 453811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 453911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 454011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &sei_control) < 0) { 454111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Non-Fatal: Request to set SEI failed"); 454211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 454311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 454411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &yuvstats_control) < 0) { 454511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Non-Fatal: Request to set YUVSTATS failed"); 454611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 454711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _VQZIP_ 45482e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel vqzip.pConfig.nWidth = m_sVenc_cfg.input_width; 45492e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel vqzip.pConfig.nHeight = m_sVenc_cfg.input_height; 455011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vqzip.init(); 455111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vqzip_sei_info.enabled = true; 455211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 455311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 455411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 455511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 455611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 455711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_validate_hybridhp_params(OMX_U32 layers, OMX_U32 bFrames, OMX_U32 count, int mode) 455811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 455911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Check for layers in Hier-p/hier-B with Hier-P-Hybrid 456011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (layers && (mode == HIER_P || mode == HIER_B) && hier_layers.hier_mode == HIER_P_HYBRID) 456111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 456211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 456311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Check for bframes with Hier-P-Hybrid 456411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bFrames && hier_layers.hier_mode == HIER_P_HYBRID) 456511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 456611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 456711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Check for Hier-P-Hybrid with bframes/LTR/hier-p/Hier-B 456811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (layers && mode == HIER_P_HYBRID && (intra_period.num_bframes || hier_layers.hier_mode == HIER_P || 456911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel hier_layers.hier_mode == HIER_B || ltrinfo.count)) 457011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 457111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 457211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Check for LTR with Hier-P-Hybrid 457311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (count && hier_layers.hier_mode == HIER_P_HYBRID) 457411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 457511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 457611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 457711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 457811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 457911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_hier_layers(QOMX_VIDEO_HIERARCHICALCODINGTYPE type, 458011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 num_layers) 458111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 458211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 458311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 458411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_validate_hybridhp_params(num_layers, 0, 0, (int)type)){ 458511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid settings, Hier-pLayers enabled with HybridHP"); 458611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 458711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 458811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 458911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (type == QOMX_HIERARCHICALCODING_P) { 459011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Reduce layer count by 1 before sending to driver. This avoids 459111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // driver doing the same in multiple places. 459211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_MAX_HIERP_LAYERS; 459311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = num_layers - 1; 459411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Set MAX Hier P num layers: %u", (unsigned int)num_layers); 459511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) { 459611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Request to set MAX Hier P num layers failed"); 459711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 459811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 459911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_HIER_P_NUM_LAYERS; 460011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = num_layers - 1; 460111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Set Hier P num layers: %u", (unsigned int)num_layers); 460211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) { 460311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Request to set Hier P num layers failed"); 460411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 460511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 460611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) { 460711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Set H264_SVC_NAL"); 460811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_H264_NAL_SVC; 460911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_CID_MPEG_VIDC_VIDEO_H264_NAL_SVC_ENABLED; 461011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) { 461111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to enable SVC_NAL"); 461211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 461311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 461411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 461511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel hier_layers.hier_mode = HIER_P; 461611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (type == QOMX_HIERARCHICALCODING_B) { 461711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_sVenc_cfg.codectype != V4L2_PIX_FMT_HEVC) { 461811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed : Hier B layers supported only for HEVC encode"); 461911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 462011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 462111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_HIER_B_NUM_LAYERS; 462211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = num_layers - 1; 462311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_INFO("Set Hier B num layers: %u", (unsigned int)num_layers); 462411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) { 462511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Request to set Hier P num layers failed"); 462611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 462711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 462811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel hier_layers.hier_mode = HIER_B; 462911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 463011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Request to set hier num layers failed for type: %d", type); 463111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 463211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 463311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel hier_layers.numlayers = num_layers; 463411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 463511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 463611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 463711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_extradata(OMX_U32 extra_data, OMX_BOOL enable) 463811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 463911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 464011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 464111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("venc_set_extradata:: %x", (int) extra_data); 464211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 464311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (enable == OMX_FALSE) { 464411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* No easy way to turn off extradata to the driver 464511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * at the moment */ 464611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 464711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 464811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 464911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA; 465011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (extra_data) { 465111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_ExtraDataVideoEncoderSliceInfo: 465211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_MULTISLICE_INFO; 465311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 465411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_ExtraDataVideoEncoderMBInfo: 465511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_METADATA_MBI; 465611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 465711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_ExtraDataFrameDimension: 465811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_INPUT_CROP; 465911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 4660fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case OMX_ExtraDataEncoderOverrideQPInfo: 4661fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_PQ_INFO; 4662fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 46632e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel case OMX_ExtraDataVideoLTRInfo: 46642e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel control.value = V4L2_MPEG_VIDC_EXTRADATA_LTR; 46652e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel break; 466611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 466711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Unrecognized extradata index 0x%x", (unsigned int)extra_data); 466811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 466911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 467011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 467111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) { 467211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Request for setting extradata (%x) failed %d", 467311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)extra_data, errno); 467411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 467511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 467611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 467711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 467811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 467911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 468011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_slice_delivery_mode(OMX_U32 enable) 468111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 468211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 468311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 468411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (enable) { 468511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_DELIVERY_MODE; 468611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = 1; 468711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Set slice_delivery_mode: %d", control.value); 468811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 468911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (multislice.mslice_mode == V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_MB && m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) { 469011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) { 469111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Request for setting slice delivery mode failed"); 469211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 469311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 469411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Successfully set Slice delivery mode id: %d, value=%d", control.id, control.value); 469511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel slice_mode.enable = 1; 469611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 469711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 469811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set slice delivery mode, slice_mode [%lu] " 469911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "is not MB BASED or [%lu] is not H264 codec ", multislice.mslice_mode, 470011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.codectype); 470111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 470211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 470311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Slice_DELIVERY_MODE not enabled"); 470411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 470511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 470611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 470711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 470811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 470911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_enable_initial_qp(QOMX_EXTNINDEX_VIDEO_INITIALQP* initqp) 471011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 471111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc; 471211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 471311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_ext_control ctrl[4]; 471411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_ext_controls controls; 471511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 471611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[0].id = V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP; 471711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[0].value = initqp->nQpI; 471811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[1].id = V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP; 471911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[1].value = initqp->nQpP; 472011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[2].id = V4L2_CID_MPEG_VIDC_VIDEO_B_FRAME_QP; 472111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[2].value = initqp->nQpB; 472211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[3].id = V4L2_CID_MPEG_VIDC_VIDEO_ENABLE_INITIAL_QP; 472311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[3].value = initqp->bEnableInitQp; 472411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 472511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.count = 4; 472611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.ctrl_class = V4L2_CTRL_CLASS_MPEG; 472711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.controls = ctrl; 472811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 472911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set control for id=%x val=%d, id=%x val=%d, id=%x val=%d, id=%x val=%d", 473011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.controls[0].id, controls.controls[0].value, 473111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.controls[1].id, controls.controls[1].value, 473211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.controls[2].id, controls.controls[2].value, 473311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.controls[3].id, controls.controls[3].value); 473411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 473511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_EXT_CTRLS, &controls); 473611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 473711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set session_qp %d", rc); 473811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 473911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 474011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 474111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel init_qp.iframeqp = initqp->nQpI; 474211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel init_qp.pframeqp = initqp->nQpP; 474311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel init_qp.bframeqp = initqp->nQpB; 474411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel init_qp.enableinitqp = initqp->bEnableInitQp; 474511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 474611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%x val=%d, id=%x val=%d, id=%x val=%d, id=%x val=%d", 474711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.controls[0].id, controls.controls[0].value, 474811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.controls[1].id, controls.controls[1].value, 474911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.controls[2].id, controls.controls[2].value, 475011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.controls[3].id, controls.controls[3].value); 475111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 475211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 475311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 4754fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelbool venc_dev::venc_set_colorspace(OMX_U32 primaries, OMX_U32 range, 4755fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel OMX_U32 transfer_chars, OMX_U32 matrix_coeffs) 4756fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel{ 4757fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel int rc; 4758fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel struct v4l2_control control; 4759fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4760fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_LOW("Setting color space : Primaries = %d, Range = %d, Trans = %d, Matrix = %d", 4761fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel primaries, range, transfer_chars, matrix_coeffs); 4762fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4763fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_COLOR_SPACE; 4764fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.value = primaries; 4765fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4766fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value); 4767fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 4768fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4769fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (rc) { 4770fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Failed to set control : V4L2_CID_MPEG_VIDC_VIDEO_COLOR_SPACE"); 4771fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return false; 4772fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 4773fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4774fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value); 4775fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4776fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel color_space.primaries = control.value; 4777fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4778fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_FULL_RANGE; 4779fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.value = range; 4780fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4781fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value); 4782fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 4783fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4784fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (rc) { 4785fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Failed to set control : V4L2_CID_MPEG_VIDC_VIDEO_FULL_RANGE"); 4786fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return false; 4787fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 4788fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4789fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value); 4790fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4791fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel color_space.range = control.value; 4792fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4793fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_TRANSFER_CHARS; 4794fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.value = transfer_chars; 4795fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4796fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value); 4797fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 4798fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4799fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (rc) { 4800fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Failed to set control : V4L2_CID_MPEG_VIDC_VIDEO_TRANSFER_CHARS"); 4801fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return false; 4802fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 4803fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4804fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value); 4805fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4806fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel color_space.transfer_chars = control.value; 4807fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4808fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_MATRIX_COEFFS; 4809fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.value = matrix_coeffs; 4810fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4811fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value); 4812fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 4813fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4814fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (rc) { 4815fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Failed to set control : V4L2_CID_MPEG_VIDC_VIDEO_MATRIX_COEFFS"); 4816fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return false; 4817fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 4818fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4819fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value); 4820fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4821fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel color_space.matrix_coeffs = control.value; 4822fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 4823fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return true; 4824fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel} 4825fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 482611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_session_qp(OMX_U32 i_frame_qp, OMX_U32 p_frame_qp,OMX_U32 b_frame_qp) 482711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 482811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc; 482911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 483011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 483111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP; 483211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = i_frame_qp; 483311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 483411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value); 483511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 483611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 483711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 483811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set control"); 483911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 484011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 484111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 484211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value); 484311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel session_qp.iframeqp = control.value; 484411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 484511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP; 484611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = p_frame_qp; 484711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 484811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value); 484911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 485011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 485111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 485211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set control"); 485311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 485411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 485511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 485611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value); 485711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 485811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel session_qp.pframeqp = control.value; 485911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 486011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((codec_profile.profile == V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) || 486111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (codec_profile.profile == V4L2_MPEG_VIDEO_H264_PROFILE_HIGH)) { 486211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 486311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP; 486411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = b_frame_qp; 486511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 486611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value); 486711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 486811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 486911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 487011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set control"); 487111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 487211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 487311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 487411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value); 487511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 487611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel session_qp.bframeqp = control.value; 487711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 487811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 487911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 488011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 488111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 488211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_session_qp_range(OMX_U32 min_qp, OMX_U32 max_qp) 488311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 488411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc; 488511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 488611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 488711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((min_qp >= session_qp_range.minqp) && (max_qp <= session_qp_range.maxqp)) { 488811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 488911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8) 489011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_VP8_MIN_QP; 489111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 489211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDEO_H264_MIN_QP; 489311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = min_qp; 489411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 489511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set MIN_QP control id=%d, val=%d", 489611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id, control.value); 489711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 489811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 489911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set control"); 490011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 490111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 490211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 490311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8) 490411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_VP8_MAX_QP; 490511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 490611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDEO_H264_MAX_QP; 490711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = max_qp; 490811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 490911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set MAX_QP control id=%d, val=%d", 491011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id, control.value); 491111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 491211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 491311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set control"); 491411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 491511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 491611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 491711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Wrong qp values[%u %u], allowed range[%u %u]", 491811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)min_qp, (unsigned int)max_qp, (unsigned int)session_qp_range.minqp, (unsigned int)session_qp_range.maxqp); 491911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 492011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 492111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 492211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 492311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 49242601808ee2992a94c325d05e4065aba60b01840bThierry Strudelbool venc_dev::venc_set_session_qp_range_packed(OMX_U32 min_qp, OMX_U32 max_qp) 49252601808ee2992a94c325d05e4065aba60b01840bThierry Strudel{ 49262601808ee2992a94c325d05e4065aba60b01840bThierry Strudel int rc; 49272601808ee2992a94c325d05e4065aba60b01840bThierry Strudel struct v4l2_control control; 49282601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 49292601808ee2992a94c325d05e4065aba60b01840bThierry Strudel control.id = V4L2_CID_MPEG_VIDEO_MIN_QP_PACKED; 49302601808ee2992a94c325d05e4065aba60b01840bThierry Strudel control.value = min_qp; 49312601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 49322601808ee2992a94c325d05e4065aba60b01840bThierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set MIN_QP_PACKED control id=%d, val=%d", 49332601808ee2992a94c325d05e4065aba60b01840bThierry Strudel control.id, control.value); 49342601808ee2992a94c325d05e4065aba60b01840bThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 49352601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (rc) { 49362601808ee2992a94c325d05e4065aba60b01840bThierry Strudel DEBUG_PRINT_ERROR("Failed to set control"); 49372601808ee2992a94c325d05e4065aba60b01840bThierry Strudel return false; 49382601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 49392601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 49402601808ee2992a94c325d05e4065aba60b01840bThierry Strudel control.id = V4L2_CID_MPEG_VIDEO_MAX_QP_PACKED; 49412601808ee2992a94c325d05e4065aba60b01840bThierry Strudel control.value = max_qp; 49422601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 49432601808ee2992a94c325d05e4065aba60b01840bThierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set MAX_QP_PACKED control id=%d, val=%d", 49442601808ee2992a94c325d05e4065aba60b01840bThierry Strudel control.id, control.value); 49452601808ee2992a94c325d05e4065aba60b01840bThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 49462601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (rc) { 49472601808ee2992a94c325d05e4065aba60b01840bThierry Strudel DEBUG_PRINT_ERROR("Failed to set control"); 49482601808ee2992a94c325d05e4065aba60b01840bThierry Strudel return false; 49492601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 49502601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 49512601808ee2992a94c325d05e4065aba60b01840bThierry Strudel return true; 49522601808ee2992a94c325d05e4065aba60b01840bThierry Strudel} 49532601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 495411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_profile_level(OMX_U32 eProfile,OMX_U32 eLevel) 495511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 495611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct venc_profile requested_profile = {0}; 495711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct ven_profilelevel requested_level = {0}; 495811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long mb_per_frame = 0; 495911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_profile_level:: eProfile = %u, Level = %u", 496011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)eProfile, (unsigned int)eLevel); 496111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mb_per_frame = ((m_sVenc_cfg.dvs_height + 15) >> 4)* 496211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((m_sVenc_cfg.dvs_width + 15) >> 4); 496311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 496411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((eProfile == 0) && (eLevel == 0) && m_profile_set && m_level_set) { 496511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Profile/Level setting complete before venc_start"); 496611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 496711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 496811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 496911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Validating Profile/Level from table"); 497011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 497111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_validate_profile_level(&eProfile, &eLevel)) { 497211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("ERROR: Profile/Level validation failed"); 497311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 497411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 497511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 497611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) { 497711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("eProfile = %u, OMX_VIDEO_MPEG4ProfileSimple = %d and " 497811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX_VIDEO_MPEG4ProfileAdvancedSimple = %d", (unsigned int)eProfile, 497911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4ProfileAdvancedSimple); 498011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 498111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eProfile == OMX_VIDEO_MPEG4ProfileSimple) { 498211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_profile.profile = V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE; 498311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple) { 498411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_profile.profile = V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE; 498511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 498611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("ERROR: Unsupported MPEG4 profile = %u", 498711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)eProfile); 498811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 498911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 499011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 499111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("eLevel = %u, OMX_VIDEO_MPEG4Level0 = %d, OMX_VIDEO_MPEG4Level1 = %d," 499211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX_VIDEO_MPEG4Level2 = %d, OMX_VIDEO_MPEG4Level3 = %d, OMX_VIDEO_MPEG4Level4 = %d," 499311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "OMX_VIDEO_MPEG4Level5 = %d", (unsigned int)eLevel, OMX_VIDEO_MPEG4Level0, OMX_VIDEO_MPEG4Level1, 499411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_VIDEO_MPEG4Level2, OMX_VIDEO_MPEG4Level3, OMX_VIDEO_MPEG4Level4, OMX_VIDEO_MPEG4Level5); 499511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 499611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (mb_per_frame >= 3600) { 499711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (requested_profile.profile == V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE) 499811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5; 499911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 500011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (requested_profile.profile == V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE) 500111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5; 500211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 500311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (eLevel) { 500411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_MPEG4Level0: 500511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_0; 500611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 500711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_MPEG4Level0b: 500811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_0B; 500911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 501011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_MPEG4Level1: 501111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_1; 501211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 501311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_MPEG4Level2: 501411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_2; 501511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 501611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_MPEG4Level3: 501711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_3; 501811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 501911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_MPEG4Level4a: 502011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_4; 502111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 502211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_MPEG4Level5: 502369b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel case OMX_VIDEO_MPEG4LevelMax: 502469b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel default: //Set max level possible as default so that invalid levels are non-fatal 502511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5; 502611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 502711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 502811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 502911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263) { 503011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 503111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (eProfile) { 503211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_H263ProfileBaseline: 503311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_BASELINE; 503411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 503511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_H263ProfileH320Coding: 503611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_H320CODING; 503711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 503811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_H263ProfileBackwardCompatible: 503911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_BACKWARDCOMPATIBLE; 504011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 504111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_H263ProfileISWV2: 504211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_ISWV2; 504311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 504411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_H263ProfileISWV3: 504511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_ISWV3; 504611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 504711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_H263ProfileHighCompression: 504811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_HIGHCOMPRESSION; 504911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 505011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_H263ProfileInternet: 505111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_INTERNET; 505211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 505311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_H263ProfileInterlace: 505411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_INTERLACE; 505511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 505611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_H263ProfileHighLatency: 505711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_HIGHLATENCY; 505811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 505911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 506011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("ERROR: Unsupported H.263 profile = %lu", 506111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_profile.profile); 506211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 506311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 506411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 506511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //profile level 506611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (eLevel) { 506711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_H263Level10: 506811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_1_0; 506911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 507011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_H263Level20: 507111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_2_0; 507211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 507311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_H263Level30: 507411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_3_0; 507511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 507611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_H263Level40: 507711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_4_0; 507811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 507911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_H263Level45: 508011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_4_5; 508111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 508211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_H263Level50: 508311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_5_0; 508411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 508511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_H263Level60: 508611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_6_0; 508711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 508811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_H263Level70: 508969b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel case OMX_VIDEO_H263LevelMax: 509069b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel default: //Set max level possible as default so that invalid levels are non-fatal 509111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_7_0; 509211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 509311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 509411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) { 509511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eProfile == OMX_VIDEO_AVCProfileBaseline) { 509611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE; 509711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if(eProfile == QOMX_VIDEO_AVCProfileConstrainedBaseline) { 509811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE; 509911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if(eProfile == QOMX_VIDEO_AVCProfileConstrainedHigh) { 510011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_HIGH; 510111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (eProfile == OMX_VIDEO_AVCProfileMain) { 510211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_MAIN; 510311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (eProfile == OMX_VIDEO_AVCProfileExtended) { 510411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED; 510511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (eProfile == OMX_VIDEO_AVCProfileHigh) { 510611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH; 510711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (eProfile == OMX_VIDEO_AVCProfileHigh10) { 510811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10; 510911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (eProfile == OMX_VIDEO_AVCProfileHigh422) { 511011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422; 511111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (eProfile == OMX_VIDEO_AVCProfileHigh444) { 511211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE; 511311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 511411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("ERROR: Unsupported H.264 profile = %lu", 511511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_profile.profile); 511611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 511711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 511811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 511911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //profile level 512011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (eLevel) { 512111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_AVCLevel1: 512211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_0; 512311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 512411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_AVCLevel1b: 512511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1B; 512611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 512711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_AVCLevel11: 512811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_1; 512911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 513011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_AVCLevel12: 513111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_2; 513211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 513311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_AVCLevel13: 513411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_3; 513511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 513611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_AVCLevel2: 513711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_2_0; 513811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 513911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_AVCLevel21: 514011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_2_1; 514111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 514211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_AVCLevel22: 514311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_2_2; 514411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 514511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_AVCLevel3: 514611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_3_0; 514711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 514811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_AVCLevel31: 514911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_3_1; 515011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 515111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_AVCLevel32: 515211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_3_2; 515311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 515411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_AVCLevel4: 515511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_4_0; 515611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 515711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_AVCLevel41: 515811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_4_1; 515911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 516011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_AVCLevel42: 516111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_4_2; 516211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 516311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_AVCLevel5: 516411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_5_0; 516511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 516611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_AVCLevel51: 516711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_5_1; 516811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 516911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_AVCLevel52: 517011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_AVCLevelMax: 517169b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel default: //Set max level possible as default so that invalid levels are non-fatal 517211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_5_2; 517311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 517411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 517511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8) { 517611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!(eProfile == OMX_VIDEO_VP8ProfileMain)) { 517711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Unsupported VP8 profile = %u", 517811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)eProfile); 517911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 518011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 518111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_VP8_UNUSED; 518211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_profile_set = true; 518311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch(eLevel) { 518411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_VP8Level_Version0: 518511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_0; 518611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 518711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_VP8Level_Version1: 518869b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel case OMX_VIDEO_VP8LevelMax: 518969b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel default: //Set max level possible as default so that invalid levels are non-fatal 519011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_1; 519111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 519211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 519311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_HEVC) { 519411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eProfile == OMX_VIDEO_HEVCProfileMain) { 519511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_HEVC_PROFILE_MAIN; 519611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if(eProfile == OMX_VIDEO_HEVCProfileMain10) { 519711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_HEVC_PROFILE_MAIN10; 519811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 519911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Unsupported HEVC profile = %lu", 520011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_profile.profile); 520111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 520211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 520311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 520411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //profile level 520511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (eLevel) { 520611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_HEVCMainTierLevel1: 520711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_1; 520811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 520911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_HEVCHighTierLevel1: 521011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_1; 521111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 521211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_HEVCMainTierLevel2: 521311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_2; 521411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 521511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_HEVCHighTierLevel2: 521611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_2; 521711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 521811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_HEVCMainTierLevel21: 521911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_2_1; 522011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 522111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_HEVCHighTierLevel21: 522211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_2_1; 522311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 522411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_HEVCMainTierLevel3: 522511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_3; 522611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 522711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_HEVCHighTierLevel3: 522811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_3; 522911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 523011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_HEVCMainTierLevel31: 523111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_3_1; 523211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 523311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_HEVCHighTierLevel31: 523411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_3_1; 523511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 523611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_HEVCMainTierLevel4: 523711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_4; 523811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 523911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_HEVCHighTierLevel4: 524011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_4; 524111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 524211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_HEVCMainTierLevel41: 524311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_4_1; 524411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 524511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_HEVCHighTierLevel41: 524611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_4_1; 524711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 524811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_HEVCMainTierLevel5: 524911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_5; 525011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 525111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_HEVCHighTierLevel5: 525211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_5; 525311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 525411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_HEVCMainTierLevel51: 525511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_5_1; 525611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 525711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_HEVCHighTierLevel51: 525811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_5_1; 525911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 526011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_HEVCMainTierLevel52: 526111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_5_2; 526211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 526311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_HEVCHighTierLevel52: 526411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_5_2; 526511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 526611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_HEVCMainTierLevel6: 526711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_6; 526811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 526911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_HEVCHighTierLevel6: 527011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_6; 527111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 527211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_HEVCMainTierLevel61: 527311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_6_1; 527411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 527511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_VIDEO_HEVCHighTierLevel61: 527669b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel case OMX_VIDEO_HEVCLevelMax: 527769b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel default: //Set max level possible as default so that invalid levels are non-fatal 527811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_6_1; 527911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 528011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 528111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 528211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 528311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_profile_set) { 528411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc; 528511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 528611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 528711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) { 528811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDEO_H264_PROFILE; 528911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) { 529011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE; 529111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263) { 529211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_H263_PROFILE; 529311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_HEVC) { 529411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_HEVC_PROFILE; 529511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 529611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Wrong CODEC"); 529711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 529811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 529911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 530011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = requested_profile.profile; 530111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 530211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value); 530311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 530411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 530511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 530611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set control"); 530711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 530811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 530911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 531011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value); 531111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 531211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel codec_profile.profile = control.value; 531311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_profile_set = true; 531411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 531511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 531611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_level_set) { 531711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc; 531811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 531911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 532011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) { 532111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDEO_H264_LEVEL; 532211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) { 532311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL; 532411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263) { 532511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_H263_LEVEL; 532611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8) { 532711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_VP8_PROFILE_LEVEL; 532811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_HEVC) { 532911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_HEVC_TIER_LEVEL; 533011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 533111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Wrong CODEC"); 533211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 533311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 533411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 533511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = requested_level.level; 533611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 533711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value); 533811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 533911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 534011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 534111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set control"); 534211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 534311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 534411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 534511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value); 534611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 534711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profile_level.level = control.value; 534811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_level_set = true; 534911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 535011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 535111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 535211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 535311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 535411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_voptiming_cfg( OMX_U32 TimeIncRes) 535511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 535611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 535711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct venc_voptimingcfg vop_timing_cfg; 535811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 535911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_voptiming_cfg: TimeRes = %u", 536011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)TimeIncRes); 536111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 536211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vop_timing_cfg.voptime_resolution = TimeIncRes; 536311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 536411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel voptimecfg.voptime_resolution = vop_timing_cfg.voptime_resolution; 536511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 536611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 536711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 536811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_intra_period(OMX_U32 nPFrames, OMX_U32 nBFrames) 536911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 537011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 537111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_intra_period: nPFrames = %u, nBFrames: %u", (unsigned int)nPFrames, (unsigned int)nBFrames); 537211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc; 537311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 537411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int pframe = 0, bframe = 0; 537511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel char property_value[PROPERTY_VALUE_MAX] = {0}; 537611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 537711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((codec_profile.profile != V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE) && 537811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (codec_profile.profile != V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) && 537911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (codec_profile.profile != V4L2_MPEG_VIDC_VIDEO_HEVC_PROFILE_MAIN) && 538011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (codec_profile.profile != V4L2_MPEG_VIDC_VIDEO_HEVC_PROFILE_MAIN10) && 538111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (codec_profile.profile != V4L2_MPEG_VIDEO_H264_PROFILE_HIGH)) { 538211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nBFrames=0; 538311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 538411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 538511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_validate_hybridhp_params(0, nBFrames, 0, 0) && !is_thulium_v1) { 538611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid settings, bframes cannot be enabled with HybridHP"); 538711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 538811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 538911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 539011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel intra_period.num_pframes = nPFrames; 539111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel intra_period.num_bframes = nBFrames; 539211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 539311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_calibrate_gop() && !is_thulium_v1) 539411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 539511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid settings, Hybrid HP enabled with LTR OR Hier-pLayers OR bframes"); 539611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 539711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 539811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 539911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_sVenc_cfg.input_width * m_sVenc_cfg.input_height >= 3840 * 2160 && 540011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (property_get("vidc.enc.disable_bframes", property_value, "0") && atoi(property_value))) { 540111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel intra_period.num_pframes = intra_period.num_pframes + intra_period.num_bframes; 540211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel intra_period.num_bframes = 0; 540311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Warning: Disabling B frames for UHD recording pFrames = %lu bFrames = %lu", 540411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel intra_period.num_pframes, intra_period.num_bframes); 540511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 540611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 5407bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel if (m_sVenc_cfg.input_width * m_sVenc_cfg.input_height >= 5376 * 2688 && 5408bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel (property_get("vidc.enc.disable_pframes", property_value, "0") && atoi(property_value))) { 5409bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel intra_period.num_pframes = 0; 5410bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel DEBUG_PRINT_LOW("Warning: Disabling P frames for 5k/6k resolutions pFrames = %lu bFrames = %lu", 5411bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel intra_period.num_pframes, intra_period.num_bframes); 5412bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel } 5413bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel 541411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_P_FRAMES; 541511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = intra_period.num_pframes; 541611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 541711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 541811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 541911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set control"); 542011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 542111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 542211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 542311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value); 542411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 542511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_B_FRAMES; 542611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = intra_period.num_bframes; 542711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value); 542811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 542911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 543011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 543111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set control"); 543211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 543311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 543411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 543511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%lu", control.id, intra_period.num_bframes); 543611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 543711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264 || 543811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.codectype == V4L2_PIX_FMT_HEVC) { 543911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_IDR_PERIOD; 544011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = 1; 544111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 544211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 544311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 544411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 544511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set control"); 544611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 544711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 544811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel idrperiod.idrperiod = 1; 544911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 545011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 545111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 545211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 545311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_idr_period(OMX_U32 nPFrames, OMX_U32 nIDRPeriod) 545411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 545511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 545611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 545711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_idr_period: nPFrames = %u, nIDRPeriod: %u", 545811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)nPFrames, (unsigned int)nIDRPeriod); 545911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 546011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_sVenc_cfg.codectype != V4L2_PIX_FMT_H264) { 546111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: IDR period valid for H264 only!!"); 546211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 546311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 546411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 546511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (venc_set_intra_period (nPFrames, intra_period.num_bframes) == false) { 546611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Request for setting intra period failed"); 546711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 546811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 546911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 547011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!intra_period.num_bframes) 547111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel intra_period.num_pframes = nPFrames; 547211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_IDR_PERIOD; 547311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = nIDRPeriod; 547411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 547511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 547611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 547711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 547811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set control"); 547911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 548011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 548111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 548211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel idrperiod.idrperiod = nIDRPeriod; 548311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 548411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 548511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 548611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_entropy_config(OMX_BOOL enable, OMX_U32 i_cabac_level) 548711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 548811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 548911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 549011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 549111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_entropy_config: CABAC = %u level: %u", enable, (unsigned int)i_cabac_level); 549211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 549311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (enable && (codec_profile.profile != V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE) && 549411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (codec_profile.profile != V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE)) { 549511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 549611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC; 549711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE; 549811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 549911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value); 550011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 550111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 550211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 550311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set control"); 550411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 550511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 550611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 550711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value); 550811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel entropy.longentropysel = control.value; 550911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 551011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (i_cabac_level == 0) { 551111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_0; 551211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (i_cabac_level == 1) { 551311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_1; 551411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (i_cabac_level == 2) { 551511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_2; 551611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 551711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 551811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL; 551911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //control.value = entropy_cfg.cabacmodel; 552011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value); 552111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 552211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 552311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 552411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set control"); 552511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 552611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 552711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 552811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value); 552911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel entropy.cabacmodel=control.value; 553011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (!enable) { 553111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC; 553211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE; 553311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value); 553411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 553511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 553611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 553711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set control"); 553811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 553911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 554011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 554111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value); 554211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel entropy.longentropysel=control.value; 554311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 554411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid Entropy mode for Baseline Profile"); 554511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 554611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 554711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 554811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 554911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 555011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 555111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_multislice_cfg(OMX_INDEXTYPE Codec, OMX_U32 nSlicesize) // MB 555211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 555311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc; 555411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 555511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool status = true; 555611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 555711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((Codec != OMX_IndexParamVideoH263) && (nSlicesize)) { 555811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_MB; 555911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 556011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE; 556111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 556211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 556311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE; 556411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value); 556511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 556611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 556711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 556811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set control"); 556911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 557011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 557111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 557211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value); 557311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel multislice.mslice_mode=control.value; 557411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 557511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (multislice.mslice_mode!=V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE) { 557611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 557711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB; 557811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = nSlicesize; 557911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling SLICE_MB IOCTL set control for id=%d, val=%d", control.id, control.value); 558011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 558111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 558211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 558311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set control"); 558411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 558511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 558611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 558711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value); 558811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel multislice.mslice_size=control.value; 558911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 559011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 559111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 559211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return status; 559311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 559411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 559511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_intra_refresh(OMX_VIDEO_INTRAREFRESHTYPE ir_mode, OMX_U32 irMBs) 559611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 559711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool status = true; 559811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc; 559911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control_mode,control_mbs; 560011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control_mode.id = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_MODE; 560111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control_mbs.id = V4L2_CID_MPEG_VIDC_VIDEO_CIR_MBS; 560211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control_mbs.value = 0; 560311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // There is no disabled mode. Disabled mode is indicated by a 0 count. 560411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (irMBs == 0 || ir_mode == OMX_VIDEO_IntraRefreshMax) { 560511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_NONE; 560611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return status; 560711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ((ir_mode == OMX_VIDEO_IntraRefreshCyclic) && 560811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (irMBs < ((m_sVenc_cfg.dvs_width * m_sVenc_cfg.dvs_height)>>8))) { 560911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_CYCLIC; 561011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control_mbs.id=V4L2_CID_MPEG_VIDC_VIDEO_CIR_MBS; 561111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control_mbs.value=irMBs; 561211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ((ir_mode == OMX_VIDEO_IntraRefreshAdaptive) && 561311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (irMBs < ((m_sVenc_cfg.dvs_width * m_sVenc_cfg.dvs_height)>>8))) { 561411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_ADAPTIVE; 561511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control_mbs.id=V4L2_CID_MPEG_VIDC_VIDEO_AIR_MBS; 561611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control_mbs.value=irMBs; 561711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ((ir_mode == OMX_VIDEO_IntraRefreshBoth) && 561811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (irMBs < ((m_sVenc_cfg.dvs_width * m_sVenc_cfg.dvs_height)>>8))) { 561911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_CYCLIC_ADAPTIVE; 562011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ((ir_mode == OMX_VIDEO_IntraRefreshRandom) && 562111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (irMBs < ((m_sVenc_cfg.dvs_width * m_sVenc_cfg.dvs_height)>>8))) { 562211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_RANDOM; 562311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control_mbs.id = V4L2_CID_MPEG_VIDC_VIDEO_AIR_MBS; 562411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control_mbs.value = irMBs; 562511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 562611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Invalid IntraRefresh Parameters:" 562711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "mb count: %u, mb mode:%d", (unsigned int)irMBs, ir_mode); 562811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 562911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 563011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 563111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set control for id=%u, val=%d", control_mode.id, control_mode.value); 563211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control_mode); 563311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 563411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 563511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set control"); 563611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 563711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 563811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 563911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control_mode.id, control_mode.value); 564011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 564111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control_mbs.id, control_mbs.value); 564211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control_mbs); 564311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 564411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 564511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set control"); 564611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 564711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 564811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 564911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control_mbs.id, control_mbs.value); 565011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 565111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel intra_refresh.irmode = control_mode.value; 565211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel intra_refresh.mbcount = control_mbs.value; 565311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 565411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return status; 565511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 565611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 565711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_error_resilience(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* error_resilience) 565811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 565911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool status = true; 566011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct venc_headerextension hec_cfg; 566111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct venc_multiclicecfg multislice_cfg; 566211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc; 566311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 resynchMarkerSpacingBytes = 0; 566411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 566511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 566611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&control, 0, sizeof(control)); 566711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 566811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) { 566911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (error_resilience->bEnableHEC) { 567011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel hec_cfg.header_extension = 1; 567111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 567211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel hec_cfg.header_extension = 0; 567311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 567411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 567511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel hec.header_extension = error_resilience->bEnableHEC; 567611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 567711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 567811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (error_resilience->bEnableRVLC) { 567911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("RVLC is not Supported"); 568011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 568111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 568211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 568311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (( m_sVenc_cfg.codectype != V4L2_PIX_FMT_H263) && 568411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (error_resilience->bEnableDataPartitioning)) { 568511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("DataPartioning are not Supported for MPEG4/H264"); 568611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 568711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 568811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 568911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (error_resilience->nResynchMarkerSpacing) { 569011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel resynchMarkerSpacingBytes = error_resilience->nResynchMarkerSpacing; 569111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel resynchMarkerSpacingBytes = ALIGN(resynchMarkerSpacingBytes, 8) >> 3; 569211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 569311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (( m_sVenc_cfg.codectype != V4L2_PIX_FMT_H263) && 569411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (error_resilience->nResynchMarkerSpacing)) { 569511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel multislice_cfg.mslice_mode = VEN_MSLICE_CNT_BYTE; 569611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel multislice_cfg.mslice_size = resynchMarkerSpacingBytes; 569711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE; 569811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_BYTES; 569911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263 && 570011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel error_resilience->bEnableDataPartitioning) { 570111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel multislice_cfg.mslice_mode = VEN_MSLICE_GOB; 570211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel multislice_cfg.mslice_size = resynchMarkerSpacingBytes; 570311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE; 570411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDEO_MULTI_SLICE_GOB; 570511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 570611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel multislice_cfg.mslice_mode = VEN_MSLICE_OFF; 570711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel multislice_cfg.mslice_size = 0; 570811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE; 570911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE; 571011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 571111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 571211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("%s(): mode = %lu, size = %lu", __func__, 571311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel multislice_cfg.mslice_mode, multislice_cfg.mslice_size); 571411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Calling IOCTL set control for id=%x, val=%d", control.id, control.value); 571511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 571611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 571711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 571811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set Slice mode control"); 571911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 572011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 572111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 572211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Success IOCTL set control for id=%x, value=%d", control.id, control.value); 572311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel multislice.mslice_mode=control.value; 572411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 5725fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.id = (multislice_cfg.mslice_mode == VEN_MSLICE_GOB) ? 5726fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel V4L2_CID_MPEG_VIDEO_MULTI_SLICE_GOB : V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES; 572711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = resynchMarkerSpacingBytes; 572811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Calling IOCTL set control for id=%x, val=%d", control.id, control.value); 572911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 573011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 573111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 573211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 573311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set MAX MB control"); 573411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 573511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 573611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 573711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Success IOCTL set control for id=%x, value=%d", control.id, control.value); 573811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel multislice.mslice_mode = multislice_cfg.mslice_mode; 573911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel multislice.mslice_size = multislice_cfg.mslice_size; 574011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return status; 574111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 574211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 574311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_inloop_filter(OMX_VIDEO_AVCLOOPFILTERTYPE loopfilter) 574411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 574511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc; 574611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 574711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id=V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE; 574811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value=0; 574911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 575011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (loopfilter == OMX_VIDEO_AVCLoopFilterEnable) { 575111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value=V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_ENABLED; 575211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (loopfilter == OMX_VIDEO_AVCLoopFilterDisable) { 575311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value=V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED; 575411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (loopfilter == OMX_VIDEO_AVCLoopFilterDisableSliceBoundary) { 575511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value=V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED_AT_SLICE_BOUNDARY; 575611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 575711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 575811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value); 575911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 576011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 576111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 576211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 576311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 576411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 576511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value); 576611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 576711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dbkfilter.db_mode=control.value; 576811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 576911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id=V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA; 577011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value=0; 577111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 577211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value); 577311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 577411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 577511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 577611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 577711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 577811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 577911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value); 578011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id=V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA; 578111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value=0; 578211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value); 578311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 578411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 578511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 578611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 578711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 578811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 578911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value); 579011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 579111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 579211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dbkfilter.slicealpha_offset = dbkfilter.slicebeta_offset = 0; 579311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 579411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 579511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 579611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_target_bitrate(OMX_U32 nTargetBitrate, OMX_U32 config) 579711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 579811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_target_bitrate: bitrate = %u", 579911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)nTargetBitrate); 580011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 580111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 580211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 580311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (vqzip_sei_info.enabled) { 580411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("For VQZIP 1.0, Bitrate setting is not supported"); 580511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 580611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 580711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 580811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDEO_BITRATE; 580911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = nTargetBitrate; 581011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 581111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value); 581211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 581311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 581411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 581511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set control"); 581611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 581711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 581811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 581911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value); 582011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 582111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 582211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.targetbitrate = control.value; 582311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bitrate.target_bitrate = control.value; 582411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 582511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!config) { 582611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_level_set = false; 582711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 582811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (venc_set_profile_level(0, 0)) { 582911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Calling set level (Bitrate) with %lu",profile_level.level); 583011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 583111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 583211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 5833fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // Configure layer-wise bitrate if temporal layers are enabled and layer-wise distribution 5834fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // has been specified 5835fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (temporal_layers_config.bIsBitrateRatioValid && temporal_layers_config.nPLayers) { 5836fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel OMX_U32 layerBitrates[OMX_VIDEO_MAX_HP_LAYERS] = {0}, 5837fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel numLayers = temporal_layers_config.nPLayers + temporal_layers_config.nBLayers; 5838fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 5839fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_LOW("TemporalLayer: configuring layerwise bitrate"); 5840fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel for (OMX_U32 i = 0; i < numLayers; ++i) { 5841fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel layerBitrates[i] = 5842fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel (temporal_layers_config.nTemporalLayerBitrateFraction[i] * bitrate.target_bitrate) / 100; 5843fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_LOW("TemporalLayer: layer[%u] ratio=%u%% bitrate=%u(of %ld)", 5844fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel i, temporal_layers_config.nTemporalLayerBitrateFraction[i], 5845fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel layerBitrates[i], bitrate.target_bitrate); 5846fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 5847fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (!venc_set_layer_bitrates((OMX_U32 *)layerBitrates, numLayers)) { 5848fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return false; 5849fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 5850fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 5851fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 585211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 585311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 585411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 585511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_encode_framerate(OMX_U32 encode_framerate, OMX_U32 config) 585611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 585711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_streamparm parm; 585811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 585911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct venc_framerate frame_rate_cfg; 586011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Q16ToFraction(encode_framerate,frame_rate_cfg.fps_numerator,frame_rate_cfg.fps_denominator); 586111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel parm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 586211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel parm.parm.output.timeperframe.numerator = frame_rate_cfg.fps_denominator; 586311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel parm.parm.output.timeperframe.denominator = frame_rate_cfg.fps_numerator; 586411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 586511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (vqzip_sei_info.enabled) { 586611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("For VQZIP 1.0, Framerate setting is not supported"); 586711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 586811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 586911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 587011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 587111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (frame_rate_cfg.fps_numerator > 0) 587211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_PARM, &parm); 587311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 587411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 587511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Request for setting framerate failed"); 587611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 587711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 587811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 587911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.fps_den = frame_rate_cfg.fps_denominator; 588011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.fps_num = frame_rate_cfg.fps_numerator; 588111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 588211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!config) { 588311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_level_set = false; 588411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 588511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (venc_set_profile_level(0, 0)) { 588611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Calling set level (Framerate) with %lu",profile_level.level); 588711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 588811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 588911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 589011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 589111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 589211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 589311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_color_format(OMX_COLOR_FORMATTYPE color_format) 589411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 589511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 5896fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel int color_space = 0; 589711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_color_format: color_format = %u ", color_format); 589811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 589911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch ((int)color_format) { 590011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_COLOR_FormatYUV420SemiPlanar: 590111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m: 590211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.inputformat = V4L2_PIX_FMT_NV12; 5903fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel color_space = V4L2_COLORSPACE_470_SYSTEM_BG; 590411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 590511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case QOMX_COLOR_FormatYVU420SemiPlanar: 590611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.inputformat = V4L2_PIX_FMT_NV21; 5907fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel color_space = V4L2_COLORSPACE_470_SYSTEM_BG; 590811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 590911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed: 591011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.inputformat = V4L2_PIX_FMT_NV12_UBWC; 5911fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel color_space = V4L2_COLORSPACE_470_SYSTEM_BG; 591211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 591311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case QOMX_COLOR_Format32bitRGBA8888: 591411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.inputformat = V4L2_PIX_FMT_RGB32; 591511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 591611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case QOMX_COLOR_Format32bitRGBA8888Compressed: 591711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.inputformat = V4L2_PIX_FMT_RGBA8888_UBWC; 591811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 591911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 592011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("WARNING: Unsupported Color format [%d]", color_format); 592111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.inputformat = V4L2_DEFAULT_OUTPUT_COLOR_FMT; 5922fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel color_space = V4L2_COLORSPACE_470_SYSTEM_BG; 592311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Default color format NV12 UBWC is set"); 5924fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#ifdef _PQ_ 5925fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel /* 5926fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel * If Client is using Opaque, YUV format will be informed with 5927fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel * first ETB. Till that point, it is unknown. 5928fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel */ 5929fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_pq.is_YUV_format_uncertain = true; 5930fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#endif // _PQ_ 593111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 593211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 593311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 593411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&fmt, 0, sizeof(fmt)); 593511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 593611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.inputformat; 5937fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel fmt.fmt.pix_mp.colorspace = color_space; 593811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height; 593911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width; 594011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 594111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt)) { 594211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed setting color format %x", color_format); 594311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 594411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 594511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 594611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 594711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 594811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 594911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_intra_vop_refresh(OMX_BOOL intra_vop_refresh) 595011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 595111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_intra_vop_refresh: intra_vop = %uc", intra_vop_refresh); 595211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 595311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (intra_vop_refresh == OMX_TRUE) { 595411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 595511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc; 595611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_REQUEST_IFRAME; 595711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = 1; 595811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 5959a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 596011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 5961a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel DEBUG_PRINT_ERROR("Failed to set Intra Frame Request control"); 596211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 596311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 5964a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel DEBUG_PRINT_HIGH("Success IOCTL set control for id=%x, value=%d", control.id, control.value); 596511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 596611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: VOP Refresh is False, no effect"); 596711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 596811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 596911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 597011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 597111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 597211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_deinterlace(OMX_U32 enable) 597311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 597411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_deinterlace: enable = %u", (unsigned int)enable); 597511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 597611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc; 597711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_DEINTERLACE; 597811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (enable) 597911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_CID_MPEG_VIDC_VIDEO_DEINTERLACE_ENABLED; 598011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 598111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_CID_MPEG_VIDC_VIDEO_DEINTERLACE_ENABLED; 598211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 598311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set control for id=%x, val=%d", control.id, control.value); 598411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 598511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 598611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set Deinterlcing control"); 598711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 598811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 598911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%x, value=%d", control.id, control.value); 599011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel deinterlace_enabled = true; 599111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 599211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 599311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 599411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_calibrate_gop() 599511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 599611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ratio, sub_gop_size, gop_size, nPframes, nBframes, nLayers; 599711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int num_sub_gops_in_a_gop; 599811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPframes = intra_period.num_pframes; 599911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nBframes = intra_period.num_bframes; 600011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nLayers = hier_layers.numlayers; 6001fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (temporal_layers_config.nPLayers) { 6002fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel nLayers = temporal_layers_config.nPLayers + temporal_layers_config.nBLayers; 6003fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 600411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 600511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!nPframes && nLayers) { 600611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("nPframes should be non-zero when nLayers are present\n"); 600711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 600811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 600911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 601011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (nLayers > 1) { /*Multi-layer encoding*/ 601111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sub_gop_size = 1 << (nLayers - 1); 601211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Actual GOP definition is nPframes + nBframes + 1 but for the sake of 601311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * below calculations we are ignoring +1 . Ignoring +1 in below 601411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * calculations is not a mistake but intentional. 601511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 601611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel gop_size = MAX(sub_gop_size, ROUND(nPframes + nBframes, sub_gop_size)); 601711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel num_sub_gops_in_a_gop = gop_size/sub_gop_size; 601811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (nBframes) { /*Hier-B case*/ 601911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* 602011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Frame Type--> I B B B P B B B P I B B P ... 602111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Layer --> 0 2 1 2 0 2 1 2 0 0 2 1 2 ... 602211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * nPframes = 2, nBframes = 6, nLayers = 3 602311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 602411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Intention is to keep the intraperiod as close as possible to what is desired 602511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * by the client while adjusting nPframes and nBframes to meet other constraints. 602611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * eg1: Input by client: nPframes = 9, nBframes = 14, nLayers = 2 602711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Output of this fn: nPframes = 12, nBframes = 12, nLayers = 2 602811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 602911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * eg2: Input by client: nPframes = 9, nBframes = 4, nLayers = 2 603011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Output of this fn: nPframes = 7, nBframes = 7, nLayers = 2 603111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 603211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPframes = num_sub_gops_in_a_gop; 603311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nBframes = gop_size - nPframes; 603411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { /*Hier-P case*/ 603511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* 603611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Frame Type--> I P P P P P P P I P P P P ... 603711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Layer--> 0 2 1 2 0 2 1 2 0 2 1 2 0 ... 603811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * nPframes = 7, nBframes = 0, nLayers = 3 603911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 604011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Intention is to keep the intraperiod as close as possible to what is desired 604111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * by the client while adjusting nPframes and nBframes to meet other constraints. 604211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * eg1: Input by client: nPframes = 9, nBframes = 0, nLayers = 3 604311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Output of this fn: nPframes = 7, nBframes = 0, nLayers = 3 604411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 604511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * eg2: Input by client: nPframes = 10, nBframes = 0, nLayers = 3 604611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Output of this fn:nPframes = 12, nBframes = 0, nLayers = 3 604711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 604811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nPframes = gop_size - 1; 604911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 605011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { /*Single-layer encoding*/ 605111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (nBframes) { 605211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* I P B B B P B B B P B B B I P B B... 605311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17... 605411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * nPframes = 3, nBframes = 9, nLayers = 0 605511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 605611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * ratio is rounded, 605711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * eg1: nPframes = 9, nBframes = 11 => ratio = 1 605811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * eg2: nPframes = 9, nBframes = 16 => ratio = 2 605911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 606011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ratio = MAX(1, MIN((nBframes + (nPframes >> 1))/nPframes, 3)); 606111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel nBframes = ratio * nPframes; 606211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 606311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 606411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("P/B Frames changed from: %ld/%ld to %d/%d", 606511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel intra_period.num_pframes, intra_period.num_bframes, nPframes, nBframes); 606611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel intra_period.num_pframes = nPframes; 606711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel intra_period.num_bframes = nBframes; 606811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel hier_layers.numlayers = nLayers; 606911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 607011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 607111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 607211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_bitrate_type(OMX_U32 type) 607311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 607411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 607511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 607611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_VENC_BITRATE_TYPE; 607711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = type; 607811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Set Bitrate type to %s for %d \n", bitrate_type_string(type), type); 607911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 608011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 608111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Request to set Bitrate type to %s failed", 608211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bitrate_type_string(type)); 608311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 608411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 608511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 608611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 608711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 6088fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelbool venc_dev::venc_set_layer_bitrates(OMX_U32 *layerBitrate, OMX_U32 numLayers) 608911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 609011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_layer_bitrates"); 6091fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel struct v4l2_ext_control ctrl[OMX_VIDEO_ANDROID_MAXTEMPORALLAYERS]; 609211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_ext_controls controls; 609311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 609411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 i; 609511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 609611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_bitrate_type(V4L2_CID_MPEG_VIDC_VIDEO_VENC_BITRATE_ENABLE)) { 609711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set layerwise bitrate type %d", rc); 609811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 609911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 610011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 6101fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel for (OMX_U32 i = 0; i < numLayers && i < OMX_VIDEO_ANDROID_MAXTEMPORALLAYERS; ++i) { 6102fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (!layerBitrate[i]) { 6103fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Invalid bitrate settings for layer %d", i); 610411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 610511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 610611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[i].id = V4L2_CID_MPEG_VIDC_VENC_PARAM_LAYER_BITRATE; 6107fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel ctrl[i].value = layerBitrate[i]; 610811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 610911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 6110fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel controls.count = numLayers; 611111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.ctrl_class = V4L2_CTRL_CLASS_MPEG; 611211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.controls = ctrl; 611311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 611411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_EXT_CTRLS, &controls); 611511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 611611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set layerwise bitrate %d", rc); 611711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 611811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 611911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 6120fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_LOW("Layerwise bitrate configured successfully"); 612111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 612211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 612311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 612411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_hybrid_hierp(QOMX_EXTNINDEX_VIDEO_HYBRID_HP_MODE* hhp) 612511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 612611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_hybrid_hierp layers"); 612711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 612811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc; 612911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 613011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_validate_hybridhp_params(hhp->nHpLayers, 0, 0, (int) HIER_P_HYBRID)) { 613111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid settings, Hybrid HP enabled with LTR OR Hier-pLayers OR bframes"); 613211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 613311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 613411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 613511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!hhp->nHpLayers || hhp->nHpLayers > MAX_HYB_HIERP_LAYERS) { 613611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid numbers of layers set: %d (max supported is 6)", hhp->nHpLayers); 613711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 613811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 613911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_intra_period(hhp->nKeyFrameInterval, 0)) { 614011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set Intraperiod: %d", hhp->nKeyFrameInterval); 614111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 614211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 614311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 614411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel hier_layers.numlayers = hhp->nHpLayers; 614511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) { 614611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel hier_layers.hier_mode = HIER_P_HYBRID; 614711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_HEVC) { 614811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel hier_layers.hier_mode = HIER_P; 614911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 615011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (venc_calibrate_gop()) { 615111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Update the driver with the new nPframes and nBframes 615211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_P_FRAMES; 615311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = intra_period.num_pframes; 615411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 615511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 615611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set control"); 615711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 615811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 615911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 616011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_B_FRAMES; 616111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = intra_period.num_bframes; 616211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 616311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 616411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set control"); 616511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 616611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 616711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Updated nPframes (%ld) and nBframes (%ld)", 616811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel intra_period.num_pframes, intra_period.num_bframes); 616911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 617011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid settings, Hybrid HP enabled with LTR OR Hier-pLayers OR bframes"); 617111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 617211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 617311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) { 617411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_HYBRID_HIERP_MODE; 617511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_HEVC) { 617611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_HIER_P_NUM_LAYERS; 617711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 617811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = hhp->nHpLayers - 1; 617911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 618011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set control for id=%x, val=%d", 618111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id, control.value); 618211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 618311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 618411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 618511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set hybrid hierp/hierp %d", rc); 618611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 618711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 618811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 618911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("SUCCESS IOCTL set control for id=%x, val=%d", 619011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id, control.value); 619111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) { 619211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_H264_NAL_SVC; 619311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_CID_MPEG_VIDC_VIDEO_H264_NAL_SVC_ENABLED; 619411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) { 619511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to enable SVC_NAL"); 619611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 619711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 619811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_HEVC) { 619911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_MAX_HIERP_LAYERS; 620011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = hhp->nHpLayers - 1; 620111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) { 620211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to enable SVC_NAL"); 620311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 620411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 620511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 620611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed : Unsupported codec for Hybrid Hier P : %lu", m_sVenc_cfg.codectype); 620711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 620811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 620911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 621011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(venc_set_session_qp_range (hhp->nMinQuantizer, 621111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel hhp->nMaxQuantizer) == false) { 621211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Setting QP Range for hybridHP [%u %u] failed", 621311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (unsigned int)hhp->nMinQuantizer, (unsigned int)hhp->nMaxQuantizer); 621411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 621511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 621611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel session_qp_values.minqp = hhp->nMinQuantizer; 621711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel session_qp_values.maxqp = hhp->nMaxQuantizer; 621811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 621911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 6220fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel OMX_U32 layerBitrates[OMX_VIDEO_MAX_HP_LAYERS] = {0}; 6221fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel for (OMX_U32 i = 0; i < hhp->nHpLayers; i++) { 6222fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel layerBitrates[i] = hhp->nTemporalLayerBitrateRatio[i]; 6223fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel hybrid_hp.nTemporalLayerBitrateRatio[i] = hhp->nTemporalLayerBitrateRatio[i]; 6224fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_LOW("Setting Layer[%u] bitrate = %u", i, layerBitrates[i]); 6225fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 6226fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (!venc_set_layer_bitrates((OMX_U32 *)layerBitrates, hhp->nHpLayers)) { 622711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set Layer wise bitrate: %d, %d, %d, %d, %d, %d", 622811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel hhp->nTemporalLayerBitrateRatio[0],hhp->nTemporalLayerBitrateRatio[1], 622911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel hhp->nTemporalLayerBitrateRatio[2],hhp->nTemporalLayerBitrateRatio[3], 623011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel hhp->nTemporalLayerBitrateRatio[4],hhp->nTemporalLayerBitrateRatio[5]); 623111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 623211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 6233fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel hybrid_hp.nHpLayers = hhp->nHpLayers; 6234fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 623511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Set this or else the layer0 bitrate will be overwritten by 623611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // default value in component 623711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sVenc_cfg.targetbitrate = bitrate.target_bitrate = hhp->nTemporalLayerBitrateRatio[0]; 623811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel hybrid_hp.nHpLayers = hhp->nHpLayers; 623911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel hybrid_hp.nKeyFrameInterval = hhp->nKeyFrameInterval; 624011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel hybrid_hp.nMaxQuantizer = hhp->nMaxQuantizer; 624111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel hybrid_hp.nMinQuantizer = hhp->nMinQuantizer; 624211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 624311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 624411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 624511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_ltrmode(OMX_U32 enable, OMX_U32 count) 624611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 624711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_ltrmode: enable = %u", (unsigned int)enable); 624811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_ext_control ctrl[2]; 624911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_ext_controls controls; 625011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc; 625111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 625211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_validate_hybridhp_params(0, 0, count, 0)) { 625311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid settings, LTR enabled with HybridHP"); 625411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 625511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 625611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 625711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[0].id = V4L2_CID_MPEG_VIDC_VIDEO_LTRMODE; 625811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (enable) 625911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[0].value = V4L2_MPEG_VIDC_VIDEO_LTR_MODE_MANUAL; 626011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 626111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[0].value = V4L2_MPEG_VIDC_VIDEO_LTR_MODE_DISABLE; 626211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 626311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[1].id = V4L2_CID_MPEG_VIDC_VIDEO_LTRCOUNT; 626411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (enable && count > 0) 626511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[1].value = count; 626611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (enable) 626711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[1].value = 1; 626811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 626911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[1].value = 0; 627011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 627111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.count = 2; 627211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.ctrl_class = V4L2_CTRL_CLASS_MPEG; 627311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.controls = ctrl; 627411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 627511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set control for id=%x, val=%d id=%x, val=%d", 627611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.controls[0].id, controls.controls[0].value, 627711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.controls[1].id, controls.controls[1].value); 627811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 627911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_EXT_CTRLS, &controls); 628011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 628111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set ltrmode %d", rc); 628211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 628311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 628411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ltrinfo.enabled = enable; 628511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ltrinfo.count = count; 628611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 628711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%x, val=%d id=%x, val=%d", 628811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.controls[0].id, controls.controls[0].value, 628911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.controls[1].id, controls.controls[1].value); 629011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 629111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!venc_set_profile_level(0, 0)) { 629211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: %s(): Driver Profile/Level is NOT SET", 629311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel __func__); 629411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 629511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("%s(): Driver Profile[%lu]/Level[%lu] successfully SET", 629611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel __func__, codec_profile.profile, profile_level.level); 629711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 629811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 629911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 630011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 630111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 630211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_useltr(OMX_U32 frameIdx) 630311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 630411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_use_goldenframe"); 630511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = true; 630611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 630711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 630811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_USELTRFRAME; 630911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = frameIdx; 631011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 631111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 631211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 631311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set use_ltr %d", rc); 631411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 631511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 631611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 631711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%x, val=%d", 631811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id, control.value); 631911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 632011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 632111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 632211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_markltr(OMX_U32 frameIdx) 632311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 632411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_goldenframe"); 632511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = true; 632611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 632711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 632811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_MARKLTRFRAME; 632911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = frameIdx; 633011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 633111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 633211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 633311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set ltrmode %d", rc); 633411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 633511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 633611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 633711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%x, val=%d", 633811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id, control.value); 633911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 634011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 634111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 634211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_vpe_rotation(OMX_S32 rotation_angle) 634311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 634411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_vpe_rotation: rotation angle = %d", (int)rotation_angle); 634511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 634611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc; 634711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_format fmt; 634811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_requestbuffers bufreq; 634911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 635011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_ROTATION; 635111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rotation_angle == 0) 635211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_CID_MPEG_VIDC_VIDEO_ROTATION_NONE; 635311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (rotation_angle == 90) 635411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_CID_MPEG_VIDC_VIDEO_ROTATION_90; 635511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (rotation_angle == 180) 635611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_CID_MPEG_VIDC_VIDEO_ROTATION_180; 635711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (rotation_angle == 270) 635811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_CID_MPEG_VIDC_VIDEO_ROTATION_270; 635911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else { 636011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to find valid rotation angle"); 636111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 636211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 636311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 636411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set control for id=%x, val=%d", control.id, control.value); 636511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 636611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 636711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Failed to set VPE Rotation control"); 636811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 636911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 637011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%x, value=%d", control.id, control.value); 637111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 637211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel memset(&fmt, 0, sizeof(fmt)); 637311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 637411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.height = m_sVenc_cfg.dvs_height; 637511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.width = m_sVenc_cfg.dvs_width; 637611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.codectype; 637711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt)) { 637811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set format on capture port"); 637911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 638011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 638111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 638211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sOutput_buff_property.datasize = fmt.fmt.pix_mp.plane_fmt[0].sizeimage; 638311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.memory = V4L2_MEMORY_USERPTR; 638411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.count = m_sOutput_buff_property.actualcount; 638511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bufreq.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 638611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq)) { 638711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("ERROR: Request for o/p buffer count failed for rotation"); 638811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 638911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 639011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (bufreq.count >= m_sOutput_buff_property.mincount) 639111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel m_sOutput_buff_property.actualcount = m_sOutput_buff_property.mincount = bufreq.count; 639211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 639311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 639411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 639511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 639611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_searchrange() 639711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 639811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_searchrange"); 639911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 640011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_ext_control ctrl[6]; 640111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_ext_controls controls; 640211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc; 640311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 640411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) { 640511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[0].id = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_X_RANGE; 640611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[0].value = 16; 640711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[1].id = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_Y_RANGE; 640811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[1].value = 4; 640911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[2].id = V4L2_CID_MPEG_VIDC_VIDEO_PFRAME_X_RANGE; 641011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[2].value = 16; 641111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[3].id = V4L2_CID_MPEG_VIDC_VIDEO_PFRAME_Y_RANGE; 641211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[3].value = 4; 641311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[4].id = V4L2_CID_MPEG_VIDC_VIDEO_BFRAME_X_RANGE; 641411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[4].value = 12; 641511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[5].id = V4L2_CID_MPEG_VIDC_VIDEO_BFRAME_Y_RANGE; 641611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[5].value = 4; 641711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if ((m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) || 641811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8)) { 641911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[0].id = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_X_RANGE; 642011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[0].value = 16; 642111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[1].id = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_Y_RANGE; 642211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[1].value = 4; 642311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[2].id = V4L2_CID_MPEG_VIDC_VIDEO_PFRAME_X_RANGE; 642411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[2].value = 16; 642511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[3].id = V4L2_CID_MPEG_VIDC_VIDEO_PFRAME_Y_RANGE; 642611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[3].value = 4; 642711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[4].id = V4L2_CID_MPEG_VIDC_VIDEO_BFRAME_X_RANGE; 642811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[4].value = 12; 642911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[5].id = V4L2_CID_MPEG_VIDC_VIDEO_BFRAME_Y_RANGE; 643011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[5].value = 4; 643111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263) { 643211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[0].id = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_X_RANGE; 643311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[0].value = 4; 643411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[1].id = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_Y_RANGE; 643511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[1].value = 4; 643611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[2].id = V4L2_CID_MPEG_VIDC_VIDEO_PFRAME_X_RANGE; 643711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[2].value = 4; 643811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[3].id = V4L2_CID_MPEG_VIDC_VIDEO_PFRAME_Y_RANGE; 643911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[3].value = 4; 644011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[4].id = V4L2_CID_MPEG_VIDC_VIDEO_BFRAME_X_RANGE; 644111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[4].value = 4; 644211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[5].id = V4L2_CID_MPEG_VIDC_VIDEO_BFRAME_Y_RANGE; 644311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[5].value = 4; 644411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 644511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid codec type"); 644611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 644711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 644811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.count = 6; 644911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.ctrl_class = V4L2_CTRL_CLASS_MPEG; 645011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.controls = ctrl; 645111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 645211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW(" Calling IOCTL set control for" 645311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "id=%x, val=%d id=%x, val=%d" 645411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "id=%x, val=%d id=%x, val=%d" 645511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "id=%x, val=%d id=%x, val=%d", 645611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.controls[0].id, controls.controls[0].value, 645711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.controls[1].id, controls.controls[1].value, 645811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.controls[2].id, controls.controls[2].value, 645911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.controls[3].id, controls.controls[3].value, 646011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.controls[4].id, controls.controls[4].value, 646111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.controls[5].id, controls.controls[5].value); 646211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 646311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_EXT_CTRLS, &controls); 646411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 646511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set search range %d", rc); 646611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 646711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 646811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 646911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 647011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 647111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_ratectrl_cfg(OMX_VIDEO_CONTROLRATETYPE eControlRate) 647211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 647311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool status = true; 647411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 647511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 647611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL; 647711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 64782601808ee2992a94c325d05e4065aba60b01840bThierry Strudel switch ((OMX_U32)eControlRate) { 647911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_Video_ControlRateDisable: 648011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_OFF; 648111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 648211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_Video_ControlRateVariableSkipFrames: 648311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (supported_rc_modes & RC_VBR_VFR) ? 648411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_VBR_VFR : 648511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 648611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 648711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_Video_ControlRateVariable: 648811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (supported_rc_modes & RC_VBR_CFR) ? 648911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_VBR_CFR : 649011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 649111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 649211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_Video_ControlRateConstantSkipFrames: 649311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (supported_rc_modes & RC_CBR_VFR) ? 649411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_CBR_VFR : 649511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 649611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 649711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_Video_ControlRateConstant: 649811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (supported_rc_modes & RC_CBR_CFR) ? 649911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_CBR_CFR : 650011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 650111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 65022601808ee2992a94c325d05e4065aba60b01840bThierry Strudel case QOMX_Video_ControlRateMaxBitrate: 65032601808ee2992a94c325d05e4065aba60b01840bThierry Strudel (supported_rc_modes & RC_MBR_CFR) ? 65042601808ee2992a94c325d05e4065aba60b01840bThierry Strudel control.value = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_MBR_CFR: 65052601808ee2992a94c325d05e4065aba60b01840bThierry Strudel status = false; 65062601808ee2992a94c325d05e4065aba60b01840bThierry Strudel break; 65072601808ee2992a94c325d05e4065aba60b01840bThierry Strudel case QOMX_Video_ControlRateMaxBitrateSkipFrames: 65082601808ee2992a94c325d05e4065aba60b01840bThierry Strudel (supported_rc_modes & RC_MBR_VFR) ? 65092601808ee2992a94c325d05e4065aba60b01840bThierry Strudel control.value = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_MBR_VFR: 65102601808ee2992a94c325d05e4065aba60b01840bThierry Strudel status = false; 65112601808ee2992a94c325d05e4065aba60b01840bThierry Strudel break; 651211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 651311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 651411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 651511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 651611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 651711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (status) { 651811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 651911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value); 652011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 652111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 652211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 652311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set control"); 652411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 652511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 652611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 652711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value); 652811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 652911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rate_ctrl.rcmode = control.value; 653011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 653111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 653211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _VQZIP_ 653311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eControlRate == OMX_Video_ControlRateVariable && (supported_rc_modes & RC_VBR_CFR) 6534fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel && m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) { 653511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Enable VQZIP SEI by default for camcorder RC modes */ 653611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 653711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_VQZIP_SEI; 653811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_CID_MPEG_VIDC_VIDEO_VQZIP_SEI_ENABLE; 653911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Set VQZIP SEI:"); 654011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control) < 0) { 654111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Non-Fatal: Request to set VQZIP failed"); 654211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 654311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 654411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 654511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 654611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return status; 654711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 654811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 654911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_perf_level(QOMX_VIDEO_PERF_LEVEL ePerfLevel) 655011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 655111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool status = true; 655211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 655311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 655411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_SET_PERF_LEVEL; 655511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 655611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (ePerfLevel) { 655711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QCOM_PerfLevelNominal: 655811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL; 655911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 656011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case OMX_QCOM_PerfLevelTurbo: 656111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO; 656211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 656311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 65642e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL; 656511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 656611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 656711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 656811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 656911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (status) { 657011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value); 657111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 657211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 657311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 657411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set control for id=%d, val=%d", control.id, control.value); 657511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 657611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 657711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 657811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value); 65792e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel DEBUG_PRINT_INFO("Requested perf level : %s", 65802e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel ePerfLevel == OMX_QCOM_PerfLevelTurbo ? "turbo" : "nominal"); 658111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 658211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return status; 658311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 658411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 658511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_perf_mode(OMX_U32 mode) 658611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 658711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 658811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (mode && mode <= V4L2_MPEG_VIDC_VIDEO_PERF_POWER_SAVE) { 658911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_PERF_MODE; 659011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = mode; 659111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Going to set V4L2_CID_MPEG_VIDC_VIDEO_PERF_MODE"); 659211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) { 659311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set V4L2_CID_MPEG_VIDC_VIDEO_PERF_MODE"); 659411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 659511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 659611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 659711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 659811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid mode set for V4L2_CID_MPEG_VIDC_VIDEO_PERF_MODE: %d", mode); 659911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 660011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 660111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 660211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 660311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_qp(OMX_U32 nQp) 660411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 660511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 660611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (nQp) { 660711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_CONFIG_QP; 660811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = nQp; 660911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Going to set V4L2_CID_MPEG_VIDC_VIDEO_CONFIG_QP"); 661011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) { 661111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set V4L2_CID_MPEG_VIDC_VIDEO_CONFIG_QP"); 661211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 661311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 661411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 661511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid qp set for V4L2_CID_MPEG_VIDC_VIDEO_CONFIG_QP: %d", nQp); 661611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 661711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 661811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 661911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 662011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 662111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_aspectratio(void *nSar) 662211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 662311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc; 662411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 662511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_ext_control ctrl[2]; 662611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_ext_controls controls; 662711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel QOMX_EXTNINDEX_VIDEO_VENC_SAR *sar; 662811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 662911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel sar = (QOMX_EXTNINDEX_VIDEO_VENC_SAR *) nSar; 663011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 663111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[0].id = V4L2_CID_MPEG_VIDC_VENC_PARAM_SAR_WIDTH; 663211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[0].value = sar->nSARWidth; 663311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[1].id = V4L2_CID_MPEG_VIDC_VENC_PARAM_SAR_HEIGHT; 663411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[1].value = sar->nSARHeight; 663511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 663611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.count = 2; 663711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.ctrl_class = V4L2_CTRL_CLASS_MPEG; 663811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.controls = ctrl; 663911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 664011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set control for id=%x val=%d, id=%x val=%d", 664111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.controls[0].id, controls.controls[0].value, 664211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.controls[1].id, controls.controls[1].value); 664311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 664411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_EXT_CTRLS, &controls); 664511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 664611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set SAR %d", rc); 664711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 664811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 664911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 665011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%x val=%d, id=%x val=%d", 665111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.controls[0].id, controls.controls[0].value, 665211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.controls[1].id, controls.controls[1].value); 665311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 665411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 665511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 665611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_hierp_layers(OMX_U32 hierp_layers) 665711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 665811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 665911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (hierp_layers && (hier_layers.hier_mode == HIER_P) && 666011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (hierp_layers <= hier_layers.numlayers)) { 666111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_HIER_P_NUM_LAYERS; 666211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = hierp_layers - 1; 666311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Going to set V4L2_CID_MPEG_VIDC_VIDEO_HIER_P_NUM_LAYERS"); 666411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) { 666511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set HIERP_LAYERS"); 666611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 666711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 666811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 666911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 667011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid layers set for HIERP_LAYERS: %d", 667111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel hierp_layers); 667211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 667311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 667411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 667511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 667611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_lowlatency_mode(OMX_BOOL enable) 667711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 667811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 667911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 668011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 668111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_LOWLATENCY_MODE; 668211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (enable) 668311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_CID_MPEG_VIDC_VIDEO_LOWLATENCY_ENABLE; 668411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 668511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_CID_MPEG_VIDC_VIDEO_LOWLATENCY_DISABLE; 668611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 668711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set control for id=%x, val=%d", control.id, control.value); 668811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 668911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 669011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set lowlatency control"); 669111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 669211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 669311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%x, value=%d", control.id, control.value); 669411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 669511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 669611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 669711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 669811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_low_latency(OMX_BOOL enable) 669911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 670011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 670111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 670211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_sVenc_cfg.codectype != V4L2_PIX_FMT_H264) { 670311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Low Latency mode is valid only for H264"); 670411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 670511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 670611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 670711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel enable ? control.value = 2 : control.value = 0; 670811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 670911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_H264_PIC_ORDER_CNT; 671011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) { 671111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set H264_PICORDER_CNT"); 671211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 671311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 671411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 671511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel low_latency_mode = (OMX_BOOL) enable; 671611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 671711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 671811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 671911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 6720a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudelbool venc_dev::venc_set_iframesize_type(QOMX_VIDEO_IFRAMESIZE_TYPE type) 6721a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel{ 6722a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel struct v4l2_control control; 6723a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_TYPE; 6724a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel 6725a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel switch (type) { 6726a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel case QOMX_IFRAMESIZE_DEFAULT: 6727a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel control.value = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_DEFAULT; 6728a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel break; 6729a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel case QOMX_IFRAMESIZE_MEDIUM: 6730a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel control.value = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_MEDIUM; 6731a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel break; 6732a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel case QOMX_IFRAMESIZE_HUGE: 6733a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel control.value = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_HUGE; 6734a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel break; 6735a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel case QOMX_IFRAMESIZE_UNLIMITED: 6736a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel control.value = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_UNLIMITED; 6737a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel break; 6738a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel default: 6739a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel DEBUG_PRINT_INFO("Unknown Iframe Size found setting it to default"); 6740a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel control.value = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_DEFAULT; 6741a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel } 6742a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel 6743a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) { 6744a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel DEBUG_PRINT_ERROR("Failed to set iframe size hint"); 6745a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel return false; 6746a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel } 6747a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel 6748a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel return true; 6749a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel} 6750a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel 675111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_baselayerid(OMX_U32 baseid) 675211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 675311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 675411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (hier_layers.hier_mode == HIER_P) { 675511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_BASELAYER_ID; 675611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = baseid; 675711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Going to set V4L2_CID_MPEG_VIDC_VIDEO_BASELAYER_ID"); 675811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) { 675911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set V4L2_CID_MPEG_VIDC_VIDEO_BASELAYER_ID"); 676011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 676111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 676211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 676311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 676411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid mode set for V4L2_CID_MPEG_VIDC_VIDEO_BASELAYER_ID: %d", 676511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel hier_layers.hier_mode); 676611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 676711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 676811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 676911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 677011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_vui_timing_info(OMX_BOOL enable) 677111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 677211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 677311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 677411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_H264_VUI_TIMING_INFO; 677511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 677611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (enable) 677711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_VIDEO_H264_VUI_TIMING_INFO_ENABLED; 677811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 677911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_VIDEO_H264_VUI_TIMING_INFO_DISABLED; 678011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 678111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set control for id=%x, val=%d", control.id, control.value); 678211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 678311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 678411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set VUI timing info control"); 678511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 678611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 678711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%x, value=%d", control.id, control.value); 678811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 678911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 679011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 679111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_peak_bitrate(OMX_U32 nPeakBitrate) 679211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 679311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 679411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 679511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDEO_BITRATE_PEAK; 679611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = nPeakBitrate; 679711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 679811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_peak_bitrate: bitrate = %u", (unsigned int)nPeakBitrate); 679911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 680011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value); 680111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 680211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 680311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 680411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set peak bitrate control"); 680511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 680611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 680711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 680811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value); 680911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 681011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 681111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 681211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 681311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_vpx_error_resilience(OMX_BOOL enable) 681411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 681511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 681611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int rc = 0; 681711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_VPX_ERROR_RESILIENCE; 681811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 681911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (enable) 682011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = 1; 682111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 682211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = 0; 682311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 682411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_vpx_error_resilience: %d", control.value); 682511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 682611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value); 682711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 682811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 682911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rc) { 683011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set VPX Error Resilience"); 683111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 683211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 683311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel vpx_err_resilience.enable = 1; 683411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value); 683511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 683611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 683711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 683811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_priority(OMX_U32 priority) { 683911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 684011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 684111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_PRIORITY; 684211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (priority == 0) 684311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_VIDEO_PRIORITY_REALTIME_ENABLE; 684411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else 684511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = V4L2_MPEG_VIDC_VIDEO_PRIORITY_REALTIME_DISABLE; 684611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 684711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) { 684811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set V4L2_MPEG_VIDC_VIDEO_PRIORITY_REALTIME_%s", 684911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel priority == 0 ? "ENABLE" : "DISABLE"); 685011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 685111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 685211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 685311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 685411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 685511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_operatingrate(OMX_U32 rate) { 685611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 685711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 685811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_OPERATING_RATE; 685911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = rate; 686011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 686111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("venc_set_operating_rate: %d fps", rate >> 16); 686211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value); 686311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 686411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) { 686511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel hw_overload = errno == EBUSY; 686611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set operating rate %d fps (%s)", 686711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel rate >> 16, hw_overload ? "HW overload" : strerror(errno)); 686811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 686911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 687011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel operating_rate = rate; 687111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Operating Rate Set = %d fps", rate >> 16); 687211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 687311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 687411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 68752e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudelbool venc_dev::venc_set_roi_qp_info(OMX_QTI_VIDEO_CONFIG_ROIINFO *roiInfo) 68762e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel{ 68772e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel struct roidata roi; 68782e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel 68792e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel if (!m_roi_enabled) { 68802e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel DEBUG_PRINT_ERROR("ROI info not enabled"); 68812e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel return false; 68822e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel } 6883fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (!roiInfo) { 6884fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("No ROI info present"); 6885fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return false; 6886fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 6887fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (m_sVenc_cfg.codectype != V4L2_PIX_FMT_H264 && 6888fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_sVenc_cfg.codectype != V4L2_PIX_FMT_HEVC) { 6889fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("OMX_QTIIndexConfigVideoRoiInfo is not supported for %d codec", (OMX_U32) m_sVenc_cfg.codectype); 6890fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return false; 6891fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 6892fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 6893fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("ROI QP info received"); 68942e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel memset(&roi, 0, sizeof(struct roidata)); 68952e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel 68962e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel#ifdef _PQ_ 6897fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel pthread_mutex_lock(&m_pq.lock); 68982e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel roi.info.nUpperQpOffset = roiInfo->nUpperQpOffset; 68992e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel roi.info.nLowerQpOffset = roiInfo->nLowerQpOffset; 69002e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel roi.info.bUseRoiInfo = roiInfo->bUseRoiInfo; 69012e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel roi.info.nRoiMBInfoSize = roiInfo->nRoiMBInfoSize; 69022e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel 69032e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel roi.info.pRoiMBInfo = malloc(roi.info.nRoiMBInfoSize); 69042e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel if (!roi.info.pRoiMBInfo) { 69052e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel DEBUG_PRINT_ERROR("venc_set_roi_qp_info: malloc failed"); 69062e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel return false; 69072e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel } 69082e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel memcpy(roi.info.pRoiMBInfo, roiInfo->pRoiMBInfo, roiInfo->nRoiMBInfoSize); 69092e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel /* 69102e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel * set the timestamp equal to previous etb timestamp + 1 69112e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel * to know this roi data arrived after previous etb 69122e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel */ 69132e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel if (venc_handle->m_etb_count) 69142e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel roi.timestamp = venc_handle->m_etb_timestamp + 1; 69152e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel else 69162e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel roi.timestamp = 0; 69172e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel 6918fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel roi.dirty = true; 69192e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel 69202e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel pthread_mutex_lock(&m_roilock); 69212e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel DEBUG_PRINT_LOW("list add roidata with timestamp %lld us", roi.timestamp); 69222e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel m_roilist.push_back(roi); 69232e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel pthread_mutex_unlock(&m_roilock); 69242e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel 6925fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel pthread_mutex_unlock(&m_pq.lock); 6926fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#else // _PQ_ 69272e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel roi.info.nUpperQpOffset = roiInfo->nUpperQpOffset; 69282e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel roi.info.nLowerQpOffset = roiInfo->nLowerQpOffset; 69292e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel roi.info.bUseRoiInfo = roiInfo->bUseRoiInfo; 69302e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel roi.info.nRoiMBInfoSize = roiInfo->nRoiMBInfoSize; 69312e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel 69322e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel roi.info.pRoiMBInfo = malloc(roi.info.nRoiMBInfoSize); 69332e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel if (!roi.info.pRoiMBInfo) { 69342e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel DEBUG_PRINT_ERROR("venc_set_roi_qp_info: malloc failed."); 69352e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel return false; 69362e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel } 69372e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel memcpy(roi.info.pRoiMBInfo, roiInfo->pRoiMBInfo, roiInfo->nRoiMBInfoSize); 69382e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel /* 69392e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel * set the timestamp equal to previous etb timestamp + 1 69402e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel * to know this roi data arrived after previous etb 69412e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel */ 69422e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel if (venc_handle->m_etb_count) 69432e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel roi.timestamp = venc_handle->m_etb_timestamp + 1; 69442e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel else 69452e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel roi.timestamp = 0; 69462e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel 6947fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel roi.dirty = true; 69482e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel 69492e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel pthread_mutex_lock(&m_roilock); 69502e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel DEBUG_PRINT_LOW("list add roidata with timestamp %lld us.", roi.timestamp); 69512e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel m_roilist.push_back(roi); 69522e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel pthread_mutex_unlock(&m_roilock); 6953fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#endif // _PQ_ 6954fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 6955fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return true; 6956fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel} 6957fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 695811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_blur_resolution(OMX_QTI_VIDEO_CONFIG_BLURINFO *blurInfo) 695911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 696011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_ext_control ctrl[2]; 696111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_ext_controls controls; 696211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 696311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int blur_width = 0, blur_height = 0; 696411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 696511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (blurInfo->eTargetResol) { 696611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case BLUR_RESOL_DISABLED: 696711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel blur_width = 0; 696811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel blur_height = 0; 696911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 697011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case BLUR_RESOL_240: 697111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel blur_width = 426; 697211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel blur_height = 240; 697311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 697411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case BLUR_RESOL_480: 697511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel blur_width = 854; 697611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel blur_height = 480; 697711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 697811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case BLUR_RESOL_720: 697911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel blur_width = 1280; 698011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel blur_height = 720; 698111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 698211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case BLUR_RESOL_1080: 698311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel blur_width = 1920; 698411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel blur_height = 1080; 698511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 698611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 698711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Blur resolution not recognized"); 698811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 698911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 699011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 699111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[0].id = V4L2_CID_MPEG_VIDC_VIDEO_BLUR_WIDTH; 699211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[0].value = blur_width; 699311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 699411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[1].id = V4L2_CID_MPEG_VIDC_VIDEO_BLUR_HEIGHT; 699511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ctrl[1].value = blur_height; 699611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 699711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.count = 2; 699811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.ctrl_class = V4L2_CTRL_CLASS_MPEG; 699911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel controls.controls = ctrl; 700011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 700111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(ioctl(m_nDriver_fd, VIDIOC_S_EXT_CTRLS, &controls)) { 700211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set blur resoltion"); 700311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 700411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 700511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Blur resolution set = %d x %d", blur_width, blur_height); 700611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 700711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 700811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 700911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 70102601808ee2992a94c325d05e4065aba60b01840bThierry Strudelbool venc_dev::venc_h264_transform_8x8(OMX_BOOL enable) 70112601808ee2992a94c325d05e4065aba60b01840bThierry Strudel{ 70122601808ee2992a94c325d05e4065aba60b01840bThierry Strudel struct v4l2_control control; 70132601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 70142601808ee2992a94c325d05e4065aba60b01840bThierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_H264_TRANSFORM_8x8; 70152601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (enable) 70162601808ee2992a94c325d05e4065aba60b01840bThierry Strudel control.value = V4L2_MPEG_VIDC_VIDEO_H264_TRANSFORM_8x8_ENABLE; 70172601808ee2992a94c325d05e4065aba60b01840bThierry Strudel else 70182601808ee2992a94c325d05e4065aba60b01840bThierry Strudel control.value = V4L2_MPEG_VIDC_VIDEO_H264_TRANSFORM_8x8_DISABLE; 70192601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 70202601808ee2992a94c325d05e4065aba60b01840bThierry Strudel DEBUG_PRINT_LOW("Set h264_transform_8x8 mode: %d", control.value); 70212601808ee2992a94c325d05e4065aba60b01840bThierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) { 70222601808ee2992a94c325d05e4065aba60b01840bThierry Strudel DEBUG_PRINT_ERROR("set control: H264 transform 8x8 failed"); 70232601808ee2992a94c325d05e4065aba60b01840bThierry Strudel return false; 70242601808ee2992a94c325d05e4065aba60b01840bThierry Strudel } 70252601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 70262601808ee2992a94c325d05e4065aba60b01840bThierry Strudel return true; 70272601808ee2992a94c325d05e4065aba60b01840bThierry Strudel} 70282601808ee2992a94c325d05e4065aba60b01840bThierry Strudel 70292e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudelbool venc_dev::venc_get_pq_status(OMX_BOOL *pq_status) { 70302e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel 70312e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel if (pq_status == NULL) { 70322e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel return false; 70332e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel } 70342e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel *pq_status = OMX_FALSE; 70352e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel#ifdef _PQ_ 70362e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel *pq_status = m_pq.is_pq_force_disable ? OMX_FALSE : OMX_TRUE; 70372e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel#endif // _PQ_ 70382e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel return true; 70392e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel} 70402e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel 7041fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelbool venc_dev::venc_get_temporal_layer_caps(OMX_U32 *nMaxLayers, 7042fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel OMX_U32 *nMaxBLayers) { 7043fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 7044fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // no B-layers for all cases 7045fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel temporal_layers_config.nMaxBLayers = 0; 7046fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel temporal_layers_config.nMaxLayers = 1; 7047fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 7048fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264 7049fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel || m_sVenc_cfg.codectype == V4L2_PIX_FMT_HEVC) { 7050fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel temporal_layers_config.nMaxLayers = MAX_HYB_HIERP_LAYERS; // TODO: get this count from codec 7051fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8) { 7052fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel temporal_layers_config.nMaxLayers = 4; // TODO: get this count from codec 7053fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 7054fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 7055fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel *nMaxLayers = temporal_layers_config.nMaxLayers; 7056fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel *nMaxBLayers = temporal_layers_config.nMaxBLayers; 7057fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return true; 7058fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel} 7059fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 7060fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry StrudelOMX_ERRORTYPE venc_dev::venc_set_temporal_layers( 7061fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel OMX_VIDEO_PARAM_ANDROID_TEMPORALLAYERINGTYPE *pTemporalParams) { 7062fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 7063fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (!(m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264 7064fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel || m_sVenc_cfg.codectype == V4L2_PIX_FMT_HEVC 7065fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel || m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8)) { 7066fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Temporal layers not supported for %s", codec_as_string(m_sVenc_cfg.codectype)); 7067fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return OMX_ErrorUnsupportedSetting; 7068fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 7069fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 7070fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (pTemporalParams->ePattern == OMX_VIDEO_AndroidTemporalLayeringPatternNone && 7071fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel (pTemporalParams->nBLayerCountActual != 0 || 7072fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel pTemporalParams->nPLayerCountActual != 1)) { 7073fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return OMX_ErrorBadParameter; 7074fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else if (pTemporalParams->ePattern != OMX_VIDEO_AndroidTemporalLayeringPatternAndroid || 7075fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel pTemporalParams->nPLayerCountActual < 1) { 7076fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return OMX_ErrorBadParameter; 7077fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 7078fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 7079fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (pTemporalParams->nBLayerCountActual > temporal_layers_config.nMaxBLayers) { 7080fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("TemporalLayer: Requested B-layers(%u) exceeds supported max(%u)", 7081fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel pTemporalParams->nBLayerCountActual, temporal_layers_config.nMaxBLayers); 7082fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return OMX_ErrorBadParameter; 7083fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else if (pTemporalParams->nPLayerCountActual > 7084fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel temporal_layers_config.nMaxLayers - pTemporalParams->nBLayerCountActual) { 7085fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("TemporalLayer: Requested layers(%u) exceeds supported max(%u)", 7086fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel pTemporalParams->nPLayerCountActual + pTemporalParams->nBLayerCountActual, 7087fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel temporal_layers_config.nMaxLayers); 7088fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return OMX_ErrorBadParameter; 7089fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 7090fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 7091fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // For AVC, if B-layer has not been configured and RC mode is VBR (camcorder), 7092fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // use hybrid-HP for best results 7093fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel bool isAvc = m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264; 7094fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel bool isVBR = rate_ctrl.rcmode == RC_VBR_CFR || rate_ctrl.rcmode == RC_VBR_VFR; 7095fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel bool bUseHybridMode = isAvc && pTemporalParams->nBLayerCountActual == 0 && isVBR; 7096fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 7097fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // If there are more than 3 layers configured for AVC, normal HP will not work. force hybrid 7098fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel bUseHybridMode |= (isAvc && pTemporalParams->nPLayerCountActual > MAX_AVC_HP_LAYERS); 7099fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 7100fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_LOW("TemporalLayer: RC-mode = %ld : %s hybrid-HP", 7101fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel rate_ctrl.rcmode, bUseHybridMode ? "enable" : "disable"); 7102fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 7103fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (bUseHybridMode && 7104fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel !venc_validate_hybridhp_params(pTemporalParams->nPLayerCountActual, 7105fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel pTemporalParams->nBLayerCountActual, 7106fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 0 /* LTR count */, (int) HIER_P_HYBRID)) { 7107fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel bUseHybridMode = false; 7108fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Failed to validate Hybrid HP. Will try fallback to normal HP"); 7109fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 7110fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 7111fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (intra_period.num_bframes) { 7112fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("TemporalLayer: B frames are not supported with layers"); 7113fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return OMX_ErrorUnsupportedSetting; 7114fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 7115fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 7116fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (!venc_set_intra_period(intra_period.num_pframes, intra_period.num_bframes)) { 7117fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("TemporalLayer : Failed to set Intra-period nP(%lu)/pB(%lu)", 7118fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel intra_period.num_pframes, intra_period.num_bframes); 7119fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return OMX_ErrorUnsupportedSetting; 7120fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 7121fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 7122fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel struct v4l2_control control; 7123fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // Num enhancements layers does not include the base-layer 7124fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.value = pTemporalParams->nPLayerCountActual - 1; 7125fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 7126fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (bUseHybridMode) { 7127fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_LOW("TemporalLayer: Try enabling hybrid HP with %u layers", control.value); 7128fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_HYBRID_HIERP_MODE; 7129fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) { 7130fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel bUseHybridMode = false; 7131fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Failed to set hybrid HP"); 7132fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else { 7133fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // Disable normal HP if Hybrid mode is being enabled 7134fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_MAX_HIERP_LAYERS; 7135fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.value = 0; 7136fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) { 7137fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Failed to set max HP layers to %u", control.value); 7138fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return OMX_ErrorUnsupportedSetting; 7139fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 7140fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_HIER_P_NUM_LAYERS; 7141fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.value = 0; 7142fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) { 7143fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Failed to set HP layers to %u", control.value); 7144fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return OMX_ErrorUnsupportedSetting; 7145fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 7146fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 7147fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 7148fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 7149fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (!bUseHybridMode) { 7150fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 7151fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // in case of normal HP, avc encoder cannot support more than MAX_AVC_HP_LAYERS 7152fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (isAvc && pTemporalParams->nPLayerCountActual > MAX_AVC_HP_LAYERS) { 7153fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("AVC supports only up to %d layers", MAX_AVC_HP_LAYERS); 7154fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return OMX_ErrorUnsupportedSetting; 7155fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 7156fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 7157fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_LOW("TemporalLayer: Try enabling HP with %u layers", control.value); 7158fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_HIER_P_NUM_LAYERS; 7159fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) { 7160fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Failed to set hybrid hierp/hierp"); 7161fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return OMX_ErrorUnsupportedSetting; 7162fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 7163fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 7164fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // configure max layers for a session.. Okay to use current num-layers as max 7165fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // since we do not plan to support dynamic changes to number of layers 7166fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_MAX_HIERP_LAYERS; 7167fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.value = pTemporalParams->nPLayerCountActual - 1; 7168fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) { 7169fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Failed to set max HP layers to %u", control.value); 7170fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return OMX_ErrorUnsupportedSetting; 7171fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 7172fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else if (temporal_layers_config.hier_mode == HIER_P_HYBRID) { 7173fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // Disable hybrid mode if it was enabled already 7174fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_LOW("TemporalLayer: disable hybrid HP (normal-HP preferred)"); 7175fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_HYBRID_HIERP_MODE; 7176fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.value = 0; 7177fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) { 7178fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Failed to disable hybrid HP !"); 7179fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return OMX_ErrorUnsupportedSetting; 7180fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 7181fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 7182fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 7183fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 7184fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // SVC-NALs to indicate layer-id in case of H264 needs explicit enablement.. 7185fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) { 7186fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_LOW("TemporalLayer: Enable H264_SVC_NAL"); 7187fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.id = V4L2_CID_MPEG_VIDC_VIDEO_H264_NAL_SVC; 7188fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel control.value = V4L2_CID_MPEG_VIDC_VIDEO_H264_NAL_SVC_ENABLED; 7189fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) { 7190fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Failed to enable SVC_NAL"); 7191fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return OMX_ErrorUnsupportedSetting; 7192fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 7193fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 7194fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 7195fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel temporal_layers_config.hier_mode = bUseHybridMode ? HIER_P_HYBRID : HIER_P; 7196fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel temporal_layers_config.nPLayers = pTemporalParams->nPLayerCountActual; 7197fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel temporal_layers_config.nBLayers = 0; 7198fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 7199fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel temporal_layers_config.bIsBitrateRatioValid = OMX_FALSE; 7200fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (pTemporalParams->bBitrateRatiosSpecified == OMX_FALSE) { 7201fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_LOW("TemporalLayer: layerwise bitrate ratio not specified. Will use cumulative.."); 7202fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return OMX_ErrorNone; 7203fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 7204fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_LOW("TemporalLayer: layerwise bitrate ratio specified"); 7205fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 7206fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel OMX_U32 layerBitrates[OMX_VIDEO_MAX_HP_LAYERS] = {0}, 7207fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel numLayers = pTemporalParams->nPLayerCountActual + pTemporalParams->nBLayerCountActual; 7208fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 7209fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel OMX_U32 i = 0; 7210fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel for (; i < numLayers; ++i) { 7211fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel OMX_U32 previousLayersAccumulatedBitrateRatio = i == 0 ? 0 : pTemporalParams->nBitrateRatios[i-1]; 7212fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel OMX_U32 currentLayerBitrateRatio = pTemporalParams->nBitrateRatios[i] - previousLayersAccumulatedBitrateRatio; 7213fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (previousLayersAccumulatedBitrateRatio > pTemporalParams->nBitrateRatios[i]) { 7214fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("invalid bitrate ratio for layer %d.. Will fallback to cumulative", i); 7215fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return OMX_ErrorBadParameter; 7216fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else { 7217fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel layerBitrates[i] = (currentLayerBitrateRatio * bitrate.target_bitrate) / 100; 7218fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel temporal_layers_config.nTemporalLayerBitrateRatio[i] = pTemporalParams->nBitrateRatios[i]; 7219fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel temporal_layers_config.nTemporalLayerBitrateFraction[i] = currentLayerBitrateRatio; 7220fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_LOW("TemporalLayer: layer[%u] ratio=%u%% bitrate=%u(of %ld)", 7221fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel i, currentLayerBitrateRatio, layerBitrates[i], bitrate.target_bitrate); 7222fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 7223fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 7224fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 7225fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel temporal_layers_config.bIsBitrateRatioValid = OMX_TRUE; 7226fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 7227fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // Setting layerwise bitrate makes sense only if target bitrate is configured, else defer until later.. 7228fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (bitrate.target_bitrate > 0) { 7229fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (!venc_set_layer_bitrates((OMX_U32 *)layerBitrates, numLayers)) { 7230fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return OMX_ErrorUnsupportedSetting; 7231fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 7232fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else { 7233fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("Defer setting layerwise bitrate since target bitrate is not yet set"); 7234fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 7235fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 7236fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return OMX_ErrorNone; 7237fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel} 7238fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 7239fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry StrudelOMX_ERRORTYPE venc_dev::venc_set_temporal_layers_internal() { 7240fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel OMX_VIDEO_PARAM_ANDROID_TEMPORALLAYERINGTYPE pTemporalParams; 7241fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel memset(&pTemporalParams, 0x0, sizeof(OMX_VIDEO_PARAM_ANDROID_TEMPORALLAYERINGTYPE)); 7242fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 7243fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (!temporal_layers_config.nPLayers) { 7244fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return OMX_ErrorNone; 7245fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 7246fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel pTemporalParams.eSupportedPatterns = OMX_VIDEO_AndroidTemporalLayeringPatternAndroid; 7247fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel pTemporalParams.nLayerCountMax = temporal_layers_config.nMaxLayers; 7248fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel pTemporalParams.nBLayerCountMax = temporal_layers_config.nMaxBLayers; 7249fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel pTemporalParams.ePattern = OMX_VIDEO_AndroidTemporalLayeringPatternAndroid; 7250fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel pTemporalParams.nPLayerCountActual = temporal_layers_config.nPLayers; 7251fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel pTemporalParams.nBLayerCountActual = temporal_layers_config.nBLayers; 7252fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel pTemporalParams.bBitrateRatiosSpecified = temporal_layers_config.bIsBitrateRatioValid; 7253fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (temporal_layers_config.bIsBitrateRatioValid == OMX_TRUE) { 7254fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel for (OMX_U32 i = 0; i < temporal_layers_config.nPLayers + temporal_layers_config.nBLayers; ++i) { 7255fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel pTemporalParams.nBitrateRatios[i] = 7256fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel temporal_layers_config.nTemporalLayerBitrateRatio[i]; 7257fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 7258fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 7259fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return venc_set_temporal_layers(&pTemporalParams); 7260fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel} 7261fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 726211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_get_profile_level(OMX_U32 *eProfile,OMX_U32 *eLevel) 726311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 726411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool status = true; 726511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 726611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (eProfile == NULL || eLevel == NULL) { 726711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 726811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 726911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 727011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) { 727111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (codec_profile.profile) { 727211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE: 727311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_MPEG4ProfileSimple; 727411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 727511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE: 727611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple; 727711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 727811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 727911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_MPEG4ProfileMax; 728011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 728111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 728211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 728311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 728411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!status) { 728511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return status; 728611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 728711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 728811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //profile level 728911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (profile_level.level) { 729011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_MPEG4_LEVEL_0: 729111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_MPEG4Level0; 729211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 729311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_MPEG4_LEVEL_0B: 729411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_MPEG4Level0b; 729511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 729611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_MPEG4_LEVEL_1: 729711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_MPEG4Level1; 729811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 729911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_MPEG4_LEVEL_2: 730011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_MPEG4Level2; 730111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 730211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_MPEG4_LEVEL_3: 730311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_MPEG4Level3; 730411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 730511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_MPEG4_LEVEL_4: 730611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_MPEG4Level4; 730711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 730811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_MPEG4_LEVEL_5: 730911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_MPEG4Level5; 731011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 731111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 731211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_MPEG4LevelMax; 731311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 731411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 731511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 731611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263) { 731711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (codec_profile.profile == VEN_PROFILE_H263_BASELINE) { 731811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_H263ProfileBaseline; 731911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 732011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_H263ProfileMax; 732111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 732211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 732311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 732411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (profile_level.level) { 732511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VEN_LEVEL_H263_10: 732611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_H263Level10; 732711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 732811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VEN_LEVEL_H263_20: 732911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_H263Level20; 733011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 733111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VEN_LEVEL_H263_30: 733211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_H263Level30; 733311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 733411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VEN_LEVEL_H263_40: 733511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_H263Level40; 733611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 733711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VEN_LEVEL_H263_45: 733811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_H263Level45; 733911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 734011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VEN_LEVEL_H263_50: 734111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_H263Level50; 734211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 734311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VEN_LEVEL_H263_60: 734411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_H263Level60; 734511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 734611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VEN_LEVEL_H263_70: 734711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_H263Level70; 734811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 734911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 735011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_H263LevelMax; 735111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 735211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 735311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 735411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) { 735511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (codec_profile.profile) { 735611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE: 735711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_AVCProfileBaseline; 735811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 735911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE: 736011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = QOMX_VIDEO_AVCProfileConstrainedBaseline; 736111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 736211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_HIGH: 736311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = QOMX_VIDEO_AVCProfileConstrainedHigh; 736411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 736511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN: 736611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_AVCProfileMain; 736711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 736811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH: 736911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_AVCProfileHigh; 737011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 737111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED: 737211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_AVCProfileExtended; 737311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 737411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10: 737511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_AVCProfileHigh10; 737611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 737711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422: 737811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_AVCProfileHigh422; 737911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 738011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE: 738111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_AVCProfileHigh444; 738211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 738311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 738411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_AVCProfileMax; 738511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 738611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 738711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 738811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 738911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!status) { 739011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return status; 739111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 739211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 739311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (profile_level.level) { 739411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_1_0: 739511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_AVCLevel1; 739611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 739711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_1B: 739811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_AVCLevel1b; 739911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 740011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_1_1: 740111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_AVCLevel11; 740211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 740311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_1_2: 740411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_AVCLevel12; 740511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 740611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_1_3: 740711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_AVCLevel13; 740811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 740911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_2_0: 741011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_AVCLevel2; 741111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 741211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_2_1: 741311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_AVCLevel21; 741411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 741511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_2_2: 741611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_AVCLevel22; 741711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 741811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_3_0: 741911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_AVCLevel3; 742011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 742111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_3_1: 742211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_AVCLevel31; 742311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 742411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_3_2: 742511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_AVCLevel32; 742611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 742711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_4_0: 742811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_AVCLevel4; 742911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 743011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_4_1: 743111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_AVCLevel41; 743211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 743311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_4_2: 743411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_AVCLevel42; 743511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 743611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_5_0: 743711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_AVCLevel5; 743811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 743911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_5_1: 744011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_AVCLevel51; 744111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 744211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_LEVEL_5_2: 744311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_AVCLevel52; 744411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 744511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default : 744611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_AVCLevelMax; 744711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 744811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 744911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 745011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 745111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8) { 745211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (codec_profile.profile) { 745311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_VP8_UNUSED: 745411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_VP8ProfileMain; 745511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 745611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 745711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_VP8ProfileMax; 745811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 745911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 746011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 746111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!status) { 746211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return status; 746311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 746411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 746511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (profile_level.level) { 746611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_0: 746711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_VP8Level_Version0; 746811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 746911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_1: 747011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_VP8Level_Version1; 747111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 747211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 747311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_VP8LevelMax; 747411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 747511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 747611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 747711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_HEVC) { 747811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (codec_profile.profile) { 747911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_HEVC_PROFILE_MAIN: 748011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_HEVCProfileMain; 748111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 748211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_HEVC_PROFILE_MAIN10: 748311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_HEVCProfileMain10; 748411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 748511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 748611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_HEVCProfileMax; 748711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 748811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 748911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 749011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!status) { 749111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return status; 749211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 749311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 749411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (profile_level.level) { 749511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_1: 749611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_HEVCMainTierLevel1; 749711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 749811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_1: 749911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_HEVCHighTierLevel1; 750011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 750111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_2: 750211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_HEVCMainTierLevel2; 750311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 750411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_2: 750511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_HEVCHighTierLevel2; 750611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 750711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_2_1: 750811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_HEVCMainTierLevel21; 750911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 751011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_2_1: 751111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_HEVCHighTierLevel21; 751211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 751311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_3: 751411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_HEVCMainTierLevel3; 751511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 751611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_3: 751711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_HEVCHighTierLevel3; 751811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 751911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_3_1: 752011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_HEVCMainTierLevel31; 752111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 752211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_3_1: 752311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_HEVCHighTierLevel31; 752411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 752511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_4: 752611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_HEVCMainTierLevel4; 752711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 752811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_4: 752911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_HEVCHighTierLevel4; 753011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 753111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_4_1: 753211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_HEVCMainTierLevel41; 753311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 753411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_4_1: 753511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_HEVCHighTierLevel41; 753611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 753711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_5: 753811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_HEVCMainTierLevel5; 753911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 754011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_5: 754111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_HEVCHighTierLevel5; 754211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 754311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_5_1: 754411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_HEVCMainTierLevel51; 754511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 754611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_5_1: 754711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_HEVCHighTierLevel51; 754811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 754911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_5_2: 755011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_HEVCMainTierLevel52; 755111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 755211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_5_2: 755311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_HEVCHighTierLevel52; 755411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 755511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_6: 755611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_HEVCMainTierLevel6; 755711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 755811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_6: 755911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_HEVCHighTierLevel6; 756011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 756111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_6_1: 756211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_HEVCMainTierLevel61; 756311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 756411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_6_1: 756511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_HEVCHighTierLevel61; 756611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 756711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_6_2: 756811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_HEVCMainTierLevel62; 756911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 757011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 757111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_HEVCLevelMax; 757211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 757311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 757411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 757511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 757611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 757711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return status; 757811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 757911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 758011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_validate_profile_level(OMX_U32 *eProfile, OMX_U32 *eLevel) 758111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 7582fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel OMX_U32 new_level = 0; 758311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned const int *profile_tbl = NULL; 758411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 mb_per_frame, mb_per_sec; 758511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool profile_level_found = false; 758611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 758711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (vqzip_sei_info.enabled) { 758811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("VQZIP is enabled. Profile and Level set by client. Skipping validation"); 758911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 759011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 759111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 759211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Init profile table for respective codec"); 759311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 759411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel //validate the ht,width,fps,bitrate and set the appropriate profile and level 759511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) { 759611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (*eProfile == 0) { 759711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_profile_set) { 759811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_MPEG4ProfileSimple; 759911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 760011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (codec_profile.profile) { 760111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE: 760211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple; 760311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 760411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE: 760511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_MPEG4ProfileSimple; 760611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 760711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 760811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("%s(): Unknown Error", __func__); 760911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 761011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 761111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 761211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 761311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 761411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (*eLevel == 0 && !m_level_set) { 761511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_MPEG4LevelMax; 761611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 761711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 761811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (*eProfile == OMX_VIDEO_MPEG4ProfileSimple) { 761911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profile_tbl = (unsigned int const *)mpeg4_profile_level_table; 762011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (*eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple) { 762111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profile_tbl = (unsigned int const *) 762211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (&mpeg4_profile_level_table[MPEG4_ASP_START]); 762311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 762411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Unsupported MPEG4 profile type %u", (unsigned int)*eProfile); 762511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 762611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 762711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) { 762811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (*eProfile == 0) { 762911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_profile_set) { 763011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_AVCProfileBaseline; 763111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 763211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (codec_profile.profile) { 763311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE: 763411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_AVCProfileBaseline; 763511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 763611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE: 763711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = QOMX_VIDEO_AVCProfileConstrainedBaseline; 763811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 763911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_HIGH: 764011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = QOMX_VIDEO_AVCProfileConstrainedHigh; 764111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 764211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN: 764311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_AVCProfileMain; 764411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 764511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED: 764611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_AVCProfileExtended; 764711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 764811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH: 764911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_AVCProfileHigh; 765011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 765111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10: 765211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_AVCProfileHigh10; 765311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 765411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422: 765511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_AVCProfileHigh422; 765611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 765711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE: 765811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_AVCProfileHigh444; 765911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 766011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 766111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("%s(): Unknown Error", __func__); 766211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 766311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 766411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 766511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 766611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 766711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (*eLevel == 0 && !m_level_set) { 766811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_AVCLevelMax; 766911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 767011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 7671fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel profile_tbl = (unsigned int const *)h264_profile_level_table; 7672fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if ((*eProfile != OMX_VIDEO_AVCProfileBaseline) && 7673fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel (*eProfile != QOMX_VIDEO_AVCProfileConstrainedBaseline) && 7674fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel (*eProfile != OMX_VIDEO_AVCProfileHigh) && 7675fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel (*eProfile != QOMX_VIDEO_AVCProfileConstrainedHigh) && 7676fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel (*eProfile != OMX_VIDEO_AVCProfileMain)) { 767711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Unsupported AVC profile type %u", (unsigned int)*eProfile); 767811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 767911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 768011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263) { 768111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (*eProfile == 0) { 768211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_profile_set) { 768311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_H263ProfileBaseline; 768411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 768511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (codec_profile.profile) { 768611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case VEN_PROFILE_H263_BASELINE: 768711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_H263ProfileBaseline; 768811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 768911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 769011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("%s(): Unknown Error", __func__); 769111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 769211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 769311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 769411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 769511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 769611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (*eLevel == 0 && !m_level_set) { 769711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_H263LevelMax; 769811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 769911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 770011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (*eProfile == OMX_VIDEO_H263ProfileBaseline) { 770111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profile_tbl = (unsigned int const *)h263_profile_level_table; 770211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 770311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Unsupported H.263 profile type %u", (unsigned int)*eProfile); 770411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 770511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 770611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8) { 770711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (*eProfile == 0) { 770811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_VP8ProfileMain; 770911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 771011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (codec_profile.profile) { 771111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_VP8_UNUSED: 771211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_VP8ProfileMain; 771311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 771411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 771511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("%s(): Unknown VP8 profile", __func__); 771611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 771711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 771811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 771911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (*eLevel == 0) { 772011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (profile_level.level) { 772111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_0: 772211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_VP8Level_Version0; 772311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 772411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_1: 772511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_VP8Level_Version1; 772611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 772711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 772811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("%s(): Unknown VP8 level", __func__); 772911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 773011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 773111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 773211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 773311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_HEVC) { 773411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (*eProfile == 0) { 773511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!m_profile_set) { 773611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_HEVCProfileMain; 773711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 773811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel switch (codec_profile.profile) { 773911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_HEVC_PROFILE_MAIN: 774011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_HEVCProfileMain; 774111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 774211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel case V4L2_MPEG_VIDC_VIDEO_HEVC_PROFILE_MAIN10: 774311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eProfile = OMX_VIDEO_HEVCProfileMain10; 774411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 774511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel default: 774611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("%s(): Unknown Error", __func__); 774711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 774811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 774911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 775011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 775111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 775211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (*eLevel == 0 && !m_level_set) { 775311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = OMX_VIDEO_HEVCLevelMax; 775411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 775511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 7756fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel profile_tbl = (unsigned int const *)hevc_profile_level_table; 7757fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel if ((*eProfile != OMX_VIDEO_HEVCProfileMain) && 7758fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel (*eProfile != OMX_VIDEO_HEVCProfileMain10)) { 775911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Unsupported HEVC profile type %u", (unsigned int)*eProfile); 776011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 776111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 776211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 776311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid codec type"); 776411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 776511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 776611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 776711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mb_per_frame = ((m_sVenc_cfg.dvs_height + 15) >> 4)* 776811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((m_sVenc_cfg.dvs_width + 15)>> 4); 776911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 777011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((mb_per_frame >= 3600) && (m_sVenc_cfg.codectype == (unsigned long) V4L2_PIX_FMT_MPEG4)) { 777111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (codec_profile.profile == (unsigned long) V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE) 777211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profile_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5; 777311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 777411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (codec_profile.profile == (unsigned long) V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE) 777511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profile_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5; 777611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 777711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel { 777811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel new_level = profile_level.level; 777911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 778011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 778111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 778211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 778311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (rate_ctrl.rcmode == V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_OFF) { 778411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = rc_off_level; //No level calculation for RC_OFF 778511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profile_level_found = true; 778611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 778711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 778811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 778911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mb_per_sec = mb_per_frame * m_sVenc_cfg.fps_num / m_sVenc_cfg.fps_den; 779011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 779111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool h264, ltr, hlayers; 779211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned int hybridp = 0, maxDpb = profile_tbl[5] / mb_per_frame; 779311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel h264 = m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264; 779411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ltr = ltrinfo.enabled && ((ltrinfo.count + 2) <= MIN((unsigned int) (profile_tbl[5] / mb_per_frame), MAXDPB)); 779511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel hlayers = hier_layers.numlayers && hier_layers.hier_mode == HIER_P && 779611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ((intra_period.num_bframes + ltrinfo.count + hier_layers.numlayers + 1) <= (unsigned int) (profile_tbl[5] / profile_tbl[0])); 779711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 779811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel /* Hybrid HP reference buffers: 779911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel layers = 1, 2 need 1 reference buffer 780011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel layers = 3, 4 need 2 reference buffers 780111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel layers = 5, 6 need 3 reference buffers 780211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 780311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 780411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if(hier_layers.hier_mode == HIER_P_HYBRID) 780511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel hybridp = MIN(MAX(maxDpb, ((hier_layers.numlayers + 1) / 2)), 16); 780611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 780711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel do { 780811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (mb_per_frame <= (unsigned int)profile_tbl[0]) { 780911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (mb_per_sec <= (unsigned int)profile_tbl[1]) { 781011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (m_sVenc_cfg.targetbitrate <= (unsigned int)profile_tbl[2]) { 781111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (h264 && (ltr || hlayers || hybridp)) { 781211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel // Update profile and level to adapt to the LTR and Hier-p/Hybrid-HP settings 781311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel new_level = (int)profile_tbl[3]; 781411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profile_level_found = true; 781511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("Appropriate profile/level for LTR count: %u OR Hier-p: %u is %u/%u, maxDPB: %u", 7816fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel ltrinfo.count, hier_layers.numlayers, (int)*eProfile, (int)new_level, 781711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel MIN((unsigned int) (profile_tbl[5] / mb_per_frame), MAXDPB)); 781811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 781911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 782011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel new_level = (int)profile_tbl[3]; 782111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profile_level_found = true; 7822fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel DEBUG_PRINT_LOW("Appropriate profile/level found %u/%u", (int) *eProfile, (int) new_level); 782311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel break; 782411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 782511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 782611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 782711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 782811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel profile_tbl = profile_tbl + MAX_PROFILE_PARAMS; 782911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } while (profile_tbl[0] != 0); 783011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 783111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (profile_level_found != true) { 783211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("ERROR: Unsupported profile/level"); 783311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 783411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 783511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 783611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((*eLevel == OMX_VIDEO_MPEG4LevelMax) || (*eLevel == OMX_VIDEO_AVCLevelMax) 783711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel || (*eLevel == OMX_VIDEO_H263LevelMax) || (*eLevel == OMX_VIDEO_VP8ProfileMax) 783811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel || (*eLevel == OMX_VIDEO_HEVCLevelMax)) { 783911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *eLevel = new_level; 784011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 784111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 784211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("%s: Returning with eProfile = %u" 784311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "Level = %u", __func__, (unsigned int)*eProfile, (unsigned int)*eLevel); 784411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 784511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 784611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 784711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ICS_ 784811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_meta_mode(bool mode) 784911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 785011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel metadatamode = mode; 785111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 785211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 785311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 785411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 785511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_is_video_session_supported(unsigned long width, 785611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long height) 785711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 785811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if ((width * height < capability.min_width * capability.min_height) || 785911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (width * height > capability.max_width * capability.max_height)) { 786011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR( 786111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel "Unsupported video resolution WxH = (%lu)x(%lu) supported range = min (%d)x(%d) - max (%d)x(%d)", 786211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel width, height, capability.min_width, capability.min_height, 786311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel capability.max_width, capability.max_height); 786411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 786511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 786611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 786711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_LOW("video session supported"); 786811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 786911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 787011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 787111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_batch_size(OMX_U32 batchSize) 787211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 787311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel struct v4l2_control control; 787411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int ret; 787511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 787611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.id = V4L2_CID_VIDC_QBUF_MODE; 787711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel control.value = batchSize ? V4L2_VIDC_QBUF_BATCHED : V4L2_VIDC_QBUF_STANDARD; 787811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 787911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel ret = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control); 788011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (ret) { 788111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to set batching mode: %d", ret); 788211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return false; 788311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 788411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 788511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mBatchSize = batchSize; 788611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Using batch size of %d", mBatchSize); 788711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return true; 788811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 788911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 789011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvenc_dev::BatchInfo::BatchInfo() 789111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel : mNumPending(0) { 789211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_init(&mLock, NULL); 789311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (int i = 0; i < kMaxBufs; ++i) { 789411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mBufMap[i] = kBufIDFree; 789511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 789611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 789711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 789811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint venc_dev::BatchInfo::registerBuffer(int bufferId) { 789911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&mLock); 790011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int availId = 0; 790111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for( ; availId < kMaxBufs && mBufMap[availId] != kBufIDFree; ++availId); 790211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (availId >= kMaxBufs) { 790311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Failed to find free entry !"); 790411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&mLock); 790511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return -1; 790611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 790711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mBufMap[availId] = bufferId; 790811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mNumPending++; 790911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&mLock); 791011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return availId; 791111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 791211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 791311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint venc_dev::BatchInfo::retrieveBufferAt(int v4l2Id) { 791411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&mLock); 791511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (v4l2Id >= kMaxBufs || v4l2Id < 0) { 791611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Batch: invalid index %d", v4l2Id); 791711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&mLock); 791811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return -1; 791911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 792011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (mBufMap[v4l2Id] == kBufIDFree) { 792111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Batch: buffer @ %d was not registered !", v4l2Id); 792211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&mLock); 792311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return -1; 792411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 792511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int bufferId = mBufMap[v4l2Id]; 792611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mBufMap[v4l2Id] = kBufIDFree; 792711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mNumPending--; 792811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&mLock); 792911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return bufferId; 793011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 793111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 793211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::BatchInfo::isPending(int bufferId) { 793311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&mLock); 793411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel int existsId = 0; 793511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for(; existsId < kMaxBufs && mBufMap[existsId] != bufferId; ++existsId); 793611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&mLock); 793711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return existsId < kMaxBufs; 793811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 793911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 794011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _VQZIP_ 794111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvenc_dev::venc_dev_vqzip::venc_dev_vqzip() 794211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 794311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mLibHandle = NULL; 794411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_init(&lock, NULL); 794511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 794611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 794711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_dev_vqzip::init() 794811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 794911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel bool status = true; 795011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (mLibHandle) { 795111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("VQZIP init called twice"); 795211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 795311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 795411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (status) { 795511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mLibHandle = dlopen("libvqzip.so", RTLD_NOW); 795611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (mLibHandle) { 795711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mVQZIPInit = (vqzip_init_t) 795811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dlsym(mLibHandle,"VQZipInit"); 795911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mVQZIPDeInit = (vqzip_deinit_t) 796011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dlsym(mLibHandle,"VQZipDeInit"); 796111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mVQZIPComputeStats = (vqzip_compute_stats_t) 796211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dlsym(mLibHandle,"VQZipComputeStats"); 796311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!mVQZIPInit || !mVQZIPDeInit || !mVQZIPComputeStats) 796411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 796511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else { 796611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("FATAL ERROR: could not dlopen libvqzip.so: %s", dlerror()); 796711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel status = false; 796811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 796911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (status) { 797011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mVQZIPHandle = mVQZIPInit(); 797111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 797211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 797311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!status && mLibHandle) { 797411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dlclose(mLibHandle); 797511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mLibHandle = NULL; 797611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mVQZIPHandle = NULL; 797711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mVQZIPInit = NULL; 797811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mVQZIPDeInit = NULL; 797911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mVQZIPComputeStats = NULL; 798011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 798111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return status; 798211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 798311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 798411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint venc_dev::venc_dev_vqzip::fill_stats_data(void* pBuf, void* extraData) 798511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 798611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VQZipStatus result; 798711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel VQZipStats *pStats = (VQZipStats *)extraData; 798811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pConfig.pSEIPayload = NULL; 798911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel unsigned long size; 799011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 799111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!pBuf || !pStats || !mVQZIPHandle) { 799211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_ERROR("Invalid data passed to stats function"); 799311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 799411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel result = mVQZIPComputeStats(mVQZIPHandle, (void* )pBuf, &pConfig, pStats); 799511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return result; 799611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 799711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 799811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid venc_dev::venc_dev_vqzip::deinit() 799911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 800011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (mLibHandle) { 800111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_lock(&lock); 800211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dlclose(mLibHandle); 800311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mVQZIPDeInit(mVQZIPHandle); 800411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mLibHandle = NULL; 800511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mVQZIPHandle = NULL; 800611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mVQZIPInit = NULL; 800711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mVQZIPDeInit = NULL; 800811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mVQZIPComputeStats = NULL; 800911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_unlock(&lock); 801011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 801111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 801211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 801311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvenc_dev::venc_dev_vqzip::~venc_dev_vqzip() 801411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{ 801511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel DEBUG_PRINT_HIGH("Destroy C2D instance"); 801611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (mLibHandle) { 801711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dlclose(mLibHandle); 801811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 801911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mLibHandle = NULL; 802011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel pthread_mutex_destroy(&lock); 802111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 802211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif 8023fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8024fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#ifdef _PQ_ 8025b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudelbool venc_dev::venc_check_for_pq(void) 8026fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel{ 8027fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel bool rc_mode_supported = false; 8028fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel bool codec_supported = false; 8029fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel bool resolution_supported = false; 8030fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel bool frame_rate_supported = false; 8031fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel bool yuv_format_supported = false; 8032fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel bool is_non_secure_session = false; 8033fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel bool is_pq_handle_valid = false; 8034fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel bool is_non_vpe_session = false; 8035fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel bool enable = false; 8036fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8037fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel codec_supported = m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264; 8038fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8039d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel rc_mode_supported = (rate_ctrl.rcmode == V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_VBR_CFR) || 8040d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel (rate_ctrl.rcmode == V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_MBR_CFR) || 8041d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel (rate_ctrl.rcmode == V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_MBR_VFR); 8042fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8043fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel resolution_supported = m_sVenc_cfg.input_height * m_sVenc_cfg.input_width <= 8044fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_pq.caps.max_width * m_pq.caps.max_height; 8045fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8046fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel frame_rate_supported = 8047fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel (m_sVenc_cfg.fps_num / m_sVenc_cfg.fps_den) <= 8048fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel (m_pq.caps.max_mb_per_sec / ((m_sVenc_cfg.input_height * m_sVenc_cfg.input_width) / 256)); 8049fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 80508a262e157e0983fee79cc1b58d3c8abc2a18e380Thierry Strudel frame_rate_supported = (((operating_rate >> 16) > 0) && ((operating_rate >> 16) < 5)) ? false : frame_rate_supported; 80518a262e157e0983fee79cc1b58d3c8abc2a18e380Thierry Strudel 8052fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel yuv_format_supported = ((m_sVenc_cfg.inputformat == V4L2_PIX_FMT_NV12 && (m_pq.caps.color_formats & BIT(COLOR_FMT_NV12))) 8053fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel || (m_sVenc_cfg.inputformat == V4L2_PIX_FMT_NV21 && (m_pq.caps.color_formats & BIT(COLOR_FMT_NV21))) 8054fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel || (m_sVenc_cfg.inputformat == V4L2_PIX_FMT_NV12_UBWC && (m_pq.caps.color_formats & BIT(COLOR_FMT_NV12_UBWC)))); 8055fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8056fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel yuv_format_supported |= m_pq.is_YUV_format_uncertain; // When YUV format is uncertain, Let this condition pass 8057fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8058fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel is_non_secure_session = !venc_handle->is_secure_session(); 8059fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8060fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel is_non_vpe_session = (m_sVenc_cfg.input_height == m_sVenc_cfg.dvs_height && m_sVenc_cfg.input_width == m_sVenc_cfg.dvs_width); 8061fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8062fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel is_pq_handle_valid = m_pq.is_pq_handle_valid(); 8063fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8064fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel /* Add future PQ conditions here */ 8065fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8066fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel enable = (!m_pq.is_pq_force_disable && 8067fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel codec_supported && 8068fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel rc_mode_supported && 8069fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel resolution_supported && 8070fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel frame_rate_supported && 8071fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel yuv_format_supported && 8072fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel is_non_secure_session && 8073fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel is_non_vpe_session && 8074fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel is_pq_handle_valid); 8075fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8076fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("PQ Condition : Force disable = %d Codec = %d, RC = %d, RES = %d, FPS = %d, YUV = %d, Non - Secure = %d, PQ lib = %d Non - VPE = %d PQ enable = %d", 8077fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel m_pq.is_pq_force_disable, codec_supported, rc_mode_supported, resolution_supported, frame_rate_supported, yuv_format_supported, 8078fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel is_non_secure_session, is_pq_handle_valid, is_non_vpe_session, enable); 8079fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8080fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel m_pq.is_pq_enabled = enable; 8081fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8082b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel return enable; 8083b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel} 8084b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel 8085b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudelvoid venc_dev::venc_configure_pq() 8086b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel{ 8087b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel venc_set_extradata(OMX_ExtraDataEncoderOverrideQPInfo, (OMX_BOOL)true); 8088b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel extradata |= true; 8089b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel m_pq.configure(m_sVenc_cfg.input_width, m_sVenc_cfg.input_height); 8090fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return; 8091fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel} 8092fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8093b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudelvoid venc_dev::venc_try_enable_pq(void) 8094b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel{ 8095b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel if(venc_check_for_pq()) { 8096b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel venc_configure_pq(); 8097b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel } 8098b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel} 8099b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel 8100fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelvenc_dev::venc_dev_pq::venc_dev_pq() 8101fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel{ 8102fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mLibHandle = NULL; 8103fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQHandle = NULL; 8104fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQInit = NULL; 8105fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQDeInit = NULL; 8106fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQGetCaps = NULL; 8107fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQConfigure = NULL; 8108fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQComputeStats = NULL; 8109fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel configured_format = 0; 8110fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel is_pq_force_disable = 0; 8111fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel pthread_mutex_init(&lock, NULL); 81122e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel memset(&pConfig, 0, sizeof(gpu_stats_lib_input_config)); 81132e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel memset(&roi_extradata_info, 0, sizeof(extradata_buffer_info)); 81142e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel roi_extradata_info.size = 16 * 1024; // Max size considering 4k 81152e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel roi_extradata_info.buffer_size = 16 * 1024; // Max size considering 4k 81162e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel roi_extradata_info.port_index = OUTPUT_PORT; 8117fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel} 8118fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8119fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelbool venc_dev::venc_dev_pq::init(unsigned long format) 8120fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel{ 8121fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel bool status = true; 8122fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel enum color_compression_format yuv_format; 8123fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8124fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (mLibHandle) { 8125fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("PQ init called twice"); 8126fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel status = false; 8127fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 8128fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8129fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel switch (format) { 8130fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_NV12: 8131fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_NV21: 8132fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel yuv_format = color_compression_format::LINEAR_NV12; 8133fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 8134fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_NV12_UBWC: 8135fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel default: 8136fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel yuv_format = color_compression_format::UBWC_NV12; 8137fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 8138fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 8139fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8140b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel ATRACE_BEGIN("PQ init"); 8141fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (status) { 8142fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mLibHandle = dlopen(YUV_STATS_LIBRARY_NAME, RTLD_NOW); 8143fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (mLibHandle) { 8144fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQInit = (gpu_stats_lib_init_t) 8145fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel dlsym(mLibHandle,"gpu_stats_lib_init"); 8146fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQDeInit = (gpu_stats_lib_deinit_t) 8147fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel dlsym(mLibHandle,"gpu_stats_lib_deinit"); 8148fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQGetCaps = (gpu_stats_lib_get_caps_t) 8149fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel dlsym(mLibHandle,"gpu_stats_lib_get_caps"); 8150fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQConfigure = (gpu_stats_lib_configure_t) 8151fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel dlsym(mLibHandle,"gpu_stats_lib_configure"); 8152fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQComputeStats = (gpu_stats_lib_fill_data_t) 8153fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel dlsym(mLibHandle,"gpu_stats_lib_fill_data"); 8154fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (!mPQInit || !mPQDeInit || !mPQGetCaps || !mPQConfigure || !mPQComputeStats) 8155fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel status = false; 8156fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else { 8157fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("FATAL ERROR: could not dlopen %s: %s", YUV_STATS_LIBRARY_NAME, dlerror()); 8158fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel status = false; 8159fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 8160fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (status) { 8161fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQInit(&mPQHandle, perf_hint::NORMAL, yuv_format); 8162fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (mPQHandle == NULL) { 8163fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_ERROR("Failed to get handle for PQ Library"); 8164fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel status = false; 8165fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else { 8166fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("GPU PQ lib initialized successfully"); 8167fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 8168fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8169fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 8170fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 8171b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel ATRACE_END(); 8172fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8173fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (!status && mLibHandle) { 8174fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (mLibHandle) 8175fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel dlclose(mLibHandle); 8176fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mLibHandle = NULL; 8177fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQHandle = NULL; 8178fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQInit = NULL; 8179fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQDeInit = NULL; 8180fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQGetCaps = NULL; 8181fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQConfigure = NULL; 8182fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQComputeStats = NULL; 8183fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 8184fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel is_YUV_format_uncertain = false; 8185fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel configured_format = format; 8186fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8187fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return status; 8188fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel} 8189fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8190fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelvoid venc_dev::venc_dev_pq::deinit() 8191fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel{ 8192fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (mLibHandle) { 8193fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQDeInit(mPQHandle); 8194fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel dlclose(mLibHandle); 8195fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQHandle = NULL; 8196fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mLibHandle = NULL; 8197fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQInit = NULL; 8198fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQDeInit = NULL; 8199fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQGetCaps = NULL; 8200fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQConfigure = NULL; 8201fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQComputeStats = NULL; 8202fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel configured_format = 0; 8203fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 8204fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel} 8205fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8206fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelbool venc_dev::venc_dev_pq::reinit(unsigned long format) 8207fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel{ 8208fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel bool status = false; 8209fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 821069b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel if ((configured_format != format) && (is_color_format_supported(format))) { 8211fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("New format (%lu) is different from configure format (%lu);" 8212fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel " reinitializing PQ lib", format, configured_format); 8213fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel deinit(); 821469b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel status = init(format); 8215fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else { 8216fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel // ignore if new format is same as configured 8217fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 8218fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8219fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return status; 8220fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel} 8221fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8222fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelvoid venc_dev::venc_dev_pq::get_caps() 8223fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel{ 8224fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel memset(&caps, 0, sizeof(gpu_stats_lib_caps_t)); 8225fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (mPQHandle) 8226fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQGetCaps(mPQHandle, &caps); 8227fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("GPU lib stats caps max (w,h) = (%u, %u)",caps.max_width, caps.max_height); 8228fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("GPU lib stats caps max mb per sec = %u",caps.max_mb_per_sec); 8229fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("GPU lib stats caps color_format = %u",caps.color_formats); 8230fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel} 8231fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8232fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelbool venc_dev::venc_dev_pq::is_color_format_supported(unsigned long format) 8233fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel{ 8234fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel bool support = false; 8235fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel int color_format = -1; 8236fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8237fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel switch (format) { 8238fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_NV12: 8239fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel color_format = COLOR_FMT_NV12; 8240fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 8241fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_NV21: 8242fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel color_format = COLOR_FMT_NV21; 8243fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 8244fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_NV12_UBWC: 8245fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel color_format = COLOR_FMT_NV12_UBWC; 8246fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 8247fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_RGB32: 8248fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel color_format = COLOR_FMT_RGBA8888; 8249fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 8250fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel case V4L2_PIX_FMT_RGBA8888_UBWC: 8251fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel color_format = COLOR_FMT_RGBA8888_UBWC; 8252fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 8253fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel default: 8254fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel color_format = -1; 8255fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel break; 8256fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 8257fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8258fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (color_format >= 0) { 8259fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel support = (caps.color_formats & BIT(color_format)) ? true : false; 8260fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 8261fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8262fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (support == true) 8263fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("GPU lib supports this format %lu",format); 8264fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel else 8265fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("GPU lib doesn't support this format %lu",format); 8266fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8267fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return support; 8268fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel} 8269fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8270b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudelint venc_dev::venc_dev_pq::configure(unsigned long width, unsigned long height) 8271fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel{ 8272fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (mPQHandle) { 8273b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel pConfig.algo = ADAPTIVE_QP; 8274b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel pConfig.height = height; 8275b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel pConfig.width = width; 8276b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel pConfig.mb_height = 16; 8277b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel pConfig.mb_width = 16; 8278b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel pConfig.a_qp.pq_enabled = true; 8279b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel pConfig.stride = VENUS_Y_STRIDE(COLOR_FMT_NV12, pConfig.width); 8280fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel pConfig.a_qp.gain = 1.0397; 8281fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel pConfig.a_qp.offset = 14.427; 8282fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (pConfig.a_qp.roi_enabled) { 8283fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel pConfig.a_qp.minDeltaQPlimit = -16; 8284fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel pConfig.a_qp.maxDeltaQPlimit = 15; 8285fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else { 8286fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel pConfig.a_qp.minDeltaQPlimit = -6; 8287fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel pConfig.a_qp.maxDeltaQPlimit = 9; 8288fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 8289fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return mPQConfigure(mPQHandle, &pConfig); 8290fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 8291fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return -EINVAL; 8292fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel} 8293fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8294fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelbool venc_dev::venc_dev_pq::is_pq_handle_valid() 8295fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel{ 8296fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return ((mPQHandle) ? true : false); 8297fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel} 8298fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8299fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelint venc_dev::venc_dev_pq::fill_pq_stats(struct v4l2_buffer buf, 8300fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel unsigned int data_offset) 8301fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel{ 8302fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel gpu_stats_lib_buffer_params_t input, output; 8303fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel gpu_stats_lib_buffer_params_t roi_input; 8304fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8305fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (!mPQHandle || !is_pq_enabled) { 8306fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("Invalid Usage : Handle = %p PQ = %d", 8307fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQHandle, is_pq_enabled); 8308fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return 0; 8309fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 8310b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel ATRACE_BEGIN("PQ Compute Stats"); 8311fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel input.fd = buf.m.planes[0].reserved[0]; 8312fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel input.data_offset = buf.m.planes[0].data_offset; 8313fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel input.alloc_len = buf.m.planes[0].length; 8314fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel input.filled_len = buf.m.planes[0].bytesused; 8315fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8316fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel output.fd = buf.m.planes[1].reserved[0]; 8317fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel output.data_offset = buf.m.planes[1].reserved[1]; // This is current Extradata buffer 8318fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel output.data_offset += data_offset; // Offset to start in current buffer 8319fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel output.alloc_len = buf.m.planes[1].reserved[2]; 8320fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel output.filled_len = buf.m.planes[1].bytesused; 8321fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8322fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("Input fd = %d, data_offset = %d", input.fd, input.data_offset); 8323fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("Final Output fd = %d, data_offset = %d", output.fd, output.data_offset); 8324fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8325fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (pConfig.a_qp.roi_enabled) { 8326fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel roi_input.fd = roi_extradata_info.ion.fd_ion_data.fd; 8327fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel roi_input.data_offset = 0; 8328fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel roi_input.alloc_len = roi_extradata_info.size; 8329fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel roi_input.filled_len = 0; 8330fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("ROI fd = %d, offset = %d Length = %d", roi_input.fd, roi_input.data_offset, roi_input.alloc_len); 8331fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQComputeStats(mPQHandle, &input, &roi_input, &output, NULL, NULL); 8332fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel memset(roi_extradata_info.uaddr, 0, roi_extradata_info.size); 8333fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } else { 8334fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("Output fd = %d, data_offset = %d", output.fd, output.data_offset); 8335fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQComputeStats(mPQHandle, &input, NULL, &output, NULL, NULL); 8336fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 8337b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel ATRACE_END(); 8338fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel DEBUG_PRINT_HIGH("PQ data length = %d", output.filled_len); 8339fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel return output.filled_len; 8340fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel} 8341fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel 8342fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelvenc_dev::venc_dev_pq::~venc_dev_pq() 8343fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel{ 8344fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel if (mLibHandle) { 8345fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQDeInit(mPQHandle); 8346fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel dlclose(mLibHandle); 8347fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel } 8348fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mLibHandle = NULL; 8349fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQHandle = NULL; 8350fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQInit = NULL; 8351fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQDeInit = NULL; 8352fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQGetCaps = NULL; 8353fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQConfigure = NULL; 8354fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel mPQComputeStats = NULL; 8355fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel pthread_mutex_destroy(&lock); 8356fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel} 8357fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#endif // _PQ_ 8358