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