180922886Sopenharmony_ci/* 280922886Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 380922886Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 480922886Sopenharmony_ci * you may not use this file except in compliance with the License. 580922886Sopenharmony_ci * You may obtain a copy of the License at 680922886Sopenharmony_ci * 780922886Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 880922886Sopenharmony_ci * 980922886Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1080922886Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1180922886Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1280922886Sopenharmony_ci * See the License for the specific language governing permissions and 1380922886Sopenharmony_ci * limitations under the License. 1480922886Sopenharmony_ci */ 1580922886Sopenharmony_ci 1680922886Sopenharmony_ci/** 1780922886Sopenharmony_ci * @addtogroup OHAVSession 1880922886Sopenharmony_ci * @{ 1980922886Sopenharmony_ci * 2080922886Sopenharmony_ci * @brief Provide the definition of the C interface for the avsession module. 2180922886Sopenharmony_ci * 2280922886Sopenharmony_ci * @syscap SystemCapability.Multimedia.AVSession.Core 2380922886Sopenharmony_ci * 2480922886Sopenharmony_ci * @since 13 2580922886Sopenharmony_ci * @version 1.0 2680922886Sopenharmony_ci */ 2780922886Sopenharmony_ci 2880922886Sopenharmony_ci/** 2980922886Sopenharmony_ci * @file native_avmetadata.h 3080922886Sopenharmony_ci * 3180922886Sopenharmony_ci * @brief Declare avmetadata builder related interfaces. 3280922886Sopenharmony_ci * 3380922886Sopenharmony_ci * @library libohavsession.so 3480922886Sopenharmony_ci * @syscap SystemCapability.Multimedia.AVSession.Core 3580922886Sopenharmony_ci * @kit AVSessionKit 3680922886Sopenharmony_ci * @since 13 3780922886Sopenharmony_ci * @version 1.0 3880922886Sopenharmony_ci */ 3980922886Sopenharmony_ci 4080922886Sopenharmony_ci#ifndef NATIVE_AVMETADATA_H 4180922886Sopenharmony_ci#define NATIVE_AVMETADATA_H 4280922886Sopenharmony_ci 4380922886Sopenharmony_ci#include <stdint.h> 4480922886Sopenharmony_ci 4580922886Sopenharmony_ci#ifdef __cplusplus 4680922886Sopenharmony_ciextern "C" { 4780922886Sopenharmony_ci#endif 4880922886Sopenharmony_ci 4980922886Sopenharmony_ci/** 5080922886Sopenharmony_ci * @brief AVMetadata error code 5180922886Sopenharmony_ci * 5280922886Sopenharmony_ci * @since 13 5380922886Sopenharmony_ci * @version 1.0 5480922886Sopenharmony_ci */ 5580922886Sopenharmony_citypedef enum { 5680922886Sopenharmony_ci /** 5780922886Sopenharmony_ci * @error The call was successful. 5880922886Sopenharmony_ci */ 5980922886Sopenharmony_ci AVMETADATA_SUCCESS = 0, 6080922886Sopenharmony_ci 6180922886Sopenharmony_ci /** 6280922886Sopenharmony_ci * @error This means that the function was executed with an invalid input parameter. 6380922886Sopenharmony_ci */ 6480922886Sopenharmony_ci AVMETADATA_ERROR_INVALID_PARAM = 1, 6580922886Sopenharmony_ci 6680922886Sopenharmony_ci /** 6780922886Sopenharmony_ci * @error This means there is no memory left. 6880922886Sopenharmony_ci */ 6980922886Sopenharmony_ci AVMETADATA_ERROR_NO_MEMORY = 2, 7080922886Sopenharmony_ci} AVMetadata_Result; 7180922886Sopenharmony_ci 7280922886Sopenharmony_ci/** 7380922886Sopenharmony_ci * @brief Defines the skip interval when fastforward or rewind. 7480922886Sopenharmony_ci * 7580922886Sopenharmony_ci * @since 13 7680922886Sopenharmony_ci * @version 1.0 7780922886Sopenharmony_ci */ 7880922886Sopenharmony_citypedef enum { 7980922886Sopenharmony_ci /** 8080922886Sopenharmony_ci * @brief 10 seconds 8180922886Sopenharmony_ci */ 8280922886Sopenharmony_ci SECONDS_10 = 10, 8380922886Sopenharmony_ci 8480922886Sopenharmony_ci /** 8580922886Sopenharmony_ci * @brief 15 seconds 8680922886Sopenharmony_ci */ 8780922886Sopenharmony_ci SECONDS_15 = 15, 8880922886Sopenharmony_ci 8980922886Sopenharmony_ci /** 9080922886Sopenharmony_ci * @brief 30 seconds 9180922886Sopenharmony_ci */ 9280922886Sopenharmony_ci SECONDS_30 = 30, 9380922886Sopenharmony_ci} AVMetadata_SkipIntervals; 9480922886Sopenharmony_ci 9580922886Sopenharmony_ci/** 9680922886Sopenharmony_ci * @brief Display tag 9780922886Sopenharmony_ci * 9880922886Sopenharmony_ci * @since 13 9980922886Sopenharmony_ci * @version 1.0 10080922886Sopenharmony_ci */ 10180922886Sopenharmony_citypedef enum { 10280922886Sopenharmony_ci /** 10380922886Sopenharmony_ci * @brief Indicate the audio vivid property. 10480922886Sopenharmony_ci */ 10580922886Sopenharmony_ci AVSESSION_DISPLAYTAG_AUDIO_VIVID = 1, 10680922886Sopenharmony_ci} AVMetadata_DisplayTag; 10780922886Sopenharmony_ci 10880922886Sopenharmony_ci/** 10980922886Sopenharmony_ci * @brief Declaring the avmetadata builder. 11080922886Sopenharmony_ci * The instance of builder is used for creating avmetadata. 11180922886Sopenharmony_ci * 11280922886Sopenharmony_ci * @since 13 11380922886Sopenharmony_ci * @version 1.0 11480922886Sopenharmony_ci */ 11580922886Sopenharmony_citypedef struct OH_AVMetadataBuilderStruct OH_AVMetadataBuilder; 11680922886Sopenharmony_ci 11780922886Sopenharmony_ci/** 11880922886Sopenharmony_ci * @brief Declaring the avmetadata. 11980922886Sopenharmony_ci * The instance of avmetadata set by application for current resource. 12080922886Sopenharmony_ci * 12180922886Sopenharmony_ci * @since 13 12280922886Sopenharmony_ci * @version 1.0 12380922886Sopenharmony_ci */ 12480922886Sopenharmony_citypedef struct OH_AVMetadataStruct OH_AVMetadata; 12580922886Sopenharmony_ci 12680922886Sopenharmony_ci/** 12780922886Sopenharmony_ci * @brief Creates an AVMetadataBuilder instance. 12880922886Sopenharmony_ci * 12980922886Sopenharmony_ci * @param builder The builder reference to the created result. 13080922886Sopenharmony_ci * @return Function result code: 13180922886Sopenharmony_ci * {@link AVMETADATA_SUCCESS} If the execution is successful. 13280922886Sopenharmony_ci * {@link AVMETADATA_ERROR_INVALID_PARAM} The param of builder is nullptr. 13380922886Sopenharmony_ci * {@link AVMETADATA_ERROR_NO_MEMORY} No memory to allocate a new instance. 13480922886Sopenharmony_ci * @since 13 13580922886Sopenharmony_ci */ 13680922886Sopenharmony_ciAVMetadata_Result OH_AVMetadataBuilder_Create(OH_AVMetadataBuilder** builder); 13780922886Sopenharmony_ci 13880922886Sopenharmony_ci/** 13980922886Sopenharmony_ci * @brief Destroy a bulder. 14080922886Sopenharmony_ci * 14180922886Sopenharmony_ci * @param builder The metadata builder instance pointer 14280922886Sopenharmony_ci * @return Function result code: 14380922886Sopenharmony_ci * {@link AVMETADATA_SUCCESS} If the execution is successful. 14480922886Sopenharmony_ci * {@link AVMETADATA_ERROR_INVALID_PARAM} The param of builder is nullptr. 14580922886Sopenharmony_ci * @since 13 14680922886Sopenharmony_ci */ 14780922886Sopenharmony_ciAVMetadata_Result OH_AVMetadataBuilder_Destroy(OH_AVMetadataBuilder* builder); 14880922886Sopenharmony_ci 14980922886Sopenharmony_ci/** 15080922886Sopenharmony_ci * @brief Set current asset id of the resource 15180922886Sopenharmony_ci * 15280922886Sopenharmony_ci * @param builder The metadata builder instance pointer 15380922886Sopenharmony_ci * @param assetId The current assetId of resource. 15480922886Sopenharmony_ci * @return Function result code: 15580922886Sopenharmony_ci * {@link AVMETADATA_SUCCESS} If the execution is successful. 15680922886Sopenharmony_ci * {@link AVMETADATA_ERROR_INVALID_PARAM}: 15780922886Sopenharmony_ci * 1.The param of builder is nullptr; 15880922886Sopenharmony_ci * 2.The param of assetId is nullptr. 15980922886Sopenharmony_ci * @since 13 16080922886Sopenharmony_ci */ 16180922886Sopenharmony_ciAVMetadata_Result OH_AVMetadataBuilder_SetAssetId(OH_AVMetadataBuilder* builder, const char* assetId); 16280922886Sopenharmony_ci 16380922886Sopenharmony_ci/** 16480922886Sopenharmony_ci * @brief Set the title of the resource 16580922886Sopenharmony_ci * 16680922886Sopenharmony_ci * @param builder The metadata builder instance pointer 16780922886Sopenharmony_ci * @param title The title of resource. 16880922886Sopenharmony_ci * @return Function result code: 16980922886Sopenharmony_ci * {@link AVMETADATA_SUCCESS} If the execution is successful. 17080922886Sopenharmony_ci * {@link AVMETADATA_ERROR_INVALID_PARAM}: 17180922886Sopenharmony_ci * 1.The param of builder is nullptr; 17280922886Sopenharmony_ci * 2.The param of title is nullptr. 17380922886Sopenharmony_ci * @since 13 17480922886Sopenharmony_ci */ 17580922886Sopenharmony_ciAVMetadata_Result OH_AVMetadataBuilder_SetTitle(OH_AVMetadataBuilder* builder, const char* title); 17680922886Sopenharmony_ci 17780922886Sopenharmony_ci/** 17880922886Sopenharmony_ci * @brief Set the artist of the resource 17980922886Sopenharmony_ci * 18080922886Sopenharmony_ci * @param builder The metadata builder instance pointer 18180922886Sopenharmony_ci * @param artist The artist of resource. 18280922886Sopenharmony_ci * @return Function result code: 18380922886Sopenharmony_ci * {@link AVMETADATA_SUCCESS} If the execution is successful. 18480922886Sopenharmony_ci * {@link AVMETADATA_ERROR_INVALID_PARAM}: 18580922886Sopenharmony_ci * 1.The param of builder is nullptr; 18680922886Sopenharmony_ci * 2.The param of artist is nullptr. 18780922886Sopenharmony_ci * @since 13 18880922886Sopenharmony_ci */ 18980922886Sopenharmony_ciAVMetadata_Result OH_AVMetadataBuilder_SetArtist(OH_AVMetadataBuilder* builder, const char* artist); 19080922886Sopenharmony_ci 19180922886Sopenharmony_ci/** 19280922886Sopenharmony_ci * @brief Set the author of the resource 19380922886Sopenharmony_ci * 19480922886Sopenharmony_ci * @param builder The metadata builder instance pointer 19580922886Sopenharmony_ci * @param author The author of resource. 19680922886Sopenharmony_ci * @return Function result code: 19780922886Sopenharmony_ci * {@link AVMETADATA_SUCCESS} If the execution is successful. 19880922886Sopenharmony_ci * {@link AVMETADATA_ERROR_INVALID_PARAM}: 19980922886Sopenharmony_ci * 1.The param of builder is nullptr; 20080922886Sopenharmony_ci * 2.The param of author is nullptr. 20180922886Sopenharmony_ci * @since 13 20280922886Sopenharmony_ci */ 20380922886Sopenharmony_ciAVMetadata_Result OH_AVMetadataBuilder_SetAuthor(OH_AVMetadataBuilder* builder, const char* author); 20480922886Sopenharmony_ci 20580922886Sopenharmony_ci/** 20680922886Sopenharmony_ci * @brief Set the album information 20780922886Sopenharmony_ci * 20880922886Sopenharmony_ci * @param builder The metadata builder instance pointer 20980922886Sopenharmony_ci * @param album The album name 21080922886Sopenharmony_ci * @return Return code: 21180922886Sopenharmony_ci * {@link AVMETADATA_SUCCESS} If the execution is successful. 21280922886Sopenharmony_ci * {@link AVMETADATA_ERROR_INVALID_PARAM}: 21380922886Sopenharmony_ci * 1. The param of builder is nullptr. 21480922886Sopenharmony_ci * 2. The param of album is nullptr. 21580922886Sopenharmony_ci * @since 13 21680922886Sopenharmony_ci */ 21780922886Sopenharmony_ciAVMetadata_Result OH_AVMetadataBuilder_SetAlbum(OH_AVMetadataBuilder* builder, const char* album); 21880922886Sopenharmony_ci 21980922886Sopenharmony_ci/** 22080922886Sopenharmony_ci * @brief Set the writer of the resource 22180922886Sopenharmony_ci * 22280922886Sopenharmony_ci * @param builder The metadata builder instance pointer 22380922886Sopenharmony_ci * @param writer The writer of resource. 22480922886Sopenharmony_ci * @return Function result code: 22580922886Sopenharmony_ci * {@link AVMETADATA_SUCCESS} If the execution is successful. 22680922886Sopenharmony_ci * {@link AVMETADATA_ERROR_INVALID_PARAM}: 22780922886Sopenharmony_ci * 1. The param of builder is nullptr. 22880922886Sopenharmony_ci * 2. The param of writer is nullptr. 22980922886Sopenharmony_ci * @since 13 23080922886Sopenharmony_ci */ 23180922886Sopenharmony_ciAVMetadata_Result OH_AVMetadataBuilder_SetWriter(OH_AVMetadataBuilder* builder, const char* writer); 23280922886Sopenharmony_ci 23380922886Sopenharmony_ci/** 23480922886Sopenharmony_ci * @brief Set the composer of the resource 23580922886Sopenharmony_ci * 23680922886Sopenharmony_ci * @param builder The metadata builder instance pointer 23780922886Sopenharmony_ci * @param composer The composer of resource. 23880922886Sopenharmony_ci * @return Function result code: 23980922886Sopenharmony_ci * {@link AVMETADATA_SUCCESS} If the execution is successful. 24080922886Sopenharmony_ci * {@link AVMETADATA_ERROR_INVALID_PARAM}: 24180922886Sopenharmony_ci * 1. The param of builder is nullptr. 24280922886Sopenharmony_ci * 2. The param of composer is nullptr. 24380922886Sopenharmony_ci * @since 13 24480922886Sopenharmony_ci */ 24580922886Sopenharmony_ciAVMetadata_Result OH_AVMetadataBuilder_SetComposer(OH_AVMetadataBuilder* builder, const char* composer); 24680922886Sopenharmony_ci 24780922886Sopenharmony_ci/** 24880922886Sopenharmony_ci * @brief Set the duration of the resource 24980922886Sopenharmony_ci * 25080922886Sopenharmony_ci * @param builder The metadata builder instance pointer 25180922886Sopenharmony_ci * @param duration The duration of resource, in miliseconds 25280922886Sopenharmony_ci * @return Function result code: 25380922886Sopenharmony_ci * {@link AVMETADATA_SUCCESS} If the execution is successful. 25480922886Sopenharmony_ci * {@link AVMETADATA_ERROR_INVALID_PARAM} The param of builder is nullptr. 25580922886Sopenharmony_ci * @since 13 25680922886Sopenharmony_ci */ 25780922886Sopenharmony_ciAVMetadata_Result OH_AVMetadataBuilder_SetDuration(OH_AVMetadataBuilder* builder, int64_t duration); 25880922886Sopenharmony_ci 25980922886Sopenharmony_ci/** 26080922886Sopenharmony_ci * @brief Set the media image uri of the resource 26180922886Sopenharmony_ci * 26280922886Sopenharmony_ci * @param builder The metadata builder instance pointer 26380922886Sopenharmony_ci * @param mediaImageUri The mediaImageUri of resource. 26480922886Sopenharmony_ci * @return Function result code: 26580922886Sopenharmony_ci * {@link AVMETADATA_SUCCESS} If the execution is successful. 26680922886Sopenharmony_ci * {@link AVMETADATA_ERROR_INVALID_PARAM}: 26780922886Sopenharmony_ci * 1.The param of builder is nullptr; 26880922886Sopenharmony_ci * 2.The param of mediaImageUri nullptr. 26980922886Sopenharmony_ci * @since 13 27080922886Sopenharmony_ci */ 27180922886Sopenharmony_ciAVMetadata_Result OH_AVMetadataBuilder_SetMediaImageUri(OH_AVMetadataBuilder* builder, const char* mediaImageUri); 27280922886Sopenharmony_ci 27380922886Sopenharmony_ci/** 27480922886Sopenharmony_ci * @brief Set the subtitle of the resource 27580922886Sopenharmony_ci * 27680922886Sopenharmony_ci * @param builder The metadata builder instance pointer 27780922886Sopenharmony_ci * @param subtitle The subtitle of resource. 27880922886Sopenharmony_ci * @return Function result code: 27980922886Sopenharmony_ci * {@link AVMETADATA_SUCCESS} If the execution is successful. 28080922886Sopenharmony_ci * {@link AVMETADATA_ERROR_INVALID_PARAM}: 28180922886Sopenharmony_ci * 1.The param of builder is nullptr; 28280922886Sopenharmony_ci * 2.The param of subtitle nullptr. 28380922886Sopenharmony_ci * @since 13 28480922886Sopenharmony_ci */ 28580922886Sopenharmony_ciAVMetadata_Result OH_AVMetadataBuilder_SetSubtitle(OH_AVMetadataBuilder* builder, const char* subtitle); 28680922886Sopenharmony_ci 28780922886Sopenharmony_ci/** 28880922886Sopenharmony_ci * @brief Set the media description of the resource 28980922886Sopenharmony_ci * 29080922886Sopenharmony_ci * @param builder The metadata builder instance pointer 29180922886Sopenharmony_ci * @param description The description of resource. 29280922886Sopenharmony_ci * @return Function result code: 29380922886Sopenharmony_ci * {@link AVMETADATA_SUCCESS} If the execution is successful. 29480922886Sopenharmony_ci * {@link AVMETADATA_ERROR_INVALID_PARAM}: 29580922886Sopenharmony_ci * 1.The param of builder is nullptr; 29680922886Sopenharmony_ci * 2.The param of description nullptr. 29780922886Sopenharmony_ci * @since 13 29880922886Sopenharmony_ci */ 29980922886Sopenharmony_ciAVMetadata_Result OH_AVMetadataBuilder_SetDescription(OH_AVMetadataBuilder* builder, const char* description); 30080922886Sopenharmony_ci 30180922886Sopenharmony_ci/** 30280922886Sopenharmony_ci * @brief Set the media lyric content of the resource 30380922886Sopenharmony_ci * 30480922886Sopenharmony_ci * @param builder The metadata builder instance pointer 30580922886Sopenharmony_ci * @param lyric The lyric of resource. 30680922886Sopenharmony_ci * @return Function result code: 30780922886Sopenharmony_ci * {@link AVMETADATA_SUCCESS} If the execution is successful. 30880922886Sopenharmony_ci * {@link AVMETADATA_ERROR_INVALID_PARAM}: 30980922886Sopenharmony_ci * 1.The param of builder is nullptr; 31080922886Sopenharmony_ci * 2.The param of lyric nullptr. 31180922886Sopenharmony_ci * @since 13 31280922886Sopenharmony_ci */ 31380922886Sopenharmony_ciAVMetadata_Result OH_AVMetadataBuilder_SetLyric(OH_AVMetadataBuilder* builder, const char* lyric); 31480922886Sopenharmony_ci 31580922886Sopenharmony_ci/** 31680922886Sopenharmony_ci * @brief Set the skip intervals of the resource 31780922886Sopenharmony_ci * 31880922886Sopenharmony_ci * @param builder The metadata builder instance pointer 31980922886Sopenharmony_ci * @param intervals The intervals of resource, only can be set : 10, 15, 30 32080922886Sopenharmony_ci * @return Function result code: 32180922886Sopenharmony_ci * {@link AVMETADATA_SUCCESS} If the execution is successful. 32280922886Sopenharmony_ci * {@link AVMETADATA_ERROR_INVALID_PARAM}: 32380922886Sopenharmony_ci * 1.The param of builder is nullptr; 32480922886Sopenharmony_ci * 2.The param of intervals is invalid. 32580922886Sopenharmony_ci * @since 13 32680922886Sopenharmony_ci */ 32780922886Sopenharmony_ciAVMetadata_Result OH_AVMetadataBuilder_SetSkipIntervals(OH_AVMetadataBuilder* builder, 32880922886Sopenharmony_ci AVMetadata_SkipIntervals intervals); 32980922886Sopenharmony_ci 33080922886Sopenharmony_ci/** 33180922886Sopenharmony_ci * @brief Set the display tags of the resource 33280922886Sopenharmony_ci * 33380922886Sopenharmony_ci * @param builder The metadata builder instance pointer 33480922886Sopenharmony_ci * @param tags The display tags of resource which are supported by this app to be displayed on the media center 33580922886Sopenharmony_ci * @return Function result code: 33680922886Sopenharmony_ci * {@link AVMETADATA_SUCCESS} If the execution is successful. 33780922886Sopenharmony_ci * {@link AVMETADATA_ERROR_INVALID_PARAM} The param of builder is nullptr. 33880922886Sopenharmony_ci * @since 13 33980922886Sopenharmony_ci */ 34080922886Sopenharmony_ciAVMetadata_Result OH_AVMetadataBuilder_SetDisplayTags(OH_AVMetadataBuilder* builder, int32_t tags); 34180922886Sopenharmony_ci 34280922886Sopenharmony_ci/** 34380922886Sopenharmony_ci * @brief Create the avmetadta. 34480922886Sopenharmony_ci * 34580922886Sopenharmony_ci * @param builder The metadata builder instance pointer 34680922886Sopenharmony_ci * @param avMetadata Pointer to a viriable to receive the avMetadata object. 34780922886Sopenharmony_ci * @return Function result code: 34880922886Sopenharmony_ci * {@link AVMETADATA_SUCCESS} If the execution is successful. 34980922886Sopenharmony_ci * {@link AVMETADATA_ERROR_NO_MEMORY} No memory to allocate a new instance. 35080922886Sopenharmony_ci * {@link AVMETADATA_ERROR_INVALID_PARAM}: 35180922886Sopenharmony_ci * 1.The param of builder is nullptr; 35280922886Sopenharmony_ci * 2.The param of avMetadata is nullptr. 35380922886Sopenharmony_ci * @since 13 35480922886Sopenharmony_ci */ 35580922886Sopenharmony_ciAVMetadata_Result OH_AVMetadataBuilder_GenerateAVMetadata(OH_AVMetadataBuilder* builder, 35680922886Sopenharmony_ci OH_AVMetadata** avMetadata); 35780922886Sopenharmony_ci 35880922886Sopenharmony_ci/** 35980922886Sopenharmony_ci * @brief Request to release the avmetadta. 36080922886Sopenharmony_ci * 36180922886Sopenharmony_ci * @param avMetadata Pointer to a viriable to receive the avMetadata object. 36280922886Sopenharmony_ci * @return Function result code: 36380922886Sopenharmony_ci * {@link AVMETADATA_SUCCESS} If the execution is successful. 36480922886Sopenharmony_ci * {@link AVMETADATA_ERROR_INVALID_PARAM} The param of avMetadata is nullptr. 36580922886Sopenharmony_ci * @since 13 36680922886Sopenharmony_ci */ 36780922886Sopenharmony_ciAVMetadata_Result OH_AVMetadata_Destroy(OH_AVMetadata* avMetadata); 36880922886Sopenharmony_ci 36980922886Sopenharmony_ci#ifdef __cplusplus 37080922886Sopenharmony_ci} 37180922886Sopenharmony_ci#endif 37280922886Sopenharmony_ci 37380922886Sopenharmony_ci#endif // NATIVE_AVMETADATA_H 37480922886Sopenharmony_ci/** @} */