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