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