# Multimedia_Drm
## 概述
三方应用自行实现媒体解封装,可使用本模块提供的接口设置解密参数, 且当DRM实例和会话创建完成后,以实现DRM加密节目的解密功能。
对应的开发指南及样例可参考[媒体数据解析](../../media/avcodec/audio-video-demuxer.md)。
**系统能力:** SystemCapability.Multimedia.Media.Spliter
**起始版本:** 12
## 汇总
### 文件
| 名称 | 描述 |
| -------- | -------- |
| [native_cencinfo.h](native__cencinfo_8h.md) | 声明用于设置解密参数的Native API。 |
### 结构体
| 名称 | 描述 |
| -------- | -------- |
| struct [DrmSubsample](_drm_subsample.md) | Subsample结构类型定义。 |
### 宏定义
| 名称 | 描述 |
| -------- | -------- |
| [DRM_KEY_ID_SIZE](#drm_key_id_size) 16 | Key id长度为16字节。 |
| [DRM_KEY_IV_SIZE](#drm_key_iv_size) 16 | Iv长度为16字节。 |
| [DRM_KEY_MAX_SUB_SAMPLE_NUM](#drm_key_max_sub_sample_num) 64 | 最大的Subsample数量为64个。 |
### 类型定义
| 名称 | 描述 |
| -------- | -------- |
| typedef struct [OH_AVBuffer](#oh_avbuffer) [OH_AVBuffer](#oh_avbuffer) | AVBuffer结构。 |
| typedef struct [OH_AVCencInfo](#oh_avcencinfo) [OH_AVCencInfo](#oh_avcencinfo) | AVCencInfo结构。 |
| typedef enum [DrmCencAlgorithm](#drmcencalgorithm) [DrmCencAlgorithm](#drmcencalgorithm) | Drm CENC算法类型。 |
| typedef enum [DrmCencInfoMode](#drmcencinfomode) [DrmCencInfoMode](#drmcencinfomode) | 枚举类型,表示cencInfo中keyId/iv/subsample信息是否设置。 |
| typedef struct [DrmSubsample](_drm_subsample.md) [DrmSubsample](#drmsubsample) | Subsample结构类型定义。 |
### 枚举
| 名称 | 描述 |
| -------- | -------- |
| [DrmCencAlgorithm](#drmcencalgorithm) {
DRM_ALG_CENC_UNENCRYPTED = 0x0, DRM_ALG_CENC_AES_CTR = 0x1,
DRM_ALG_CENC_AES_WV = 0x2, DRM_ALG_CENC_AES_CBC = 0x3,
DRM_ALG_CENC_SM4_CBC = 0x4, DRM_ALG_CENC_SM4_CTR = 0x5
} | Drm CENC算法类型。 |
| [DrmCencInfoMode](#drmcencinfomode) {
DRM_CENC_INFO_KEY_IV_SUBSAMPLES_SET = 0x0,
DRM_CENC_INFO_KEY_IV_SUBSAMPLES_NOT_SET = 0x1 } | 枚举类型,表示cencInfo中keyId/iv/subsample信息是否设置。 |
### 函数
| 名称 | 描述 |
| -------- | -------- |
| [OH_AVCencInfo](#oh_avcencinfo) \* [OH_AVCencInfo_Create](#oh_avcencinfo_create) () | 创建用于设置cencInfo的OH_AVCencInfo实例。 |
| OH_AVErrCode [OH_AVCencInfo_Destroy](#oh_avcencinfo_destroy) ([OH_AVCencInfo](#oh_avcencinfo) \*cencInfo) | 销毁OH_AVCencInfo实例并释放内部资源。 |
| OH_AVErrCode [OH_AVCencInfo_SetAlgorithm](#oh_avcencinfo_setalgorithm) ([OH_AVCencInfo](#oh_avcencinfo) \*cencInfo, enum [DrmCencAlgorithm](#drmcencalgorithm) algo) | 设置cencInfo加密算法。 |
| 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。 |
| 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信息。 |
| OH_AVErrCode [OH_AVCencInfo_SetMode](#oh_avcencinfo_setmode) ([OH_AVCencInfo](#oh_avcencinfo) \*cencInfo, enum [DrmCencInfoMode](#drmcencinfomode) mode) | 设置cencInfo的模式。 |
| OH_AVErrCode [OH_AVCencInfo_SetAVBuffer](#oh_avcencinfo_setavbuffer) ([OH_AVCencInfo](#oh_avcencinfo) \*cencInfo, [OH_AVBuffer](#oh_avbuffer) \*buffer) | 将cencInfo设置到AVBuffer。 |
## 宏定义说明
### DRM_KEY_ID_SIZE
```
#define DRM_KEY_ID_SIZE 16
```
**描述**
Key id长度为16字节。
**起始版本:** 12
### DRM_KEY_IV_SIZE
```
#define DRM_KEY_IV_SIZE 16
```
**描述**
Iv长度为16字节。
**起始版本:** 12
### DRM_KEY_MAX_SUB_SAMPLE_NUM
```
#define DRM_KEY_MAX_SUB_SAMPLE_NUM 64
```
**描述**
最大的Subsample数量为64个。
**起始版本:** 12
## 类型定义说明
### DrmCencAlgorithm
```
typedef enum DrmCencAlgorithm DrmCencAlgorithm
```
**描述**
Drm CENC算法类型。
**起始版本:** 12
### DrmCencInfoMode
```
typedef enum DrmCencInfoMode DrmCencInfoMode
```
**描述**
枚举类型,表示cencInfo中keyId/iv/subsample信息是否设置。
**起始版本:** 12
### DrmSubsample
```
typedef struct DrmSubsample DrmSubsample
```
**描述**
Subsample结构类型定义。
**起始版本:** 12
### OH_AVBuffer
```
typedef struct OH_AVBuffer OH_AVBuffer
```
**描述**
AVBuffer结构。
**起始版本:** 12
### OH_AVCencInfo
```
typedef struct OH_AVCencInfo OH_AVCencInfo
```
**描述**
AVCencInfo结构。
**起始版本:** 12
## 枚举类型说明
### DrmCencAlgorithm
```
enum DrmCencAlgorithm
```
**描述**
Drm CENC算法类型。
**起始版本:** 12
| 枚举值 | 描述 |
| -------- | -------- |
| DRM_ALG_CENC_UNENCRYPTED | 不加密算法。 |
| DRM_ALG_CENC_AES_CTR | AES CTR算法。 |
| DRM_ALG_CENC_AES_WV | AES WV算法。 |
| DRM_ALG_CENC_AES_CBC | AES CBC算法。 |
| DRM_ALG_CENC_SM4_CBC | SM4 CBC算法。 |
| DRM_ALG_CENC_SM4_CTR | SM4 CTR算法。 |
### DrmCencInfoMode
```
enum DrmCencInfoMode
```
**描述**
枚举类型,表示cencInfo中keyId/iv/subsample信息是否设置。
**起始版本:** 12
| 枚举值 | 描述 |
| -------- | -------- |
| DRM_CENC_INFO_KEY_IV_SUBSAMPLES_SET | keyId/iv/subsample信息已设置。 |
| DRM_CENC_INFO_KEY_IV_SUBSAMPLES_NOT_SET | keyId/iv/subsample信息未设置。 |
## 函数说明
### OH_AVCencInfo_Create()
```
OH_AVCencInfo* OH_AVCencInfo_Create ()
```
**描述**
创建用于设置cencInfo的OH_AVCencInfo实例。
**系统能力:** SystemCapability.Multimedia.Media.Spliter
**起始版本:** 12
**返回:**
返回新创建的OH_AVCencInfo对象。如果返回nullptr,则表示创建对象失败。
可能失败的原因:应用程序地址空间已满,或者对象中的数据初始化失败。
### OH_AVCencInfo_Destroy()
```
OH_AVErrCode OH_AVCencInfo_Destroy (OH_AVCencInfo * cencInfo)
```
**描述**
销毁OH_AVCencInfo实例并释放内部资源。
同一个实例只能销毁一次。在再次创建实例之前,不应使用该实例。 建议在实例销毁成功后立即将实例指针设置为nullptr。
**系统能力:** SystemCapability.Multimedia.Media.Spliter
**起始版本:** 12
**参数:**
| 名称 | 描述 |
| -------- | -------- |
| cencInfo | 指向OH_AVCencInfo实例的指针。 |
**返回:**
参考[OH_AVErrCode](_core.md#oh_averrcode):
**AV_ERR_OK** 0 - 执行成功。
**AV_ERR_INVALID_VAL** 3 - cencInfo为空。
### OH_AVCencInfo_SetAlgorithm()
```
OH_AVErrCode OH_AVCencInfo_SetAlgorithm (OH_AVCencInfo * cencInfo, enum DrmCencAlgorithm algo )
```
**描述**
设置cencInfo加密算法。
**系统能力:** SystemCapability.Multimedia.Media.Spliter
**起始版本:** 12
**参数:**
| 名称 | 描述 |
| -------- | -------- |
| cencInfo | 指向OH_AVCencInfo实例的指针。 |
| algo | 加密算法模式。 |
**返回:**
参考[OH_AVErrCode](_core.md#oh_averrcode):
**AV_ERR_OK** 0 - 执行成功。
**AV_ERR_INVALID_VAL** 3 - cencInfo为空。
### OH_AVCencInfo_SetAVBuffer()
```
OH_AVErrCode OH_AVCencInfo_SetAVBuffer (OH_AVCencInfo * cencInfo, OH_AVBuffer * buffer )
```
**描述**
将cencInfo设置到AVBuffer。
**系统能力:** SystemCapability.Multimedia.Media.Spliter
**起始版本:** 12
**参数:**
| 名称 | 描述 |
| -------- | -------- |
| cencInfo | 指向OH_AVCencInfo实例的指针。 |
| buffer | 携带数据的帧buffer。 |
**返回:**
参考[OH_AVErrCode](_core.md#oh_averrcode):
**AV_ERR_OK** 0 - 执行成功。
**AV_ERR_INVALID_VAL** 3 - 如果cencInfo为空,或者buffer为空, 或者buffer->buffer_为空,或者buffer->buffer_->meta_为空,则返回此错误码。
### OH_AVCencInfo_SetKeyIdAndIv()
```
OH_AVErrCode OH_AVCencInfo_SetKeyIdAndIv (OH_AVCencInfo * cencInfo, uint8_t * keyId, uint32_t keyIdLen, uint8_t * iv, uint32_t ivLen )
```
**描述**
设置cencInfo的keyId和iv。
**系统能力:** SystemCapability.Multimedia.Media.Spliter
**起始版本:** 12
**参数:**
| 名称 | 描述 |
| -------- | -------- |
| cencInfo | 指向OH_AVCencInfo实例的指针。 |
| keyId | Key标识。 |
| keyIdLen | Key标识长度。 |
| iv | 初始化向量。 |
| ivLen | 初始化向量长度。 |
**返回:**
参考[OH_AVErrCode](_core.md#oh_averrcode):
**AV_ERR_OK** 0 - 执行成功。
**AV_ERR_INVALID_VAL** 3 - 如果cencInfo为空,或者keyId为空,或者keyIdLen != DRM_KEY_ID_SIZE,或者iv是空,或者ivLen != DRM_KEY_IV_SIZE,或者keyId拷贝失败,或者iv拷贝失败,则返回此错误码。
### OH_AVCencInfo_SetMode()
```
OH_AVErrCode OH_AVCencInfo_SetMode (OH_AVCencInfo * cencInfo, enum DrmCencInfoMode mode )
```
**描述**
设置cencInfo的模式。
**系统能力:** SystemCapability.Multimedia.Media.Spliter
**起始版本:** 12
**参数:**
| 名称 | 描述 |
| -------- | -------- |
| cencInfo | 指向OH_AVCencInfo实例的指针。 |
| mode | cencInfo模式,指示是否设置了keyId/iv/subsample。 |
**返回:**
参考[OH_AVErrCode](_core.md#oh_averrcode):
**AV_ERR_OK** 0 - 执行成功。
**AV_ERR_INVALID_VAL** 3 - cencInfo为空。
### OH_AVCencInfo_SetSubsampleInfo()
```
OH_AVErrCode OH_AVCencInfo_SetSubsampleInfo (OH_AVCencInfo * cencInfo, uint32_t encryptedBlockCount, uint32_t skippedBlockCount, uint32_t firstEncryptedOffset, uint32_t subsampleCount, DrmSubsample * subsamples )
```
**描述**
设置cencInfo的subsamples信息。
**系统能力:** SystemCapability.Multimedia.Media.Spliter
**起始版本:** 12
**参数:**
| 名称 | 描述 |
| -------- | -------- |
| cencInfo | 指向OH_AVCencInfo实例的指针。 |
| encryptedBlockCount | 加密块的数量。 |
| skippedBlockCount | 不加密块的数量。 |
| firstEncryptedOffset | 第一个加密有效负载的偏移量。 |
| subsampleCount | Subsample数量。 |
| subsamples | Subsample内容集。 |
**返回:**
参考[OH_AVErrCode](_core.md#oh_averrcode):
**AV_ERR_OK** 0 - 执行成功。
**AV_ERR_INVALID_VAL** 3 - 如果cencInfo为空, 或者subsampleCount > DRM_KEY_MAX_SUB_SAMPLE_NUM,或者subsamples为空, 则返回此错误码。