1# Multimedia_Drm 2 3 4## 概述 5 6三方应用自行实现媒体解封装,可使用本模块提供的接口设置解密参数, 且当DRM实例和会话创建完成后,以实现DRM加密节目的解密功能。 7 8**系统能力:** SystemCapability.Multimedia.Media.Spliter 9 10**起始版本:** 12 11 12 13## 汇总 14 15 16### 文件 17 18| 名称 | 描述 | 19| -------- | -------- | 20| [native_cencinfo.h](native__cencinfo_8h.md) | 声明用于设置解密参数的Native API。 | 21 22 23### 结构体 24 25| 名称 | 描述 | 26| -------- | -------- | 27| struct [DrmSubsample](_drm_subsample.md) | Subsample结构类型定义。 | 28 29 30### 宏定义 31 32| 名称 | 描述 | 33| -------- | -------- | 34| [DRM_KEY_ID_SIZE](#drm_key_id_size) 16 | Key id长度为16字节。 | 35| [DRM_KEY_IV_SIZE](#drm_key_iv_size) 16 | Iv长度为16字节。 | 36| [DRM_KEY_MAX_SUB_SAMPLE_NUM](#drm_key_max_sub_sample_num) 64 | 最大的Subsample数量为64个。 | 37 38 39### 类型定义 40 41| 名称 | 描述 | 42| -------- | -------- | 43| typedef struct [OH_AVBuffer](#oh_avbuffer) [OH_AVBuffer](#oh_avbuffer) | AVBuffer结构。 | 44| typedef struct [OH_AVCencInfo](#oh_avcencinfo) [OH_AVCencInfo](#oh_avcencinfo) | AVCencInfo结构。 | 45| typedef enum [DrmCencAlgorithm](#drmcencalgorithm) [DrmCencAlgorithm](#drmcencalgorithm) | Drm CENC算法类型。 | 46| typedef enum [DrmCencInfoMode](#drmcencinfomode) [DrmCencInfoMode](#drmcencinfomode) | 枚举类型,表示cencInfo中keyId/iv/subsample信息是否设置。 | 47| typedef struct [DrmSubsample](_drm_subsample.md) [DrmSubsample](#drmsubsample) | Subsample结构类型定义。 | 48 49 50### 枚举 51 52| 名称 | 描述 | 53| -------- | -------- | 54| [DrmCencAlgorithm](#drmcencalgorithm) {<br/>DRM_ALG_CENC_UNENCRYPTED = 0x0, DRM_ALG_CENC_AES_CTR = 0x1,<br/>DRM_ALG_CENC_AES_WV = 0x2, DRM_ALG_CENC_AES_CBC = 0x3,<br/>DRM_ALG_CENC_SM4_CBC = 0x4, DRM_ALG_CENC_SM4_CTR = 0x5<br/>} | Drm CENC算法类型。 | 55| [DrmCencInfoMode](#drmcencinfomode) {<br/>DRM_CENC_INFO_KEY_IV_SUBSAMPLES_SET = 0x0,<br/>DRM_CENC_INFO_KEY_IV_SUBSAMPLES_NOT_SET = 0x1 } | 枚举类型,表示cencInfo中keyId/iv/subsample信息是否设置。 | 56 57 58### 函数 59 60| 名称 | 描述 | 61| -------- | -------- | 62| [OH_AVCencInfo](#oh_avcencinfo) \* [OH_AVCencInfo_Create](#oh_avcencinfo_create) () | 创建用于设置cencInfo的OH_AVCencInfo实例。 | 63| OH_AVErrCode [OH_AVCencInfo_Destroy](#oh_avcencinfo_destroy) ([OH_AVCencInfo](#oh_avcencinfo) \*cencInfo) | 销毁OH_AVCencInfo实例并释放内部资源。 | 64| OH_AVErrCode [OH_AVCencInfo_SetAlgorithm](#oh_avcencinfo_setalgorithm) ([OH_AVCencInfo](#oh_avcencinfo) \*cencInfo, enum [DrmCencAlgorithm](#drmcencalgorithm) algo) | 设置cencInfo加密算法。 | 65| OH_AVErrCode [OH_AVCencInfo_SetKeyIdAndIv](#oh_avcencinfo_setkeyidandiv) ([OH_AVCencInfo](#oh_avcencinfo) \*cencInfo, uint8_t \*keyId, uint32_t keyIdLen, uint8_t \*iv, uint32_t ivLen) | 设置cencInfo的keyId和iv。 | 66| OH_AVErrCode [OH_AVCencInfo_SetSubsampleInfo](#oh_avcencinfo_setsubsampleinfo) ([OH_AVCencInfo](#oh_avcencinfo) \*cencInfo, uint32_t encryptedBlockCount, uint32_t skippedBlockCount, uint32_t firstEncryptedOffset, uint32_t subsampleCount, [DrmSubsample](_drm_subsample.md) \*subsamples) | 设置cencInfo的subsamples信息。 | 67| OH_AVErrCode [OH_AVCencInfo_SetMode](#oh_avcencinfo_setmode) ([OH_AVCencInfo](#oh_avcencinfo) \*cencInfo, enum [DrmCencInfoMode](#drmcencinfomode) mode) | 设置cencInfo的模式。 | 68| OH_AVErrCode [OH_AVCencInfo_SetAVBuffer](#oh_avcencinfo_setavbuffer) ([OH_AVCencInfo](#oh_avcencinfo) \*cencInfo, [OH_AVBuffer](#oh_avbuffer) \*buffer) | 将cencInfo设置到AVBuffer。 | 69 70 71## 宏定义说明 72 73 74### DRM_KEY_ID_SIZE 75 76``` 77#define DRM_KEY_ID_SIZE 16 78``` 79 80**描述** 81 82Key id长度为16字节。 83 84**起始版本:** 12 85 86 87### DRM_KEY_IV_SIZE 88 89``` 90#define DRM_KEY_IV_SIZE 16 91``` 92 93**描述** 94 95Iv长度为16字节。 96 97**起始版本:** 12 98 99 100### DRM_KEY_MAX_SUB_SAMPLE_NUM 101 102``` 103#define DRM_KEY_MAX_SUB_SAMPLE_NUM 64 104``` 105 106**描述** 107 108最大的Subsample数量为64个。 109 110**起始版本:** 12 111 112 113## 类型定义说明 114 115 116### DrmCencAlgorithm 117 118``` 119typedef enum DrmCencAlgorithm DrmCencAlgorithm 120``` 121 122**描述** 123 124Drm CENC算法类型。 125 126**起始版本:** 12 127 128 129### DrmCencInfoMode 130 131``` 132typedef enum DrmCencInfoMode DrmCencInfoMode 133``` 134 135**描述** 136 137枚举类型,表示cencInfo中keyId/iv/subsample信息是否设置。 138 139**起始版本:** 12 140 141 142### DrmSubsample 143 144``` 145typedef struct DrmSubsample DrmSubsample 146``` 147 148**描述** 149 150Subsample结构类型定义。 151 152**起始版本:** 12 153 154 155### OH_AVBuffer 156 157``` 158typedef struct OH_AVBuffer OH_AVBuffer 159``` 160 161**描述** 162 163AVBuffer结构。 164 165**起始版本:** 12 166 167 168### OH_AVCencInfo 169 170``` 171typedef struct OH_AVCencInfo OH_AVCencInfo 172``` 173 174**描述** 175 176AVCencInfo结构。 177 178**起始版本:** 12 179 180 181## 枚举类型说明 182 183 184### DrmCencAlgorithm 185 186``` 187enum DrmCencAlgorithm 188``` 189 190**描述** 191 192Drm CENC算法类型。 193 194**起始版本:** 12 195 196| 枚举值 | 描述 | 197| -------- | -------- | 198| DRM_ALG_CENC_UNENCRYPTED | 不加密算法。 | 199| DRM_ALG_CENC_AES_CTR | AES CTR算法。 | 200| DRM_ALG_CENC_AES_WV | AES WV算法。 | 201| DRM_ALG_CENC_AES_CBC | AES CBC算法。 | 202| DRM_ALG_CENC_SM4_CBC | SM4 CBC算法。 | 203| DRM_ALG_CENC_SM4_CTR | SM4 CTR算法。 | 204 205 206### DrmCencInfoMode 207 208``` 209enum DrmCencInfoMode 210``` 211 212**描述** 213 214枚举类型,表示cencInfo中keyId/iv/subsample信息是否设置。 215 216**起始版本:** 12 217 218| 枚举值 | 描述 | 219| -------- | -------- | 220| DRM_CENC_INFO_KEY_IV_SUBSAMPLES_SET | keyId/iv/subsample信息已设置。 | 221| DRM_CENC_INFO_KEY_IV_SUBSAMPLES_NOT_SET | keyId/iv/subsample信息未设置。 | 222 223 224## 函数说明 225 226 227### OH_AVCencInfo_Create() 228 229``` 230OH_AVCencInfo* OH_AVCencInfo_Create () 231``` 232 233**描述** 234 235创建用于设置cencInfo的OH_AVCencInfo实例。 236 237**系统能力:** SystemCapability.Multimedia.Media.Spliter 238 239**起始版本:** 12 240 241**返回:** 242 243返回新创建的OH_AVCencInfo对象。如果返回nullptr,则表示创建对象失败。 244 245可能失败的原因:应用程序地址空间已满,或者对象中的数据初始化失败。 246 247 248### OH_AVCencInfo_Destroy() 249 250``` 251OH_AVErrCode OH_AVCencInfo_Destroy (OH_AVCencInfo * cencInfo) 252``` 253 254**描述** 255 256销毁OH_AVCencInfo实例并释放内部资源。 257 258同一个实例只能销毁一次。在再次创建实例之前,不应使用该实例。 建议在实例销毁成功后立即将实例指针设置为nullptr。 259 260**系统能力:** SystemCapability.Multimedia.Media.Spliter 261 262**起始版本:** 12 263 264**参数:** 265 266| 名称 | 描述 | 267| -------- | -------- | 268| cencInfo | 指向OH_AVCencInfo实例的指针。 | 269 270**返回:** 271 272参考[OH_AVErrCode](_core.md#oh_averrcode): 273 274**AV_ERR_OK** 0 - 执行成功。 275 276**AV_ERR_INVALID_VAL** 3 - cencInfo为空。 277 278 279### OH_AVCencInfo_SetAlgorithm() 280 281``` 282OH_AVErrCode OH_AVCencInfo_SetAlgorithm (OH_AVCencInfo * cencInfo, enum DrmCencAlgorithm algo ) 283``` 284 285**描述** 286 287设置cencInfo加密算法。 288 289**系统能力:** SystemCapability.Multimedia.Media.Spliter 290 291**起始版本:** 12 292 293**参数:** 294 295| 名称 | 描述 | 296| -------- | -------- | 297| cencInfo | 指向OH_AVCencInfo实例的指针。 | 298| algo | 加密算法模式。 | 299 300**返回:** 301 302参考[OH_AVErrCode](_core.md#oh_averrcode): 303 304**AV_ERR_OK** 0 - 执行成功。 305 306**AV_ERR_INVALID_VAL** 3 - cencInfo为空。 307 308 309### OH_AVCencInfo_SetAVBuffer() 310 311``` 312OH_AVErrCode OH_AVCencInfo_SetAVBuffer (OH_AVCencInfo * cencInfo, OH_AVBuffer * buffer ) 313``` 314 315**描述** 316 317将cencInfo设置到AVBuffer。 318 319**系统能力:** SystemCapability.Multimedia.Media.Spliter 320 321**起始版本:** 12 322 323**参数:** 324 325| 名称 | 描述 | 326| -------- | -------- | 327| cencInfo | 指向OH_AVCencInfo实例的指针。 | 328| buffer | 携带数据的帧buffer。 | 329 330**返回:** 331 332参考[OH_AVErrCode](_core.md#oh_averrcode): 333 334**AV_ERR_OK** 0 - 执行成功。 335 336**AV_ERR_INVALID_VAL** 3 - 如果cencInfo为空,或者buffer为空, 或者buffer->buffer_为空,或者buffer->buffer_->meta_为空,则返回此错误码。 337 338 339### OH_AVCencInfo_SetKeyIdAndIv() 340 341``` 342OH_AVErrCode OH_AVCencInfo_SetKeyIdAndIv (OH_AVCencInfo * cencInfo, uint8_t * keyId, uint32_t keyIdLen, uint8_t * iv, uint32_t ivLen ) 343``` 344 345**描述** 346 347设置cencInfo的keyId和iv。 348 349**系统能力:** SystemCapability.Multimedia.Media.Spliter 350 351**起始版本:** 12 352 353**参数:** 354 355| 名称 | 描述 | 356| -------- | -------- | 357| cencInfo | 指向OH_AVCencInfo实例的指针。 | 358| keyId | Key标识。 | 359| keyIdLen | Key标识长度。 | 360| iv | 初始化向量。 | 361| ivLen | 初始化向量长度。 | 362 363**返回:** 364 365参考[OH_AVErrCode](_core.md#oh_averrcode): 366 367**AV_ERR_OK** 0 - 执行成功。 368 369**AV_ERR_INVALID_VAL** 3 - 如果cencInfo为空,或者keyId为空,或者keyIdLen != DRM_KEY_ID_SIZE,或者iv是空,或者ivLen != DRM_KEY_IV_SIZE,或者keyId拷贝失败,或者iv拷贝失败,则返回此错误码。 370 371 372### OH_AVCencInfo_SetMode() 373 374``` 375OH_AVErrCode OH_AVCencInfo_SetMode (OH_AVCencInfo * cencInfo, enum DrmCencInfoMode mode ) 376``` 377 378**描述** 379 380设置cencInfo的模式。 381 382**系统能力:** SystemCapability.Multimedia.Media.Spliter 383 384**起始版本:** 12 385 386**参数:** 387 388| 名称 | 描述 | 389| -------- | -------- | 390| cencInfo | 指向OH_AVCencInfo实例的指针。 | 391| mode | cencInfo模式,指示是否设置了keyId/iv/subsample。 | 392 393**返回:** 394 395参考[OH_AVErrCode](_core.md#oh_averrcode): 396 397**AV_ERR_OK** 0 - 执行成功。 398 399**AV_ERR_INVALID_VAL** 3 - cencInfo为空。 400 401 402### OH_AVCencInfo_SetSubsampleInfo() 403 404``` 405OH_AVErrCode OH_AVCencInfo_SetSubsampleInfo (OH_AVCencInfo * cencInfo, uint32_t encryptedBlockCount, uint32_t skippedBlockCount, uint32_t firstEncryptedOffset, uint32_t subsampleCount, DrmSubsample * subsamples ) 406``` 407 408**描述** 409 410设置cencInfo的subsamples信息。 411 412**系统能力:** SystemCapability.Multimedia.Media.Spliter 413 414**起始版本:** 12 415 416**参数:** 417 418| 名称 | 描述 | 419| -------- | -------- | 420| cencInfo | 指向OH_AVCencInfo实例的指针。 | 421| encryptedBlockCount | 加密块的数量。 | 422| skippedBlockCount | 不加密块的数量。 | 423| firstEncryptedOffset | 第一个加密有效负载的偏移量。 | 424| subsampleCount | Subsample数量。 | 425| subsamples | Subsample内容集。 | 426 427**返回:** 428 429参考[OH_AVErrCode](_core.md#oh_averrcode): 430 431**AV_ERR_OK** 0 - 执行成功。 432 433**AV_ERR_INVALID_VAL** 3 - 如果cencInfo为空, 或者subsampleCount > DRM_KEY_MAX_SUB_SAMPLE_NUM,或者subsamples为空, 则返回此错误码。 434