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