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-&gt;buffer_为空,或者buffer-&gt;buffer_-&gt;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 &gt; DRM_KEY_MAX_SUB_SAMPLE_NUM,或者subsamples为空, 则返回此错误码。
436