1/*-------------------------------------------------------------------------- 2Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. 3 4Redistribution and use in source and binary forms, with or without 5modification, are permitted provided that the following conditions are 6met: 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 17THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 18WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 20ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 21BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28--------------------------------------------------------------------------*/ 29#ifndef __OMX_VENC_DEV__ 30#define __OMX_VENC_DEV__ 31 32#include "OMX_Types.h" 33#include "OMX_Core.h" 34#include "OMX_VideoExt.h" 35#include "OMX_QCOMExtns.h" 36#include "qc_omx_component.h" 37#ifdef _VQZIP_ 38#include "VQZip.h" 39#endif 40#include "omx_video_common.h" 41#include "omx_video_base.h" 42#include "omx_video_encoder.h" 43#include <linux/videodev2.h> 44#include <media/msm_vidc.h> 45#include <poll.h> 46 47#define TIMEOUT 5*60*1000 48#define BIT(num) (1 << (num)) 49#define MAX_HYB_HIERP_LAYERS 6 50#define MAX_V4L2_BUFS 64 //VB2_MAX_FRAME 51 52enum hier_type { 53 HIER_NONE = 0x0, 54 HIER_P = 0x1, 55 HIER_B = 0x2, 56 HIER_P_HYBRID = 0x3, 57}; 58 59struct msm_venc_switch { 60 unsigned char status; 61}; 62 63struct msm_venc_allocatorproperty { 64 unsigned long mincount; 65 unsigned long actualcount; 66 unsigned long datasize; 67 unsigned long suffixsize; 68 unsigned long alignment; 69 unsigned long bufpoolid; 70}; 71 72struct msm_venc_basecfg { 73 unsigned long input_width; 74 unsigned long input_height; 75 unsigned long dvs_width; 76 unsigned long dvs_height; 77 unsigned long codectype; 78 unsigned long fps_num; 79 unsigned long fps_den; 80 unsigned long targetbitrate; 81 unsigned long inputformat; 82}; 83 84struct msm_venc_profile { 85 unsigned long profile; 86}; 87struct msm_venc_profilelevel { 88 unsigned long level; 89}; 90 91struct msm_venc_sessionqp { 92 unsigned long iframeqp; 93 unsigned long pframeqp; 94 unsigned long bframeqp; 95}; 96 97struct msm_venc_initqp { 98 unsigned long iframeqp; 99 unsigned long pframeqp; 100 unsigned long bframeqp; 101 unsigned long enableinitqp; 102}; 103 104struct msm_venc_qprange { 105 unsigned long maxqp; 106 unsigned long minqp; 107}; 108struct msm_venc_intraperiod { 109 unsigned long num_pframes; 110 unsigned long num_bframes; 111}; 112struct msm_venc_seqheader { 113 unsigned char *hdrbufptr; 114 unsigned long bufsize; 115 unsigned long hdrlen; 116}; 117 118struct msm_venc_capability { 119 unsigned long codec_types; 120 unsigned long maxframe_width; 121 unsigned long maxframe_height; 122 unsigned long maxtarget_bitrate; 123 unsigned long maxframe_rate; 124 unsigned long input_formats; 125 unsigned char dvs; 126}; 127 128struct msm_venc_entropycfg { 129 unsigned longentropysel; 130 unsigned long cabacmodel; 131}; 132 133struct msm_venc_dbcfg { 134 unsigned long db_mode; 135 unsigned long slicealpha_offset; 136 unsigned long slicebeta_offset; 137}; 138 139struct msm_venc_intrarefresh { 140 unsigned long irmode; 141 unsigned long mbcount; 142}; 143 144struct msm_venc_multiclicecfg { 145 unsigned long mslice_mode; 146 unsigned long mslice_size; 147}; 148 149struct msm_venc_bufferflush { 150 unsigned long flush_mode; 151}; 152 153struct msm_venc_ratectrlcfg { 154 unsigned long rcmode; 155}; 156 157struct msm_venc_voptimingcfg { 158 unsigned long voptime_resolution; 159}; 160struct msm_venc_framerate { 161 unsigned long fps_denominator; 162 unsigned long fps_numerator; 163}; 164 165struct msm_venc_targetbitrate { 166 unsigned long target_bitrate; 167}; 168 169 170struct msm_venc_rotation { 171 unsigned long rotation; 172}; 173 174struct msm_venc_timeout { 175 unsigned long millisec; 176}; 177 178struct msm_venc_headerextension { 179 unsigned long header_extension; 180}; 181 182struct msm_venc_video_capability { 183 unsigned int min_width; 184 unsigned int max_width; 185 unsigned int min_height; 186 unsigned int max_height; 187}; 188 189struct msm_venc_idrperiod { 190 unsigned long idrperiod; 191}; 192 193struct msm_venc_slice_delivery { 194 unsigned long enable; 195}; 196 197struct msm_venc_hierlayers { 198 unsigned int numlayers; 199 enum hier_type hier_mode; 200}; 201 202struct msm_venc_ltrinfo { 203 unsigned int enabled; 204 unsigned int count; 205}; 206 207struct msm_venc_perf_level { 208 unsigned int perflevel; 209}; 210 211struct msm_venc_vui_timing_info { 212 unsigned int enabled; 213}; 214 215struct msm_venc_vqzip_sei_info { 216 unsigned int enabled; 217}; 218 219struct msm_venc_peak_bitrate { 220 unsigned int peakbitrate; 221}; 222 223struct msm_venc_vpx_error_resilience { 224 unsigned int enable; 225}; 226 227struct msm_venc_priority { 228 OMX_U32 priority; 229}; 230 231struct msm_venc_hybrid_hp { 232 unsigned int nSize; 233 unsigned int nKeyFrameInterval; 234 unsigned int nTemporalLayerBitrateRatio[OMX_VIDEO_MAX_HP_LAYERS]; 235 unsigned int nMinQuantizer; 236 unsigned int nMaxQuantizer; 237 unsigned int nHpLayers; 238}; 239 240enum v4l2_ports { 241 CAPTURE_PORT, 242 OUTPUT_PORT, 243 MAX_PORT 244}; 245 246class encExtradata { 247private: 248 enum { 249 FREE, 250 BUSY, 251 FOR_CONFIG, 252 }; 253 struct info { 254 int status; 255 void *cookie; 256 }; 257 pthread_mutex_t lock; 258 unsigned int mCount; 259 ssize_t mSize; 260 char *mUaddr; 261 struct venc_ion mIon; 262 struct info mIndex[MAX_V4L2_BUFS]; 263 class omx_venc *mVencHandle; 264 int __get(char **userptr, int *fd, unsigned *offset, ssize_t *size, int type); 265 OMX_ERRORTYPE __allocate(); 266 void __free(); 267 void __debug(); 268public: 269 unsigned int mDbgEtbCount; 270 encExtradata(class omx_venc *venc_handle); 271 ~encExtradata(); 272 void update(unsigned int count, ssize_t size); 273 /* Get extradata whose status is FREE. */ 274 OMX_ERRORTYPE get(char **userptr, int *fd, unsigned *offset, ssize_t *size); 275 /* Get extradata which is tagged with cookie via setCookieForConfigExtradata. If no extradata is tagged with this cookie then get extradata whose status is FREE. */ 276 OMX_ERRORTYPE get(void *cookie, char **userptr, int *fd, unsigned *offset, ssize_t *size); 277 /* return the extradata back to the pool of FREE extradata. */ 278 OMX_ERRORTYPE put(char *userptr); 279 /* If there is already an extradata with status FOR_CONFIG, return that else return FREE extradata. */ 280 OMX_ERRORTYPE getForConfig(char **userptr, int *fd, unsigned *offset, ssize_t *size); 281 /* Return the extradata pointer corresponding to the index. Does not change status of extradata. */ 282 OMX_ERRORTYPE peek(unsigned index, char **userptr, int *fd, unsigned* offset, ssize_t *size); 283 /* Attach a cookie to extradata. Extradata with this cookie can be retrieved via getExtradata call.*/ 284 void setCookieForConfig(void *cookie); 285 ssize_t getBufferSize(); 286 unsigned int getBufferCount(); 287 bool vqzip_sei_found; 288}; 289 290struct statistics { 291 struct timeval prev_tv; 292 int prev_fbd; 293 int bytes_generated; 294}; 295 296enum rc_modes { 297 RC_VBR_VFR = BIT(0), 298 RC_VBR_CFR = BIT(1), 299 RC_CBR_VFR = BIT(2), 300 RC_CBR_CFR = BIT(3), 301 RC_ALL = (RC_VBR_VFR | RC_VBR_CFR 302 | RC_CBR_VFR | RC_CBR_CFR) 303}; 304 305class venc_dev 306{ 307 public: 308 venc_dev(class omx_venc *venc_class); //constructor 309 ~venc_dev(); //des 310 311 static void* async_venc_message_thread (void *); 312 bool venc_open(OMX_U32); 313 void venc_close(); 314 unsigned venc_stop(void); 315 unsigned venc_pause(void); 316 unsigned venc_start(void); 317 unsigned venc_flush(unsigned); 318#ifdef _ANDROID_ICS_ 319 bool venc_set_meta_mode(bool); 320#endif 321 unsigned venc_resume(void); 322 unsigned venc_start_done(void); 323 unsigned venc_stop_done(void); 324 unsigned venc_set_message_thread_id(pthread_t); 325 bool venc_use_buf(void*, unsigned,unsigned); 326 bool venc_free_buf(void*, unsigned); 327 bool venc_empty_buf(void *, void *,unsigned,unsigned); 328 bool venc_fill_buf(void *, void *,unsigned,unsigned); 329 330 bool venc_get_buf_req(OMX_U32 *,OMX_U32 *, 331 OMX_U32 *,OMX_U32); 332 bool venc_set_buf_req(OMX_U32 *,OMX_U32 *, 333 OMX_U32 *,OMX_U32); 334 bool venc_set_param(void *,OMX_INDEXTYPE); 335 bool venc_set_config(void *configData, OMX_INDEXTYPE index); 336 bool venc_get_profile_level(OMX_U32 *eProfile,OMX_U32 *eLevel); 337 bool venc_get_seq_hdr(void *, unsigned, unsigned *); 338 bool venc_loaded_start(void); 339 bool venc_loaded_stop(void); 340 bool venc_loaded_start_done(void); 341 bool venc_loaded_stop_done(void); 342 bool venc_is_video_session_supported(unsigned long width, unsigned long height); 343 bool venc_color_align(OMX_BUFFERHEADERTYPE *buffer, OMX_U32 width, 344 OMX_U32 height); 345 bool venc_get_performance_level(OMX_U32 *perflevel); 346 bool venc_get_vui_timing_info(OMX_U32 *enabled); 347 bool venc_get_vqzip_sei_info(OMX_U32 *enabled); 348 bool venc_get_peak_bitrate(OMX_U32 *peakbitrate); 349 bool venc_get_batch_size(OMX_U32 *size); 350 bool venc_get_output_log_flag(); 351 bool venc_check_valid_config(); 352 int venc_output_log_buffers(const char *buffer_addr, int buffer_len); 353 int venc_input_log_buffers(OMX_BUFFERHEADERTYPE *buffer, int fd, int plane_offset, 354 unsigned long inputformat); 355 int venc_extradata_log_buffers(char *buffer_addr); 356 bool venc_set_bitrate_type(OMX_U32 type); 357 int venc_roiqp_log_buffers(OMX_QTI_VIDEO_CONFIG_ROIINFO *roiInfo); 358 359#ifdef _VQZIP_ 360 class venc_dev_vqzip 361 { 362 public: 363 venc_dev_vqzip(); 364 ~venc_dev_vqzip(); 365 bool init(); 366 void deinit(); 367 struct VQZipConfig pConfig; 368 int tempSEI[300]; 369 int fill_stats_data(void* pBuf, void *pStats); 370 typedef void (*vqzip_deinit_t)(void*); 371 typedef void* (*vqzip_init_t)(void); 372 typedef VQZipStatus (*vqzip_compute_stats_t)(void* const , const void * const , const VQZipConfig* ,VQZipStats*); 373 private: 374 pthread_mutex_t lock; 375 void *mLibHandle; 376 void *mVQZIPHandle; 377 vqzip_init_t mVQZIPInit; 378 vqzip_deinit_t mVQZIPDeInit; 379 vqzip_compute_stats_t mVQZIPComputeStats; 380 }; 381 venc_dev_vqzip vqzip; 382#endif 383 struct venc_debug_cap m_debug; 384 OMX_U32 m_nDriver_fd; 385 int m_poll_efd; 386 bool m_profile_set; 387 bool m_level_set; 388 int num_input_planes, num_output_planes; 389 int etb, ebd, ftb, fbd; 390 struct recon_buffer { 391 unsigned char* virtual_address; 392 int pmem_fd; 393 int size; 394 int alignment; 395 int offset; 396#ifdef USE_ION 397 int ion_device_fd; 398 struct ion_allocation_data alloc_data; 399 struct ion_fd_data ion_alloc_fd; 400#endif 401 }; 402 403 int stopped; 404 int resume_in_stopped; 405 bool m_max_allowed_bitrate_check; 406 pthread_t m_tid; 407 bool async_thread_created; 408 bool async_thread_force_stop; 409 class omx_venc *venc_handle; 410 int append_mbi_extradata(void *, struct msm_vidc_extradata_header*); 411 bool handle_output_extradata(void *); 412 bool handle_input_extradata(void *, int); 413 int venc_set_format(int); 414 bool deinterlace_enabled; 415 bool hw_overload; 416 bool is_gralloc_source_ubwc; 417 bool is_camera_source_ubwc; 418 OMX_U32 fd_list[64]; 419 encExtradata mInputExtradata; 420 encExtradata mOutputExtradata; 421 422 private: 423 OMX_U32 m_codec; 424 struct msm_venc_basecfg m_sVenc_cfg; 425 struct msm_venc_ratectrlcfg rate_ctrl; 426 struct msm_venc_targetbitrate bitrate; 427 struct msm_venc_intraperiod intra_period; 428 struct msm_venc_profile codec_profile; 429 struct msm_venc_profilelevel profile_level; 430 struct msm_venc_switch set_param; 431 struct msm_venc_voptimingcfg time_inc; 432 struct msm_venc_allocatorproperty m_sInput_buff_property; 433 struct msm_venc_allocatorproperty m_sOutput_buff_property; 434 struct msm_venc_sessionqp session_qp; 435 struct msm_venc_initqp init_qp; 436 struct msm_venc_qprange session_qp_range; 437 struct msm_venc_qprange session_qp_values; 438 struct msm_venc_multiclicecfg multislice; 439 struct msm_venc_entropycfg entropy; 440 struct msm_venc_dbcfg dbkfilter; 441 struct msm_venc_intrarefresh intra_refresh; 442 struct msm_venc_headerextension hec; 443 struct msm_venc_voptimingcfg voptimecfg; 444 struct msm_venc_video_capability capability; 445 struct msm_venc_idrperiod idrperiod; 446 struct msm_venc_slice_delivery slice_mode; 447 struct msm_venc_hierlayers hier_layers; 448 struct msm_venc_perf_level performance_level; 449 struct msm_venc_vui_timing_info vui_timing_info; 450 struct msm_venc_vqzip_sei_info vqzip_sei_info; 451 struct msm_venc_peak_bitrate peak_bitrate; 452 struct msm_venc_ltrinfo ltrinfo; 453 struct msm_venc_vpx_error_resilience vpx_err_resilience; 454 struct msm_venc_priority sess_priority; 455 OMX_U32 operating_rate; 456 int rc_off_level; 457 struct msm_venc_hybrid_hp hybrid_hp; 458 459 bool venc_set_profile_level(OMX_U32 eProfile,OMX_U32 eLevel); 460 bool venc_set_intra_period(OMX_U32 nPFrames, OMX_U32 nBFrames); 461 bool venc_set_target_bitrate(OMX_U32 nTargetBitrate, OMX_U32 config); 462 bool venc_set_ratectrl_cfg(OMX_VIDEO_CONTROLRATETYPE eControlRate); 463 bool venc_set_session_qp(OMX_U32 i_frame_qp, OMX_U32 p_frame_qp,OMX_U32 b_frame_qp); 464 bool venc_set_session_qp_range(OMX_U32 min_qp, OMX_U32 max_qp); 465 bool venc_set_encode_framerate(OMX_U32 encode_framerate, OMX_U32 config); 466 bool venc_set_intra_vop_refresh(OMX_BOOL intra_vop_refresh); 467 bool venc_set_color_format(OMX_COLOR_FORMATTYPE color_format); 468 bool venc_validate_profile_level(OMX_U32 *eProfile, OMX_U32 *eLevel); 469 bool venc_set_multislice_cfg(OMX_INDEXTYPE codec, OMX_U32 slicesize); 470 bool venc_set_entropy_config(OMX_BOOL enable, OMX_U32 i_cabac_level); 471 bool venc_set_inloop_filter(OMX_VIDEO_AVCLOOPFILTERTYPE loop_filter); 472 bool venc_set_intra_refresh (OMX_VIDEO_INTRAREFRESHTYPE intrarefresh, OMX_U32 nMBs); 473 bool venc_set_error_resilience(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* error_resilience); 474 bool venc_set_voptiming_cfg(OMX_U32 nTimeIncRes); 475 void venc_config_print(); 476 bool venc_set_slice_delivery_mode(OMX_U32 enable); 477 bool venc_set_extradata(OMX_U32 extra_data, OMX_BOOL enable); 478 bool venc_set_idr_period(OMX_U32 nPFrames, OMX_U32 nIDRPeriod); 479 bool venc_reconfig_reqbufs(); 480 bool venc_set_vpe_rotation(OMX_S32 rotation_angle); 481 bool venc_set_deinterlace(OMX_U32 enable); 482 bool venc_set_ltrmode(OMX_U32 enable, OMX_U32 count); 483 bool venc_enable_initial_qp(QOMX_EXTNINDEX_VIDEO_INITIALQP* initqp); 484 bool venc_set_useltr(OMX_U32 frameIdx); 485 bool venc_set_markltr(OMX_U32 frameIdx); 486 bool venc_set_inband_video_header(OMX_BOOL enable); 487 bool venc_set_au_delimiter(OMX_BOOL enable); 488 bool venc_set_hier_layers(QOMX_VIDEO_HIERARCHICALCODINGTYPE type, OMX_U32 num_layers); 489 bool venc_set_perf_level(QOMX_VIDEO_PERF_LEVEL ePerfLevel); 490 bool venc_set_vui_timing_info(OMX_BOOL enable); 491 bool venc_set_peak_bitrate(OMX_U32 nPeakBitrate); 492 bool venc_set_searchrange(); 493 bool venc_set_vpx_error_resilience(OMX_BOOL enable); 494 bool venc_set_perf_mode(OMX_U32 mode); 495 bool venc_set_mbi_statistics_mode(OMX_U32 mode); 496 bool venc_set_vqzip_sei_type(OMX_BOOL enable); 497 bool venc_set_hybrid_hierp(QOMX_EXTNINDEX_VIDEO_HYBRID_HP_MODE* hhp); 498 bool venc_set_batch_size(OMX_U32 size); 499 bool venc_calibrate_gop(); 500 bool venc_set_vqzip_defaults(); 501 bool venc_validate_hybridhp_params(OMX_U32 layers, OMX_U32 bFrames, OMX_U32 count, int mode); 502 bool venc_set_max_hierp(OMX_U32 hierp_layers); 503 bool venc_set_baselayerid(OMX_U32 baseid); 504 bool venc_set_qp(OMX_U32 nQp); 505 bool venc_set_aspectratio(void *nSar); 506 bool venc_set_priority(OMX_U32 priority); 507 bool venc_set_session_priority(OMX_U32 priority); 508 bool venc_set_operatingrate(OMX_U32 rate); 509 bool venc_set_layer_bitrates(QOMX_EXTNINDEX_VIDEO_HYBRID_HP_MODE* hpmode); 510 bool venc_set_roi_qp_info(OMX_QTI_VIDEO_CONFIG_ROIINFO *roiInfo); 511 512#ifdef MAX_RES_1080P 513 OMX_U32 pmem_free(); 514 OMX_U32 pmem_allocate(OMX_U32 size, OMX_U32 alignment, OMX_U32 count); 515 OMX_U32 venc_allocate_recon_buffers(); 516 inline int clip2(int x) { 517 x = x -1; 518 x = x | x >> 1; 519 x = x | x >> 2; 520 x = x | x >> 4; 521 x = x | x >> 16; 522 x = x + 1; 523 return x; 524 } 525#endif 526 int metadatamode; 527 bool streaming[MAX_PORT]; 528 bool extradata; 529 530 pthread_mutex_t pause_resume_mlock; 531 pthread_cond_t pause_resume_cond; 532 bool paused; 533 int color_format; 534 bool is_searchrange_set; 535 bool enable_mv_narrow_searchrange; 536 int supported_rc_modes; 537 bool is_thulium_v1; 538 bool camera_mode_enabled; 539 540 bool venc_empty_batch (OMX_BUFFERHEADERTYPE *buf, unsigned index); 541 static const int kMaxBuffersInBatch = 16; 542 unsigned int mBatchSize; 543 struct BatchInfo { 544 BatchInfo(); 545 /* register a buffer and obtain its unique id (v4l2-buf-id) 546 */ 547 int registerBuffer(int bufferId); 548 /* retrieve the buffer given its v4l2-buf-id 549 */ 550 int retrieveBufferAt(int v4l2Id); 551 bool isPending(int bufferId); 552 553 private: 554 static const int kMaxBufs = 64; 555 static const int kBufIDFree = -1; 556 pthread_mutex_t mLock; 557 int mBufMap[64]; // Map with slots for each buffer 558 size_t mNumPending; 559 560 public: 561 // utility methods to parse entities in batch 562 // payload format for batch of 3 563 //| fd0 | fd1 | fd2 | off0 | off1 | off2 | len0 | len1 | len2 | csc0 | csc1 | csc2 | dTS0 | dTS1 | dTS2| 564 static inline int getFdAt(native_handle_t *, int index); 565 static inline int getOffsetAt(native_handle_t *, int index); 566 static inline int getSizeAt(native_handle_t *, int index); 567 static inline int getColorFormatAt(native_handle_t *, int index); 568 static inline int getTimeStampAt(native_handle_t *, int index); 569 }; 570 BatchInfo mBatchInfo; 571}; 572 573enum instance_state { 574 MSM_VIDC_CORE_UNINIT_DONE = 0x0001, 575 MSM_VIDC_CORE_INIT, 576 MSM_VIDC_CORE_INIT_DONE, 577 MSM_VIDC_OPEN, 578 MSM_VIDC_OPEN_DONE, 579 MSM_VIDC_LOAD_RESOURCES, 580 MSM_VIDC_LOAD_RESOURCES_DONE, 581 MSM_VIDC_START, 582 MSM_VIDC_START_DONE, 583 MSM_VIDC_STOP, 584 MSM_VIDC_STOP_DONE, 585 MSM_VIDC_RELEASE_RESOURCES, 586 MSM_VIDC_RELEASE_RESOURCES_DONE, 587 MSM_VIDC_CLOSE, 588 MSM_VIDC_CLOSE_DONE, 589 MSM_VIDC_CORE_UNINIT, 590}; 591#endif 592 593