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 CODEC_DRM_DECRYPT_H
17 #define CODEC_DRM_DECRYPT_H
18 
19 #include <mutex>
20 #include "buffer/avbuffer.h"
21 #include "meta/meta.h"
22 #include "drm_i_keysession_service.h"
23 #ifdef SUPPORT_DRM
24 #include "i_keysession_service.h"
25 #include "i_mediadecryptmodule_service.h"
26 #endif
27 
28 namespace OHOS {
29 namespace MediaAVCodec {
30 
31 using namespace Media;
32 using MetaDrmSubSample = Plugins::MetaDrmSubSample;
33 using MetaDrmCencInfo = Plugins::MetaDrmCencInfo;
34 using MetaDrmCencAlgorithm = Plugins::MetaDrmCencAlgorithm;
35 using MetaDrmCencInfoMode = Plugins::MetaDrmCencInfoMode;
36 #ifdef SUPPORT_DRM
37 using DrmBuffer = DrmStandard::IMediaDecryptModuleService::DrmBuffer;
38 #endif
39 
40 enum SvpMode : int32_t {
41     SVP_CLEAR = -1, /* it's not a protection video */
42     SVP_FALSE, /* it's a protection video but not need secure decoder */
43     SVP_TRUE, /* it's a protection video and need secure decoder */
44 };
45 
46 class CodecDrmDecrypt {
47 public:
48     int32_t DrmVideoCencDecrypt(std::shared_ptr<AVBuffer> &inBuf, std::shared_ptr<AVBuffer> &outBuf,
49         uint32_t &dataSize);
50     int32_t DrmAudioCencDecrypt(std::shared_ptr<AVBuffer> &inBuf, std::shared_ptr<AVBuffer> &outBuf,
51         uint32_t &dataSize);
52     void SetCodecName(const std::string &codecName);
53     void SetDecryptionConfig(const sptr<DrmStandard::IMediaKeySessionService> &keySession,
54         const bool svpFlag);
55 
56 private:
57     void GetCodingType();
58     void DrmGetSkipClearBytes(uint32_t &skipBytes) const;
59     int32_t DrmGetNalTypeAndIndex(const uint8_t *data, uint32_t dataSize, uint8_t &nalType, uint32_t &posIndex) const;
60     static void DrmGetSyncHeaderIndex(const uint8_t *data, uint32_t dataSize, uint32_t &posIndex);
61     uint8_t DrmGetFinalNalTypeAndIndex(const uint8_t *data, uint32_t dataSize, uint32_t &posStartIndex,
62         uint32_t &posEndIndex) const;
63     static void DrmRemoveAmbiguityBytes(uint8_t *data, uint32_t &posEndIndex, uint32_t offset, uint32_t &dataSize);
64     void DrmModifyCencInfo(std::shared_ptr<AVBuffer> inBuf, uint32_t &dataSize, uint8_t isAmbiguity,
65         MetaDrmCencInfo *cencInfo) const;
66     static void SetDrmAlgoAndBlocks(uint8_t algo, MetaDrmCencInfo *cencInfo);
67     static int DrmFindAvsCeiNalUnit(const uint8_t *data, uint32_t dataSize, uint32_t &ceiStartPos, uint32_t index);
68     static int DrmFindHevcCeiNalUnit(const uint8_t *data, uint32_t dataSize, uint32_t &ceiStartPos, uint32_t index);
69     static int DrmFindH264CeiNalUnit(const uint8_t *data, uint32_t dataSize, uint32_t &ceiStartPos, uint32_t index);
70     int DrmFindCeiNalUnit(const uint8_t *data, uint32_t dataSize, uint32_t &ceiStartPos, uint32_t index) const;
71     int DrmFindCeiPos(const uint8_t *data, uint32_t dataSize, uint32_t &ceiStartPos, uint32_t &ceiEndPos) const;
72     static void DrmFindEncryptionFlagPos(const uint8_t *data, uint32_t dataSize, uint32_t &pos);
73     static int DrmGetKeyId(uint8_t *data, uint32_t &dataSize, uint32_t &pos, MetaDrmCencInfo *cencInfo);
74     static int DrmGetKeyIv(const uint8_t *data, uint32_t dataSize, uint32_t &pos, MetaDrmCencInfo *cencInfo);
75     static int DrmParseDrmDescriptor(const uint8_t *data, uint32_t dataSize, uint32_t &pos, uint8_t drmDescriptorFlag,
76         MetaDrmCencInfo *cencInfo);
77     static void DrmSetKeyInfo(const uint8_t *data, uint32_t dataSize, uint32_t ceiStartPos, uint8_t &isAmbiguity,
78         MetaDrmCencInfo *cencInfo);
79     void DrmGetCencInfo(std::shared_ptr<AVBuffer> inBuf, uint32_t dataSize, uint8_t &isAmbiguity,
80         MetaDrmCencInfo *cencInfo) const;
81     int32_t DecryptMediaData(const MetaDrmCencInfo * const cencInfo, std::shared_ptr<AVBuffer> &inBuf,
82         std::shared_ptr<AVBuffer> &outBuf);
83 #ifdef SUPPORT_DRM
84     static int32_t SetDrmBuffer(const std::shared_ptr<AVBuffer> &inBuf, const std::shared_ptr<AVBuffer> &outBuf,
85         DrmBuffer &inDrmBuffer, DrmBuffer &outDrmBuffer);
86 #endif
87 
88 private:
89     std::mutex configMutex_;
90     std::string codecName_;
91     int32_t codingType_ = 0;
92 #ifdef SUPPORT_DRM
93     sptr<DrmStandard::IMediaKeySessionService> keySessionServiceProxy_;
94     sptr<DrmStandard::IMediaDecryptModuleService> decryptModuleProxy_;
95 #endif
96     int32_t svpFlag_ = SVP_CLEAR;
97     MetaDrmCencInfoMode mode_ = MetaDrmCencInfoMode::META_DRM_CENC_INFO_KEY_IV_SUBSAMPLES_SET;
98 };
99 
100 } // namespace MediaAVCodec
101 } // namespace OHOS
102 #endif // CODEC_DRM_DECRYPT_H
103