1 /*
2  * Copyright (C) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef NATIVE_AVCENCINFO_H
17 #define NATIVE_AVCENCINFO_H
18 
19 #include <stdint.h>
20 #include "native_averrors.h"
21 
22 #ifdef __cplusplus
23 extern "C" {
24 #endif
25 
26 /**
27  * @brief AVBuffer Structure.
28  * @since 12
29  * @version 1.0
30  */
31 typedef struct OH_AVBuffer OH_AVBuffer;
32 /**
33  * @brief AVCencInfo Structure.
34  * @since 12
35  * @version 1.0
36  */
37 typedef struct OH_AVCencInfo OH_AVCencInfo;
38 /**
39  * @brief Key id size.
40  * @since 12
41  * @version 1.0
42  */
43 #define DRM_KEY_ID_SIZE 16
44 /**
45  * @brief Iv size.
46  * @since 12
47  * @version 1.0
48  */
49 #define DRM_KEY_IV_SIZE 16
50 /**
51  * @brief Max subsample num.
52  * @since 12
53  * @version 1.0
54  */
55 #define DRM_KEY_MAX_SUB_SAMPLE_NUM 64
56 
57 /**
58  * @brief Drm cenc algorithm type.
59  * @since 12
60  * @version 1.0
61  */
62 typedef enum DrmCencAlgorithm {
63     /**
64      * Unencrypted.
65      */
66     DRM_ALG_CENC_UNENCRYPTED = 0x0,
67     /**
68      * Aes ctr.
69      */
70     DRM_ALG_CENC_AES_CTR = 0x1,
71     /**
72      * Aes wv.
73      */
74     DRM_ALG_CENC_AES_WV = 0x2,
75     /**
76      * Aes cbc.
77      */
78     DRM_ALG_CENC_AES_CBC = 0x3,
79     /**
80      * Sm4 cbc.
81      */
82     DRM_ALG_CENC_SM4_CBC = 0x4,
83     /**
84      * Sm4 ctr.
85      */
86     DRM_ALG_CENC_SM4_CTR = 0x5
87 } DrmCencAlgorithm;
88 
89 /**
90  * @brief Mode of cend info like set or not.
91  * @since 12
92  * @version 1.0
93  */
94 typedef enum DrmCencInfoMode {
95     /* key/iv/subsample set. */
96     DRM_CENC_INFO_KEY_IV_SUBSAMPLES_SET = 0x0,
97     /* key/iv/subsample not set. */
98     DRM_CENC_INFO_KEY_IV_SUBSAMPLES_NOT_SET = 0x1
99 } DrmCencInfoMode;
100 
101 /**
102  * @brief Subsample info of media.
103  * @since 12
104  * @version 1.0
105  */
106 typedef struct DrmSubsample {
107     /* Clear header len. */
108     uint32_t clearHeaderLen;
109     /* Payload Len. */
110     uint32_t payLoadLen;
111 } DrmSubsample;
112 
113 /**
114  * @brief Creates an OH_AVCencInfo instance for setting cencinfo.
115  * Free the resources of the instance by calling OH_AVCencInfo_Destory.
116  * @syscap SystemCapability.Multimedia.Media.Spliter
117  * @return Returns the newly created OH_AVCencInfo object. If nullptr is returned, the object failed to be created.
118  *         The possible failure is due to the application address space being full,
119  *         or the data in the initialization object has failed.
120  * @since 12
121  * @version 1.0
122  */
123 OH_AVCencInfo *OH_AVCencInfo_Create();
124 
125 /**
126  * @brief Destroy the OH_AVCencInfo instance and free the internal resources.
127  * The same instance can only be destroyed once. The destroyed instance
128  * should not be used before it is created again. It is recommended setting
129  * the instance pointer to NULL right after the instance is destroyed successfully.
130  * @syscap SystemCapability.Multimedia.Media.Spliter
131  * @param cencInfo Pointer to an OH_AVCencInfo instance.
132  * @return {@link AV_ERR_OK} 0 - Success
133  *         {@link AV_ERR_INVALID_VAL} 3 - cencInfo is nullptr.
134  * @since 12
135  * @version 1.0
136 */
137 OH_AVErrCode OH_AVCencInfo_Destroy(OH_AVCencInfo *cencInfo);
138 
139 /**
140  * @brief Method to set algo of cencinfo.
141  * @syscap SystemCapability.Multimedia.Media.Spliter
142  * @param cencInfo Pointer to an OH_AVCencInfo instance.
143  * @param algo Cenc algo.
144  * @return {@link AV_ERR_OK} 0 - Success
145  *         {@link AV_ERR_INVALID_VAL} 3 - cencInfo is nullptr.
146  * @since 12
147  * @version 1.0
148  */
149 OH_AVErrCode OH_AVCencInfo_SetAlgorithm(OH_AVCencInfo *cencInfo, enum DrmCencAlgorithm algo);
150 
151 /**
152  * @brief Method to set key id and iv of cencinfo.
153  * @syscap SystemCapability.Multimedia.Media.Spliter
154  * @param cencInfo Pointer to an OH_AVCencInfo instance.
155  * @param keyId Key id.
156  * @param keyIdLen Key id len.
157  * @param iv Iv.
158  * @param ivLen Iv len.
159  * @return {@link AV_ERR_OK} 0 - Success
160  *         {@link AV_ERR_INVALID_VAL} 3 - If cencInfo is nullptr, or keyId is nullptr, or keyIdLen != DRM_KEY_ID_SIZE,
161  *         or iv is nullptr, or ivLen != DRM_KEY_IV_SIZE, or keyId copy fails, or iv copy fails.
162  * @since 12
163  * @version 1.0
164  */
165 OH_AVErrCode OH_AVCencInfo_SetKeyIdAndIv(OH_AVCencInfo *cencInfo, uint8_t *keyId,
166     uint32_t keyIdLen, uint8_t *iv, uint32_t ivLen);
167 
168 /**
169  * @brief Method to set subsample info of cencinfo.
170  * @syscap SystemCapability.Multimedia.Media.Spliter
171  * @param cencInfo Pointer to an OH_AVCencInfo instance.
172  * @param encryptedBlockCount Number of encrypted blocks.
173  * @param skippedBlockCount Number of skip(clear) blocks.
174  * @param firstEncryptedOffset Offset of first encrypted payload.
175  * @param subsampleCount Subsample num.
176  * @param subsamples Subsample info
177  * @return {@link AV_ERR_OK} 0 - Success
178  *         {@link AV_ERR_INVALID_VAL} 3 - If cencInfo is nullptr, or subsampleCount > DRM_KEY_MAX_SUB_SAMPLE_NUM,
179  *         or subsamples is nullptr.
180  * @since 12
181  * @version 1.0
182  */
183 OH_AVErrCode OH_AVCencInfo_SetSubsampleInfo(OH_AVCencInfo *cencInfo, uint32_t encryptedBlockCount,
184     uint32_t skippedBlockCount, uint32_t firstEncryptedOffset, uint32_t subsampleCount, DrmSubsample *subsamples);
185 
186 /**
187  * @brief Method to set mode of cencinfo.
188  * @syscap SystemCapability.Multimedia.Media.Spliter
189  * @param cencInfo Pointer to an OH_AVCencInfo instance.
190  * @param mode Cenc mode, indicate whether key/iv/subsample set or not.
191  * @return {@link AV_ERR_OK} 0 - Success
192  *         {@link AV_ERR_INVALID_VAL} 3 - cencInfo is nullptr.
193  * @since 12
194  * @version 1.0
195  */
196 OH_AVErrCode OH_AVCencInfo_SetMode(OH_AVCencInfo *cencInfo, enum DrmCencInfoMode mode);
197 
198 /**
199  * @brief Method to attach cencinfo to AVBuffer.
200  * @syscap SystemCapability.Multimedia.Media.Spliter
201  * @param cencInfo Pointer to an OH_AVCencInfo instance.
202  * @param buffer AVBuffer to attach cencinfo.
203  * @return {@link AV_ERR_OK} 0 - Success
204  *         {@link AV_ERR_INVALID_VAL} 3 - If cencInfo is nullptr, or buffer is nullptr, or buffer->buffer_ is nullptr,
205  *         or buffer->buffer_->meta_ is nullptr.
206  * @since 12
207  * @version 1.0
208  */
209 OH_AVErrCode OH_AVCencInfo_SetAVBuffer(OH_AVCencInfo *cencInfo, OH_AVBuffer *buffer);
210 
211 #ifdef __cplusplus
212 }
213 #endif
214 
215 #endif // NATIVE_AVCENCINFO_H