1 /*-------------------------------------------------------------------------- 2 Copyright (c) 2014-2019, The Linux Foundation. All rights reserved. 3 4 Redistribution and use in source and binary forms, with or without 5 modification, are permitted provided that the following conditions are 6 met: 7 * Redistributions of source code must retain the above copyright 8 notice, this list of conditions and the following disclaimer. 9 * Redistributions in binary form must reproduce the above 10 copyright notice, this list of conditions and the following 11 disclaimer in the documentation and/or other materials provided 12 with the distribution. 13 * Neither the name of The Linux Foundation nor the names of its 14 contributors may be used to endorse or promote products derived 15 from this software without specific prior written permission. 16 17 THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 18 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 20 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 21 BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24 BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26 OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27 IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 --------------------------------------------------------------------------*/ 29 #ifndef __OMX_VENC__H 30 #define __OMX_VENC__H 31 32 #define VEN_EXTRADATA_SLICEINFO 0x100 33 #define VEN_EXTRADATA_MBINFO 0x400 34 35 #include <unistd.h> 36 #include "omx_video_base.h" 37 #include "video_encoder_device_v4l2.h" 38 39 #include "swvenc_api.h" 40 #include "swvenc_types.h" 41 42 #include <ui/GraphicBuffer.h> 43 #include <media/msm_media_info.h> 44 45 extern "C" { 46 OMX_API void * get_omx_component_factory_fn(void); 47 } 48 49 struct swvenc_video_capability { 50 unsigned int min_width; 51 unsigned int max_width; 52 unsigned int min_height; 53 unsigned int max_height; 54 }; 55 56 57 class omx_venc: public omx_video 58 { 59 public: 60 omx_venc(); 61 ~omx_venc(); 62 OMX_ERRORTYPE component_init(OMX_STRING role); 63 OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE hComp, 64 OMX_INDEXTYPE paramIndex, 65 OMX_PTR paramData); 66 OMX_ERRORTYPE set_config(OMX_HANDLETYPE hComp, 67 OMX_INDEXTYPE configIndex, 68 OMX_PTR configData); 69 OMX_ERRORTYPE component_deinit(OMX_HANDLETYPE hComp); 70 bool is_secure_session(); 71 //OMX strucutres 72 OMX_U32 m_nVenc_format; 73 74 SWVENC_HANDLE m_hSwVenc; 75 SWVENC_CODEC m_codec; 76 swvenc_video_capability m_capability; 77 bool m_stopped; 78 bool set_format; 79 bool update_offset; 80 int dev_handle_output_extradata(void *, int); 81 int dev_handle_input_extradata(void *, int, int); 82 bool dev_buffer_ready_to_queue(OMX_BUFFERHEADERTYPE *buffer); 83 bool dev_get_dimensions(OMX_U32 ,OMX_U32 *,OMX_U32 *); 84 void dev_set_extradata_cookie(void *); 85 int dev_set_format(int); 86 87 static SWVENC_STATUS swvenc_empty_buffer_done_cb 88 ( 89 SWVENC_HANDLE swvenc, 90 SWVENC_IPBUFFER *p_ipbuffer, 91 void *p_client 92 ); 93 SWVENC_STATUS swvenc_empty_buffer_done 94 ( 95 SWVENC_IPBUFFER *p_ipbuffer 96 ); 97 static SWVENC_STATUS swvenc_fill_buffer_done_cb 98 ( 99 SWVENC_HANDLE swvenc, 100 SWVENC_OPBUFFER *p_opbuffer, 101 void *p_client 102 ); 103 static SWVENC_STATUS swvenc_handle_event_cb 104 ( 105 SWVENC_HANDLE swvenc, 106 SWVENC_EVENT event, 107 void *p_client 108 ); 109 110 static void init_sw_vendor_extensions(VendorExtensionStore &store); 111 112 private: 113 venc_debug_cap m_debug; 114 bool m_bSeqHdrRequested; 115 116 bool m_bDimensionsNeedFlip; 117 bool m_bIsRotationSupported; 118 bool m_bIsInFrameSizeSet; 119 bool m_bIsOutFrameSizeSet; 120 bool m_bIsInFlipDone; 121 bool m_bIsOutFlipDone; 122 bool m_bUseAVTimerTimestamps; 123 bool m_bIsIntraperiodSet; 124 sp<GraphicBuffer> dstBuffer; 125 SWVENC_IPBUFFER *m_pIpbuffers; 126 127 enum color_format 128 { 129 COLOR_FMT_NV12, 130 COLOR_FMT_NV21, 131 COLOR_FMT_NV12_ZSL, 132 }; 133 OMX_U32 dev_stop(void); 134 OMX_U32 dev_pause(void); 135 OMX_U32 dev_start(void); 136 OMX_U32 dev_flush(unsigned); 137 OMX_U32 dev_resume(void); 138 OMX_U32 dev_start_done(void); 139 OMX_U32 dev_set_message_thread_id(pthread_t); 140 bool dev_use_buf( unsigned); 141 bool dev_handle_empty_eos_buffer(void); 142 bool dev_free_buf( void *,unsigned); 143 bool dev_empty_buf(void *, void *,unsigned,unsigned); 144 bool dev_fill_buf(void *, void *,unsigned,unsigned); 145 bool dev_get_buf_req(OMX_U32 *,OMX_U32 *,OMX_U32 *,OMX_U32); 146 bool is_streamon_done(OMX_U32 port); 147 bool dev_set_buf_req(OMX_U32 const *,OMX_U32 const *,OMX_U32 const *,OMX_U32); 148 bool dev_get_seq_hdr(void *, unsigned, unsigned *); 149 bool dev_loaded_start(void); 150 bool dev_loaded_stop(void); 151 bool dev_loaded_start_done(void); 152 bool dev_loaded_stop_done(void); 153 bool dev_get_capability_ltrcount(OMX_U32 *, OMX_U32 *, OMX_U32 *); 154 bool dev_get_vui_timing_info(OMX_U32 *); 155 bool dev_get_peak_bitrate(OMX_U32 *); 156 bool dev_get_batch_size(OMX_U32 *); dev_get_temporal_layer_caps(OMX_U32 *,OMX_U32 *,OMX_VIDEO_ANDROID_TEMPORALLAYERINGPATTERNTYPE *)157 bool dev_get_temporal_layer_caps(OMX_U32 * /*nMaxLayers*/, 158 OMX_U32 * /*nMaxBLayers*/, 159 OMX_VIDEO_ANDROID_TEMPORALLAYERINGPATTERNTYPE */*SupportedPattern*/) { 160 return false; 161 } 162 OMX_ERRORTYPE dev_get_supported_profile_level(OMX_VIDEO_PARAM_PROFILELEVELTYPE */*profileLevelType*/); 163 bool dev_get_supported_color_format(unsigned index, OMX_U32 *colorFormat); 164 bool dev_is_video_session_supported(OMX_U32 width, OMX_U32 height); 165 bool dev_color_align(OMX_BUFFERHEADERTYPE *buffer, OMX_U32 width, 166 OMX_U32 height); 167 bool dev_get_output_log_flag(); 168 int dev_output_log_buffers(const char *buffer_addr, int buffer_len, uint64_t timestamp); 169 int dev_extradata_log_buffers(char *buffer, int index, bool input); 170 bool swvenc_color_align(OMX_BUFFERHEADERTYPE *buffer, OMX_U32 width, 171 OMX_U32 height); 172 OMX_ERRORTYPE swvenc_do_flip_inport(); 173 OMX_ERRORTYPE swvenc_do_flip_outport(); 174 bool swvenc_do_rotate(int, SWVENC_IPBUFFER &, OMX_U32); 175 176 template<typename T> swvenc_delete_pointer(T * & ptr)177 inline void swvenc_delete_pointer(T * &ptr) { 178 if (ptr != nullptr) { 179 delete ptr; 180 ptr = nullptr; 181 } 182 } 183 184 SWVENC_STATUS swvenc_set_rc_mode(OMX_VIDEO_CONTROLRATETYPE eControlRate); 185 SWVENC_STATUS swvenc_set_profile_level(OMX_U32 eProfile,OMX_U32 eLevel); 186 SWVENC_STATUS swvenc_set_intra_refresh(OMX_VIDEO_PARAM_INTRAREFRESHTYPE *IntraRefresh); 187 SWVENC_STATUS swvenc_set_frame_rate(OMX_U32 nFrameRate); 188 SWVENC_STATUS swvenc_set_bit_rate(OMX_U32 nTargetBitrate); 189 SWVENC_STATUS swvenc_set_intra_period(OMX_U32 nPFrame,OMX_U32 nBFrame); 190 SWVENC_STATUS swvenc_set_color_format(OMX_COLOR_FORMATTYPE); 191 SWVENC_STATUS swvenc_get_buffer_req 192 ( 193 OMX_U32 *min_buff_count, 194 OMX_U32 *actual_buff_count, 195 OMX_U32 *buff_size, 196 OMX_U32 *buff_alignment, 197 OMX_U32 port 198 ); 199 int swvenc_input_log_buffers(const char *buffer, int bufferlen); 200 int swvenc_input_log_rotated_buffers(const char *buffer, int bufferlen); dev_get_hevc_profile(OMX_U32 *)201 bool dev_get_hevc_profile(OMX_U32*) { return false; } dev_handle_client_input_extradata(void *)202 bool dev_handle_client_input_extradata(void*) { return false; } dev_get_color_format_as_string(char *,int,unsigned)203 void dev_get_color_format_as_string(char *, int, unsigned) {}; 204 /* Only NV12 is supported so not setting UBWC & 10Bit flag */ dev_get_consumer_usage(OMX_U32 * usage)205 void dev_get_consumer_usage(OMX_U32* usage) { *usage = 0; } SWVENC_Y_STRIDE(int color_fmt,int width)206 static inline unsigned int SWVENC_Y_STRIDE(int color_fmt, int width) 207 { 208 unsigned int stride = 0; 209 if (!width) 210 goto invalid_input; 211 /*mapping the ZSL to NV12 color format for now 212 * remove the mapping once ZSL design is in place */ 213 if(color_fmt == COLOR_FMT_NV12_ZSL) 214 color_fmt = COLOR_FMT_NV12; 215 switch (color_fmt) 216 { 217 case COLOR_FMT_NV21: 218 stride = VENUS_Y_STRIDE(COLOR_FMT_NV21, width); 219 break; 220 case COLOR_FMT_NV12: 221 stride = VENUS_Y_STRIDE(COLOR_FMT_NV12, width); 222 break; 223 case COLOR_FMT_NV12_ZSL: 224 stride = VENUS_Y_STRIDE(COLOR_FMT_NV12_ZSL, width); 225 break; 226 default: 227 break; 228 } 229 invalid_input: 230 return stride; 231 } SWVENC_Y_SCANLINES(int color_fmt,int height)232 static inline unsigned int SWVENC_Y_SCANLINES(int color_fmt, int height) 233 { 234 unsigned int scanlines = 0; 235 if (!height) 236 goto invalid_input; 237 /*mapping the ZSL to NV12 color format for now 238 * remove the mapping once ZSL design is in place */ 239 if(color_fmt == COLOR_FMT_NV12_ZSL) 240 color_fmt = COLOR_FMT_NV12; 241 switch (color_fmt) 242 { 243 case COLOR_FMT_NV21: 244 scanlines = VENUS_Y_SCANLINES(COLOR_FMT_NV21, height); 245 break; 246 case COLOR_FMT_NV12: 247 scanlines = VENUS_Y_SCANLINES(COLOR_FMT_NV12, height); 248 break; 249 case COLOR_FMT_NV12_ZSL: 250 scanlines = VENUS_Y_SCANLINES(COLOR_FMT_NV12_ZSL, height); 251 break; 252 default: 253 return 0; 254 } 255 invalid_input: 256 return scanlines; 257 } SWVENC_UV_SCANLINES(int color_fmt,int height)258 static inline unsigned int SWVENC_UV_SCANLINES(int color_fmt, int height) 259 { 260 unsigned int uv_canlines = 0; 261 if (!height) 262 goto invalid_input; 263 /*mapping the ZSL to NV12 color format for now 264 * remove the mapping once ZSL design is in place */ 265 if(color_fmt == COLOR_FMT_NV12_ZSL) 266 color_fmt = COLOR_FMT_NV12; 267 switch (color_fmt) 268 { 269 case COLOR_FMT_NV21: 270 uv_canlines = VENUS_UV_SCANLINES(COLOR_FMT_NV21, height); 271 break; 272 case COLOR_FMT_NV12: 273 uv_canlines = VENUS_UV_SCANLINES(COLOR_FMT_NV12, height); 274 break; 275 case COLOR_FMT_NV12_ZSL: 276 uv_canlines = VENUS_UV_SCANLINES(COLOR_FMT_NV12_ZSL, height); 277 break; 278 default: 279 goto invalid_input; 280 } 281 invalid_input: 282 return uv_canlines; 283 } SWVENC_BUFFER_SIZE(int color_fmt,int width,int height)284 static inline unsigned int SWVENC_BUFFER_SIZE(int color_fmt, int width, int height) 285 { 286 unsigned int size = 0; 287 if (!width || !height) 288 goto invalid_input; 289 /*mapping the ZSL to NV12 color format for now 290 * remove the mapping once ZSL design is in place */ 291 if(color_fmt == COLOR_FMT_NV12_ZSL) 292 color_fmt = COLOR_FMT_NV12; 293 switch (color_fmt) 294 { 295 case COLOR_FMT_NV21: 296 size = VENUS_BUFFER_SIZE(COLOR_FMT_NV21, width, height); 297 break; 298 case COLOR_FMT_NV12: 299 size = VENUS_BUFFER_SIZE(COLOR_FMT_NV12, width, height); 300 break; 301 case COLOR_FMT_NV12_ZSL: 302 size = VENUS_BUFFER_SIZE(COLOR_FMT_NV12_ZSL, width, height); 303 break; 304 default: 305 break; 306 } 307 invalid_input: 308 return size; 309 } 310 311 }; 312 313 #endif //__OMX_VENC__H 314