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 /** 17 * @addtogroup Multimedia_Drm 18 * @{ 19 * 20 * @brief This feature enables third-party applications to implement the 21 * media decapsulation and demultiplexing functions by themselves instead 22 * of using the functions provided by the system. 23 * 24 * After the DRM instance and session are created, the decryption interface 25 * provided by the DRM can be invoked for decryption. The decryption parameter 26 * structure defines the transmission format of decryption parameters. 27 * 28 * @since 12 29 */ 30 31 /** 32 * @file native_cencinfo.h 33 * 34 * @brief Provides a unified entry for the native module APIs. 35 * 36 * @kit AVCodecKit 37 * @library libnative_media_avcencinfo.so 38 * @syscap SystemCapability.Multimedia.Media.Spliter 39 * @since 12 40 */ 41 42 #ifndef NATIVE_AVCENCINFO_H 43 #define NATIVE_AVCENCINFO_H 44 45 #include <stdint.h> 46 #include "native_averrors.h" 47 48 #ifdef __cplusplus 49 extern "C" { 50 #endif 51 52 /** 53 * @brief AVBuffer Structure. 54 * @since 12 55 * @version 1.0 56 */ 57 typedef struct OH_AVBuffer OH_AVBuffer; 58 /** 59 * @brief AVCencInfo Structure. 60 * @since 12 61 * @version 1.0 62 */ 63 typedef struct OH_AVCencInfo OH_AVCencInfo; 64 /** 65 * @brief Key id size. 66 * @since 12 67 * @version 1.0 68 */ 69 #define DRM_KEY_ID_SIZE 16 70 /** 71 * @brief Iv size. 72 * @since 12 73 * @version 1.0 74 */ 75 #define DRM_KEY_IV_SIZE 16 76 /** 77 * @brief Max subsample num. 78 * @since 12 79 * @version 1.0 80 */ 81 #define DRM_KEY_MAX_SUB_SAMPLE_NUM 64 82 83 /** 84 * @brief Drm cenc algorithm type. 85 * @since 12 86 * @version 1.0 87 */ 88 typedef enum DrmCencAlgorithm { 89 /** 90 * Unencrypted. 91 */ 92 DRM_ALG_CENC_UNENCRYPTED = 0x0, 93 /** 94 * Aes ctr. 95 */ 96 DRM_ALG_CENC_AES_CTR = 0x1, 97 /** 98 * Aes wv. 99 */ 100 DRM_ALG_CENC_AES_WV = 0x2, 101 /** 102 * Aes cbc. 103 */ 104 DRM_ALG_CENC_AES_CBC = 0x3, 105 /** 106 * Sm4 cbc. 107 */ 108 DRM_ALG_CENC_SM4_CBC = 0x4, 109 /** 110 * Sm4 ctr. 111 */ 112 DRM_ALG_CENC_SM4_CTR = 0x5 113 } DrmCencAlgorithm; 114 115 /** 116 * @brief Mode of cend info like set or not. 117 * @since 12 118 * @version 1.0 119 */ 120 typedef enum DrmCencInfoMode { 121 /* key/iv/subsample set. */ 122 DRM_CENC_INFO_KEY_IV_SUBSAMPLES_SET = 0x0, 123 /* key/iv/subsample not set. */ 124 DRM_CENC_INFO_KEY_IV_SUBSAMPLES_NOT_SET = 0x1 125 } DrmCencInfoMode; 126 127 /** 128 * @brief Subsample info of media. 129 * @since 12 130 * @version 1.0 131 */ 132 typedef struct DrmSubsample { 133 /* Clear header len. */ 134 uint32_t clearHeaderLen; 135 /* Payload Len. */ 136 uint32_t payLoadLen; 137 } DrmSubsample; 138 139 /** 140 * @brief Creates an OH_AVCencInfo instance for setting cencinfo. 141 * 142 * Free the resources of the instance by calling OH_AVCencInfo_Destory. 143 * @syscap SystemCapability.Multimedia.Media.Spliter 144 * @return Returns the newly created OH_AVCencInfo object. If nullptr is returned, the object failed to be created. 145 * The possible failure is due to the application address space being full, 146 * or the data in the initialization object has failed. 147 * @since 12 148 * @version 1.0 149 */ 150 OH_AVCencInfo *OH_AVCencInfo_Create(); 151 152 /** 153 * @brief Destroy the OH_AVCencInfo instance and free the internal resources. 154 * 155 * The same instance can only be destroyed once. The destroyed instance 156 * should not be used before it is created again. It is recommended setting 157 * the instance pointer to NULL right after the instance is destroyed successfully. 158 * @syscap SystemCapability.Multimedia.Media.Spliter 159 * @param cencInfo Pointer to an OH_AVCencInfo instance. 160 * @return {@link AV_ERR_OK} 0 - Success 161 * {@link AV_ERR_INVALID_VAL} 3 - cencInfo is nullptr. 162 * @since 12 163 * @version 1.0 164 */ 165 OH_AVErrCode OH_AVCencInfo_Destroy(OH_AVCencInfo *cencInfo); 166 167 /** 168 * @brief Method to set algo of cencinfo. 169 * 170 * @syscap SystemCapability.Multimedia.Media.Spliter 171 * @param cencInfo Pointer to an OH_AVCencInfo instance. 172 * @param algo Cenc algo. 173 * @return {@link AV_ERR_OK} 0 - Success 174 * {@link AV_ERR_INVALID_VAL} 3 - cencInfo is nullptr. 175 * @since 12 176 * @version 1.0 177 */ 178 OH_AVErrCode OH_AVCencInfo_SetAlgorithm(OH_AVCencInfo *cencInfo, enum DrmCencAlgorithm algo); 179 180 /** 181 * @brief Method to set key id and iv of cencinfo. 182 * 183 * @syscap SystemCapability.Multimedia.Media.Spliter 184 * @param cencInfo Pointer to an OH_AVCencInfo instance. 185 * @param keyId Key id. 186 * @param keyIdLen Key id len. 187 * @param iv Iv. 188 * @param ivLen Iv len. 189 * @return {@link AV_ERR_OK} 0 - Success 190 * {@link AV_ERR_INVALID_VAL} 3 - If cencInfo is nullptr, or keyId is nullptr, or keyIdLen != DRM_KEY_ID_SIZE, 191 * or iv is nullptr, or ivLen != DRM_KEY_IV_SIZE, or keyId copy fails, or iv copy fails. 192 * @since 12 193 * @version 1.0 194 */ 195 OH_AVErrCode OH_AVCencInfo_SetKeyIdAndIv(OH_AVCencInfo *cencInfo, uint8_t *keyId, 196 uint32_t keyIdLen, uint8_t *iv, uint32_t ivLen); 197 198 /** 199 * @brief Method to set subsample info of cencinfo. 200 * 201 * @syscap SystemCapability.Multimedia.Media.Spliter 202 * @param cencInfo Pointer to an OH_AVCencInfo instance. 203 * @param encryptedBlockCount Number of encrypted blocks. 204 * @param skippedBlockCount Number of skip(clear) blocks. 205 * @param firstEncryptedOffset Offset of first encrypted payload. 206 * @param subsampleCount Subsample num. 207 * @param subsamples Subsample info 208 * @return {@link AV_ERR_OK} 0 - Success 209 * {@link AV_ERR_INVALID_VAL} 3 - If cencInfo is nullptr, or subsampleCount > DRM_KEY_MAX_SUB_SAMPLE_NUM, 210 * or subsamples is nullptr. 211 * @since 12 212 * @version 1.0 213 */ 214 OH_AVErrCode OH_AVCencInfo_SetSubsampleInfo(OH_AVCencInfo *cencInfo, uint32_t encryptedBlockCount, 215 uint32_t skippedBlockCount, uint32_t firstEncryptedOffset, uint32_t subsampleCount, DrmSubsample *subsamples); 216 217 /** 218 * @brief Method to set mode of cencinfo. 219 * 220 * @syscap SystemCapability.Multimedia.Media.Spliter 221 * @param cencInfo Pointer to an OH_AVCencInfo instance. 222 * @param mode Cenc mode, indicate whether key/iv/subsample set or not. 223 * @return {@link AV_ERR_OK} 0 - Success 224 * {@link AV_ERR_INVALID_VAL} 3 - cencInfo is nullptr. 225 * @since 12 226 * @version 1.0 227 */ 228 OH_AVErrCode OH_AVCencInfo_SetMode(OH_AVCencInfo *cencInfo, enum DrmCencInfoMode mode); 229 230 /** 231 * @brief Method to attach cencinfo to AVBuffer. 232 * 233 * @syscap SystemCapability.Multimedia.Media.Spliter 234 * @param cencInfo Pointer to an OH_AVCencInfo instance. 235 * @param buffer AVBuffer to attach cencinfo. 236 * @return {@link AV_ERR_OK} 0 - Success 237 * {@link AV_ERR_INVALID_VAL} 3 - If cencInfo is nullptr, or buffer is nullptr, or buffer->buffer_ is nullptr, 238 * or buffer->buffer_->meta_ is nullptr. 239 * @since 12 240 * @version 1.0 241 */ 242 OH_AVErrCode OH_AVCencInfo_SetAVBuffer(OH_AVCencInfo *cencInfo, OH_AVBuffer *buffer); 243 244 #ifdef __cplusplus 245 } 246 #endif 247 248 #endif // NATIVE_AVCENCINFO_H 249 /** @} */