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