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