• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef NATIVE_AVSCREEN_CAPTURE_BASE_H
17 #define NATIVE_AVSCREEN_CAPTURE_BASE_H
18 
19 #include <stdint.h>
20 #include "native_avbuffer.h"
21 
22 #ifdef __cplusplus
23 extern "C" {
24 #endif
25 
26 /**
27  * @brief Nativebuffer of avscreeencapture that from graphics.
28  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
29  *
30  * @since 10
31  * @version 1.0
32  */
33 typedef struct OH_NativeBuffer OH_NativeBuffer;
34 
35 /**
36  * @brief Initialization of avscreeencapture
37  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
38  *
39  * @since 10
40  * @version 1.0
41  */
42 typedef struct OH_AVScreenCapture OH_AVScreenCapture;
43 
44 /**
45  * @brief Initialization of OH_AVScreenCapture_ContentFilter
46  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
47  *
48  * @since 12
49  * @version 1.0
50  */
51 typedef struct OH_AVScreenCapture_ContentFilter OH_AVScreenCapture_ContentFilter;
52 
53 /**
54  * @brief Enumerates screen capture mode.
55  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
56  *
57  * @since 10
58  * @version 1.0
59  */
60 typedef enum OH_CaptureMode {
61     /* capture home screen */
62     OH_CAPTURE_HOME_SCREEN = 0,
63     /* capture a specified screen */
64     OH_CAPTURE_SPECIFIED_SCREEN = 1,
65     /* capture a specified window */
66     OH_CAPTURE_SPECIFIED_WINDOW = 2,
67     OH_CAPTURE_INVAILD = -1
68 } OH_CaptureMode;
69 
70 /**
71  * @brief Enumerates audio cap source type.
72  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
73  *
74  * @since 10
75  * @version 1.0
76  */
77 typedef enum OH_AudioCaptureSourceType {
78     /* Invalid audio source */
79     OH_SOURCE_INVALID = -1,
80     /* Default audio source */
81     OH_SOURCE_DEFAULT = 0,
82     /* Microphone */
83     OH_MIC = 1,
84     /* inner all PlayBack */
85     OH_ALL_PLAYBACK = 2,
86     /* inner app PlayBack */
87     OH_APP_PLAYBACK = 3,
88 } OH_AudioCaptureSourceType;
89 
90 /**
91  * @brief Enumerates audio codec formats.
92  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
93  *
94  * @since 10
95  * @version 1.0
96  */
97 typedef enum OH_AudioCodecFormat {
98     /* Default format */
99     OH_AUDIO_DEFAULT = 0,
100     /* Advanced Audio Coding Low Complexity (AAC-LC) */
101     OH_AAC_LC = 3,
102     /* Invalid value */
103     OH_AUDIO_CODEC_FORMAT_BUTT,
104 } OH_AudioCodecFormat;
105 
106 /**
107  * @brief Enumerates video codec formats.
108  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
109  *
110  * @since 10
111  * @version 1.0
112  */
113 typedef enum OH_VideoCodecFormat {
114     /* Default format */
115     OH_VIDEO_DEFAULT = 0,
116     /* H.264 */
117     OH_H264 = 2,
118     /* H.265/HEVC */
119     OH_H265 = 4,
120     /* MPEG4 */
121     OH_MPEG4 = 6,
122     /* VP8 */
123     OH_VP8 = 8,
124     /* VP9 */
125     OH_VP9 = 10,
126     /* Invalid format */
127     OH_VIDEO_CODEC_FORMAT_BUTT,
128 } OH_VideoCodecFormat;
129 
130 /**
131  * @brief Enumerates screen capture data type.
132  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
133  *
134  * @since 10
135  * @version 1.0
136  */
137 typedef enum OH_DataType {
138     /* YUV/RGBA/PCM, etc. original stream */
139     OH_ORIGINAL_STREAM = 0,
140     /* h264/AAC, etc. encoded stream */
141     OH_ENCODED_STREAM = 1,
142     /* mp4 file */
143     OH_CAPTURE_FILE = 2,
144     OH_INVAILD = -1
145 } OH_DataType;
146 
147 /**
148  * @brief Enumerates video source types.
149  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
150  *
151  * @since 10
152  * @version 1.0
153  */
154 typedef enum OH_VideoSourceType {
155     /* Unsupported App Usage. */
156     /* YUV video data provided through graphic */
157     OH_VIDEO_SOURCE_SURFACE_YUV = 0,
158     /* Raw encoded data provided through graphic */
159     OH_VIDEO_SOURCE_SURFACE_ES,
160     /* RGBA video data provided through graphic */
161     OH_VIDEO_SOURCE_SURFACE_RGBA,
162     /* Invalid value */
163     OH_VIDEO_SOURCE_BUTT
164 } OH_VideoSourceType;
165 
166 /**
167  * @brief Enumerates the container format types.
168  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
169  *
170  * @since 10
171  * @version 1.0
172  */
173 typedef enum OH_ContainerFormatType {
174     /* Audio format type -- m4a */
175     CFT_MPEG_4A = 0,
176     /* Video format type -- mp4 */
177     CFT_MPEG_4 = 1
178 } OH_ContainerFormatType;
179 
180 /**
181  * @brief Audio capture info struct
182  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
183  *
184  * @since 10
185  * @version 1.0
186  */
187 typedef struct OH_AudioCaptureInfo {
188     /* Audio capture sample rate info */
189     int32_t audioSampleRate;
190     /* Audio capture channel info */
191     int32_t audioChannels;
192     /* Audio capture source type */
193     OH_AudioCaptureSourceType audioSource;
194 } OH_AudioCaptureInfo;
195 
196 /**
197  * @brief Audio encoder info
198  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
199  *
200  * @since 10
201  * @version 1.0
202  */
203 typedef struct OH_AudioEncInfo {
204     /* Audio encoder bitrate */
205     int32_t audioBitrate;
206     /* Audio codec format */
207     OH_AudioCodecFormat audioCodecformat;
208 } OH_AudioEncInfo;
209 
210 /**
211  * @brief The audio info of avscreeencapture
212  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
213  *
214  * @since 10
215  * @version 1.0
216  */
217 typedef struct OH_AudioInfo {
218     /* Audio capture info of microphone */
219     OH_AudioCaptureInfo micCapInfo;
220     /* Audio capture info of inner */
221     OH_AudioCaptureInfo innerCapInfo;
222     /* Audio encoder info, no need to set, while dataType = OH_ORIGINAL_STREAM */
223     OH_AudioEncInfo audioEncInfo;
224 } OH_AudioInfo;
225 
226 /**
227  * @brief Video capture info
228  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
229  *
230  * @since 10
231  * @version 1.0
232  */
233 typedef struct OH_VideoCaptureInfo {
234     /* Display id, should be set while captureMode = CAPTURE_SPECIFIED_SCREEN */
235     uint64_t displayId;
236     /* The  ids of mission, should be set while captureMode = CAPTURE_SPECIFIED_WINDOW */
237     int32_t *missionIDs;
238     /* Mission ids length, should be set while captureMode = CAPTURE_SPECIFIED_WINDOW */
239     int32_t missionIDsLen;
240     /* Video frame width of avscreeencapture */
241     int32_t videoFrameWidth;
242     /* Video frame height of avscreeencapture */
243     int32_t videoFrameHeight;
244     /* Video source type of avscreeencapture */
245     OH_VideoSourceType videoSource;
246 } OH_VideoCaptureInfo;
247 
248 /**
249  * @brief Videoc encoder info
250  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
251  *
252  * @since 10
253  * @version 1.0
254  */
255 typedef struct OH_VideoEncInfo {
256     /* Video encoder format */
257     OH_VideoCodecFormat videoCodec;
258     /* Video encoder bitrate */
259     int32_t videoBitrate;
260     /* Video encoder frame rate */
261     int32_t videoFrameRate;
262 } OH_VideoEncInfo;
263 
264 /**
265  * @brief Video info
266  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
267  *
268  * @since 10
269  * @version 1.0
270  */
271 typedef struct OH_VideoInfo {
272     /* Video capture info */
273     OH_VideoCaptureInfo videoCapInfo;
274     /* Video encoder info */
275     OH_VideoEncInfo videoEncInfo;
276 } OH_VideoInfo;
277 
278 /**
279  * @brief Recorder file info
280  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
281  *
282  * @since 10
283  * @version 1.0
284  */
285 typedef struct OH_RecorderInfo {
286     /* Recorder file url */
287     char *url;
288     /* Recorder file url length */
289     uint32_t urlLen;
290     /* Recorder file format */
291     OH_ContainerFormatType fileFormat;
292 } OH_RecorderInfo;
293 
294 /**
295  * @brief AV screeen capture config info
296  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
297  *
298  * @since 10
299  * @version 1.0
300  */
301 typedef struct OH_AVScreenCaptureConfig {
302     OH_CaptureMode captureMode;
303     OH_DataType dataType;
304     OH_AudioInfo audioInfo;
305     OH_VideoInfo videoInfo;
306     /* should be set, while dataType = OH_CAPTURE_FILE */
307     OH_RecorderInfo recorderInfo;
308 } OH_AVScreenCaptureConfig;
309 
310 /**
311  * @brief When an error occurs in the running of the OH_AVScreenCapture instance, the function pointer will be called
312  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
313  * @param capture Pointer to an OH_AVScreenCapture instance
314  * @param errorCode specific error code
315  *
316  * @since 10
317  * @version 1.0
318  * @deprecated since 12
319  * @useinstead {@link OH_AVScreenCapture_OnError}
320  */
321 typedef void (*OH_AVScreenCaptureOnError)(OH_AVScreenCapture *capture, int32_t errorCode);
322 
323 /**
324  * @brief When audio buffer is available during the operation of OH_AVScreenCapture, the function pointer will
325  * be called.
326  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
327  * @param capture Pointer to an OH_AVScreenCapture instance
328  * @param isReady Information describing whether audio buffer is available
329  * @param type Information describing the audio source type
330  *
331  * @since 10
332  * @version 1.0
333  * @deprecated since 12
334  * @useinstead {@link OH_AVScreenCapture_OnBufferAvailable}
335  */
336 typedef void (*OH_AVScreenCaptureOnAudioBufferAvailable)(OH_AVScreenCapture *capture, bool isReady,
337     OH_AudioCaptureSourceType type);
338 
339 /**
340  * @brief When video buffer is available during the operation of OH_AVScreenCapture, the function pointer will
341  * be called.
342  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
343  * @param capture Pointer to an OH_AVScreenCapture instance
344  * @param isReady Information describing whether video buffer is available
345  *
346  * @since 10
347  * @version 1.0
348  * @deprecated since 12
349  * @useinstead {@link OH_AVScreenCapture_OnBufferAvailable}
350  */
351 typedef void (*OH_AVScreenCaptureOnVideoBufferAvailable)(OH_AVScreenCapture *capture, bool isReady);
352 
353 /**
354  * @brief A collection of all callback function pointers in OH_AVScreenCapture. Register an instance of this
355  * structure to the OH_AVScreenCapture instance, and process the information reported through the callback to ensure the
356  * normal operation of OH_AVScreenCapture.
357  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
358  * @param onError Monitor OH_AVScreenCapture operation errors, refer to {@link OH_AVScreenCaptureOnError}
359  * @param onAudioBufferAvailable Monitor audio buffer, refer to {@link OH_AVScreenCaptureOnAudioBufferAvailable}
360  * @param onVideoBufferAvailable Monitor video buffer, refer to {@link OH_AVScreenCaptureOnVideoBufferAvailable}
361  *
362  * @since 10
363  * @version 1.0
364  * @deprecated since 12
365  * @useinstead {@link OH_AVScreenCapture_OnError} {@link OH_AVScreenCapture_OnBufferAvailable}
366  */
367 typedef struct OH_AVScreenCaptureCallback {
368     /**
369      * @deprecated since 12
370      * @useinstead {@link OH_AVScreenCapture_OnError}
371      */
372     OH_AVScreenCaptureOnError onError;
373     /**
374      * @deprecated since 12
375      * @useinstead {@link OH_AVScreenCapture_OnBufferAvailable}
376      */
377     OH_AVScreenCaptureOnAudioBufferAvailable onAudioBufferAvailable;
378     /**
379      * @deprecated since 12
380      * @useinstead {@link OH_AVScreenCapture_OnBufferAvailable}
381      */
382     OH_AVScreenCaptureOnVideoBufferAvailable onVideoBufferAvailable;
383 } OH_AVScreenCaptureCallback;
384 
385 /**
386  * @brief avscreeencapture rect info
387  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
388  *
389  * @since 10
390  * @version 1.0
391  */
392 typedef struct OH_Rect {
393     /* X-coordinate of screen recording */
394     int32_t x;
395     /* y-coordinate of screen recording */
396     int32_t y;
397     /* Width of screen recording */
398     int32_t width;
399     /* Height of screen recording */
400     int32_t height;
401 } OH_Rect;
402 
403 
404 /**
405  * @brief Audiobuffer struct info
406  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
407  *
408  * @since 10
409  * @version 1.0
410  */
411 typedef struct OH_AudioBuffer {
412     /* Audio buffer memory block  */
413     uint8_t *buf;
414     /* Audio buffer memory block size */
415     int32_t size;
416     /* Audio buffer timestamp info */
417     int64_t timestamp;
418     /* Audio capture source type */
419     OH_AudioCaptureSourceType type;
420 } OH_AudioBuffer;
421 
422 /**
423  * @brief Enumerates screen capture state code.
424  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
425  *
426  * @since 12
427  * @version 1.0
428  */
429 typedef enum OH_AVScreenCaptureStateCode {
430     /* Screen capture started by user */
431     OH_SCREEN_CAPTURE_STATE_STARTED = 0,
432     /* Screen capture canceled by user */
433     OH_SCREEN_CAPTURE_STATE_CANCELED = 1,
434     /* ScreenCapture stopped by user */
435     OH_SCREEN_CAPTURE_STATE_STOPPED_BY_USER = 2,
436     /* ScreenCapture interrupted by other screen capture */
437     OH_SCREEN_CAPTURE_STATE_INTERRUPTED_BY_OTHER = 3,
438     /* ScreenCapture stopped by SIM call */
439     OH_SCREEN_CAPTURE_STATE_STOPPED_BY_CALL = 4,
440     /* Microphone is temporarily unavailable */
441     OH_SCREEN_CAPTURE_STATE_MIC_UNAVAILABLE = 5,
442     /* Microphone is muted by user */
443     OH_SCREEN_CAPTURE_STATE_MIC_MUTED_BY_USER = 6,
444     /* Microphone is unmuted by user */
445     OH_SCREEN_CAPTURE_STATE_MIC_UNMUTED_BY_USER = 7,
446     /* Current captured screen has private window */
447     OH_SCREEN_CAPTURE_STATE_ENTER_PRIVATE_SCENE = 8,
448     /* Private window disappeared on current captured screen*/
449     OH_SCREEN_CAPTURE_STATE_EXIT_PRIVATE_SCENE = 9,
450     /* ScreenCapture stopped by user switches */
451     OH_SCREEN_CAPTURE_STATE_STOPPED_BY_USER_SWITCHES = 10,
452 } OH_AVScreenCaptureStateCode;
453 
454 /**
455  * @brief Enumerates screen capture buffer type.
456  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
457  *
458  * @since 12
459  * @version 1.0
460  */
461 typedef enum OH_AVScreenCaptureBufferType {
462     /* Buffer of video data from screen */
463     OH_SCREEN_CAPTURE_BUFFERTYPE_VIDEO = 0,
464     /* Buffer of audio data from inner capture */
465     OH_SCREEN_CAPTURE_BUFFERTYPE_AUDIO_INNER = 1,
466     /* Buffer of audio data from microphone */
467     OH_SCREEN_CAPTURE_BUFFERTYPE_AUDIO_MIC = 2,
468 } OH_AVScreenCaptureBufferType;
469 
470 /**
471  * @brief Enumerates screen capture filterable audio content.
472  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
473  *
474  * @since 12
475  * @version 1.0
476  */
477 typedef enum OH_AVScreenCaptureFilterableAudioContent {
478     /* Audio content of notification sound */
479     OH_SCREEN_CAPTURE_NOTIFICATION_AUDIO = 0,
480     /* Audio content of the sound of the app itself */
481     OH_SCREEN_CAPTURE_CURRENT_APP_AUDIO = 1,
482 } OH_AVScreenCaptureFilterableAudioContent;
483 
484 /**
485  * @brief Enumerates screen capture content state.
486  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
487  *
488  * @since 20
489  */
490 typedef enum OH_AVScreenCaptureContentChangedEvent_Enum {
491     /* Content is hidden */
492     OH_SCREEN_CAPTURE_CONTENT_HIDE = 0,
493     /* Content is visible */
494     OH_SCREEN_CAPTURE_CONTENT_VISIBLE = 1,
495     /* ScreenCapture stopped by user */
496     OH_SCREEN_CAPTURE_CONTENT_UNAVAILABLE = 2,
497 } OH_AVScreenCaptureContentChangedEvent;
498 
499 /**
500  * @brief content fill mode.
501  *
502  * @since 20
503  */
504 typedef enum OH_AVScreenCapture_FillMode {
505     /**
506      * Keep the original image aspect ratio to match the target
507      * image size. If the ratio is inconsistent, there may be black edges.
508      */
509     OH_SCREENCAPTURE_FILLMODE_ASPECT_SCALE_FIT = 0,
510     /**
511      * The image is stretched to match the target output size.
512      * If the ratios are inconsistent, the image will be deformed.
513      */
514     OH_SCREENCAPTURE_FILLMODE_SCALE_TO_FILL = 1,
515 } OH_AVScreenCapture_FillMode;
516 
517 /**
518  * @brief When state of OH_AVScreenCapture is changed, the function pointer will be called.
519  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
520  * @param capture Pointer to an OH_AVScreenCapture instance
521  * @param stateCode Information describing current state, see {@link OH_AVScreenCaptureStateCode}
522  * @param userData Pointer to user specific data
523  *
524  * @since 12
525  * @version 1.0
526  */
527 typedef void (*OH_AVScreenCapture_OnStateChange)(struct OH_AVScreenCapture *capture,
528     OH_AVScreenCaptureStateCode stateCode, void *userData);
529 
530 /**
531  * @brief When an error occurs in the running of the OH_AVScreenCapture instance, the function pointer will be called
532  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
533  * @param capture Pointer to an OH_AVScreenCapture instance
534  * @param errorCode specific error code
535  * @param userData Pointer to user specific data
536  *
537  * @since 12
538  * @version 1.0
539  */
540 typedef void (*OH_AVScreenCapture_OnError)(OH_AVScreenCapture *capture, int32_t errorCode, void *userData);
541 
542 /**
543  * @brief When data is ready from the OH_AVScreenCapture instance, the function pointer will be called
544  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
545  * @param capture Pointer to an OH_AVScreenCapture instance
546  * @param buffer Pointer to a buffer containing media data
547  * @param bufferType Data type of the buffer, see {@link OH_AVScreenCaptureBufferType}
548  * @param timestamp Timestamp of the buffer
549  * @param userData Pointer to user specific data
550  *
551  * @since 12
552  * @version 1.0
553  */
554 typedef void (*OH_AVScreenCapture_OnBufferAvailable)(OH_AVScreenCapture *capture, OH_AVBuffer *buffer,
555     OH_AVScreenCaptureBufferType bufferType, int64_t timestamp, void *userData);
556 
557 /**
558  * @brief When one of the display devices start being captured, the function pointer will be called
559  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
560  * @param capture Pointer to an OH_AVScreenCapture instance
561  * @param displayId Id of the display device that being captured
562  * @param userData Pointer to user specific data
563  *
564  * @since 15
565  */
566 typedef void (*OH_AVScreenCapture_OnDisplaySelected)(OH_AVScreenCapture *capture, uint64_t displayId, void *userData);
567 
568 /**
569  * @brief Initialization of OH_AVScreenCapture_CaptureStrategy
570  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
571  *
572  * @since 20
573  */
574 typedef struct OH_AVScreenCapture_CaptureStrategy OH_AVScreenCapture_CaptureStrategy;
575 
576 /**
577  * @brief When Capture Content info changes, the function will be called to notify user
578  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
579  * @param {OH_AVScreenCapture*} capture Pointer to an OH_AVScreenCapture instance
580  * @param {OH_AVScreenCaptureContentChangedEvent} event enum for content change event
581  * @param {OH_Rect*} area capture content rect position
582  * @param { void*} userData Pointer to user specific data
583  *
584  * @since 20
585  * @version 1.0
586  */
587 typedef void (*OH_AVScreenCapture_OnCaptureContentChanged)(OH_AVScreenCapture* capture,
588     OH_AVScreenCaptureContentChangedEvent event, OH_Rect* area, void *userData);
589 
590 /**
591  * @brief Initialization of OH_AVScreenCapture_UserSelectionInfo
592  * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
593  *
594  * @since 20
595  */
596 typedef struct OH_AVScreenCapture_UserSelectionInfo OH_AVScreenCapture_UserSelectionInfo;
597 
598 /**
599 * @brief When the user selects parameters in the authorization interface (selection interface),
600 *  the function interface returns the parameters to the application.
601 * @syscap SystemCapability.Multimedia.Media.AVScreenCapture
602 * @param {OH_AVScreenCapture*} capture Pointer to an OH_AVScreenCapture instance
603 * @param {OH_AVScreenCapture_UserSelectionInfo*} selections The recording parameter information
604 *        selected by the user on the authorization interface
605 * @param {void*} userData Pointer to user specific data
606 *
607 * @since 20
608 */
609 typedef void (*OH_AVScreenCapture_OnUserSelected)(OH_AVScreenCapture* capture,
610     OH_AVScreenCapture_UserSelectionInfo* selections, void *userData);
611 #ifdef __cplusplus
612 }
613 #endif
614 
615 #endif // NATIVE_AVSCREEN_CAPTURE_BASE_H