Skip to content

Commit

Permalink
feat(demuxer): player will callback the drm media data when DRMMagicK…
Browse files Browse the repository at this point in the history
…ey is Valide

Signed-off-by: pingkai <pingkai010@gmail.com>
  • Loading branch information
pingkai committed Jul 28, 2020
1 parent cb32fdd commit 7e33121
Show file tree
Hide file tree
Showing 11 changed files with 67 additions and 14 deletions.
19 changes: 16 additions & 3 deletions framework/base/media/AVAFPacket.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#define FRAMEWORK_AVPACKET_H

#include "base/media/IAFPacket.h"
#include <string>

extern "C" {
#include <libavcodec/avcodec.h>
Expand Down Expand Up @@ -47,9 +48,22 @@ class AVAFPacket : public IAFPacket {

explicit operator AVPacket *();

void setMagicKey(const std::string &key) override
{
if (mMagicKey.empty()) {
mMagicKey = key;
}
}

std::string getMagicKey() override
{
return mMagicKey;
}

private:
AVPacket *mpkt{nullptr};
bool mIsProtected;
std::string mMagicKey{};

void copyInfo();
};
Expand Down Expand Up @@ -100,13 +114,12 @@ static inline AVFrame *getAVFrame(IAFFrame *frame)

static inline AVPacket *getAVPacket(IAFPacket *packet)
{
auto * avafPacket = dynamic_cast<AVAFPacket *>(packet);
auto *avafPacket = dynamic_cast<AVAFPacket *>(packet);
if (avafPacket) {
return static_cast<AVPacket *>(*(avafPacket));
}
return nullptr;

}


#endif //FRAMEWORK_AVPACKET_H
#endif//FRAMEWORK_AVPACKET_H
12 changes: 11 additions & 1 deletion framework/base/media/IAFPacket.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
#include <memory>
#include <utils/frame_work_log.h>
#include <cstring>

#include <string>
extern "C" {
//#include <libavutil/rational.h>
};
Expand Down Expand Up @@ -93,6 +93,16 @@ class CICADA_CPLUS_EXTERN IAFPacket {
}
}

virtual std::string getMagicKey()
{
return "";
}

virtual void setMagicKey(const std::string & key)
{

}


protected:
packetInfo mInfo{};
Expand Down
4 changes: 4 additions & 0 deletions framework/demuxer/avFormatDemuxer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -354,6 +354,10 @@ namespace Cicada {

packet = unique_ptr<IAFPacket>(new AVAFPacket(&pkt, mSecretDemxuer));

if (mSecretDemxuer){
packet->setMagicKey(mDrmMagicKey);
}

if (needUpdateExtraData) {
packet->setExtraData(new_extradata, new_extradata_size);
}
Expand Down
1 change: 1 addition & 0 deletions framework/demuxer/avFormatDemuxer.h
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@ namespace Cicada {
AVFormatContext *mCtx = nullptr;
int MAX_QUEUE_SIZE = 60; // about 500ms video and audio packet
bool mSecretDemxuer{false};
std::string mDrmMagicKey{};

private:
std::atomic_bool mInterrupted{false};
Expand Down
13 changes: 12 additions & 1 deletion framework/demuxer/play_list/HLSStream.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -640,6 +640,10 @@ namespace Cicada {
}

mSegDecrypter->flush();

if (mDRMMagicKey.empty() && mSegKeySource){
mDRMMagicKey = mSegKeySource->GetOption("drmMagicKey");
}
} else if (mCurSeg->encryption.method == SegmentEncryption::AES_PRIVATE) {
memset(mKey, 0, 16);
long length = mCurSeg->encryption.keyUrl.length();
Expand All @@ -661,6 +665,9 @@ namespace Cicada {
mSegDecrypter->SetOption("decryption key", mKey, 16);
mSegDecrypter->SetOption("decryption IV", &mCurSeg->encryption.iv[0], 16);
mSegDecrypter->flush();
if (mDRMMagicKey.empty() && mSegKeySource){
mDRMMagicKey = mSegDecrypter->GetOption("drmMagicKey");
}
}

return 0;
Expand All @@ -686,6 +693,9 @@ namespace Cicada {
// (int) mCurSeg->encryption.keyFormat.length());
}
}
if (mDRMMagicKey.empty() && mSegKeySource) {
mDRMMagicKey = mSegKeySource->GetOption("drmMagicKey");
}

return 0;
}
Expand Down Expand Up @@ -994,8 +1004,9 @@ namespace Cicada {
if (packet != nullptr) {
// AF_LOGD("read a frame \n");

if (mProtectedBuffer) {
if (mProtectedBuffer && !mDRMMagicKey.empty()) {
packet->setProtected();
packet->setMagicKey(mDRMMagicKey);
}
if (mPTracker->getStreamType() != STREAM_TYPE_MIXED) {
packet->getInfo().streamIndex = 0;
Expand Down
2 changes: 2 additions & 0 deletions framework/demuxer/play_list/HLSStream.h
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,8 @@ namespace Cicada {
bool mProtectedBuffer{false};

int64_t mLiveStartIndex{-3};//segment index to start live streams at (negative values are from the end)

std::string mDRMMagicKey{};
};
}

Expand Down
5 changes: 5 additions & 0 deletions framework/demuxer/play_list/segment_decrypt/ISegDecrypter.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@


#include <cstdint>
#include <string>

class ISegDecrypter {
public:
Expand All @@ -25,6 +26,10 @@ class ISegDecrypter {

virtual void SetOption(const char *key, uint8_t *buffer, int size) = 0;

virtual std::string GetOption(const std::string & key){
return "";
};

virtual void flush() = 0;

protected:
Expand Down
22 changes: 13 additions & 9 deletions mediaPlayer/SuperMediaPlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -598,6 +598,8 @@ int SuperMediaPlayer::SetOption(const char *key, const char *value)
mSet->pixelBufferOutputFormat = atol(value);
} else if (theKey == "liveStartIndex") {
mSet->mOptions.set(theKey, value, options::REPLACE);
} else if (theKey == "DRMMagicKey") {
mSet->drmMagicKey = value;
}

return 0;
Expand Down Expand Up @@ -1918,7 +1920,7 @@ RENDER_RESULT SuperMediaPlayer::RenderAudio()
duration = getPCMFrameDuration(avafFrame->ToAVFrame());
}

if (mFrameCb && !mSecretPlayBack) {
if (mFrameCb && (!mSecretPlayBack || mDrmKeyValid)) {
mFrameCb(mFrameCbUserData, avafFrame);
}

Expand Down Expand Up @@ -2125,7 +2127,7 @@ bool SuperMediaPlayer::RenderVideo(bool force_render)
AF_LOGW("drop frame,master played time is %lld,video pts is %lld\n", masterPlayedTime, videoPts);
videoFrame->setDiscard(true);

if (mFrameCb && !mSecretPlayBack) {
if (mFrameCb && (!mSecretPlayBack || mDrmKeyValid)) {
mFrameCb(mFrameCbUserData, videoFrame.get());
}
VideoRenderCallback(this, videoPts, nullptr);
Expand Down Expand Up @@ -2219,7 +2221,7 @@ void SuperMediaPlayer::OnTimer(int64_t curTime)

void SuperMediaPlayer::SendVideoFrameToRender(unique_ptr<IAFFrame> frame, bool valid)
{
if (mFrameCb && !mSecretPlayBack) {
if (mFrameCb && (!mSecretPlayBack || mDrmKeyValid)) {
bool rendered = mFrameCb(mFrameCbUserData, frame.get());
if (rendered) {
VideoRenderCallback(this, frame->getInfo().pts, nullptr);
Expand Down Expand Up @@ -2443,6 +2445,10 @@ int SuperMediaPlayer::ReadPacket()
if (pMedia_Frame->isProtected() && !mSecretPlayBack) {
AF_LOGI("SecretPlayBack\n");
mSecretPlayBack = true;

if (!pMedia_Frame->getMagicKey().empty() && pMedia_Frame->getMagicKey() == mSet->drmMagicKey){
mDrmKeyValid = true;
}
}

pFrame = pMedia_Frame.get();
Expand Down Expand Up @@ -2501,8 +2507,7 @@ int SuperMediaPlayer::ReadPacket()

if (pFrame->getInfo().streamIndex == mCurrentVideoIndex || pFrame->getInfo().streamIndex == mWillChangedVideoStreamIndex) {

// FIXME: return non slice nal only when protected packet
if (mMediaFrameCb) {
if (mMediaFrameCb && (!pMedia_Frame->isProtected() || mDrmKeyValid)) {
// TODO: change to std::unique_ptr<IAFPacket>
mMediaFrameCb(mMediaFrameCbArg, pMedia_Frame, ST_TYPE_VIDEO);
}
Expand Down Expand Up @@ -2596,16 +2601,14 @@ int SuperMediaPlayer::ReadPacket()
}
}

//TODO : cache depends on this callback. need find another way
if (mMediaFrameCb /*&& !pMedia_Frame->isProtected()*/) {
if (mMediaFrameCb && (!pMedia_Frame->isProtected() || mDrmKeyValid)) {
// TODO: change to std::unique_ptr<IAFPacket>
mMediaFrameCb(mMediaFrameCbArg, pMedia_Frame, ST_TYPE_AUDIO);
}

mBufferController->AddPacket(move(pMedia_Frame), BUFFER_TYPE_AUDIO);
} else if (pFrame->getInfo().streamIndex == mCurrentSubtitleIndex || pFrame->getInfo().streamIndex == mWillChangedSubtitleStreamIndex) {
//TODO : cache depends on this callback. need find another way
if (mMediaFrameCb /*&& !pMedia_Frame->isProtected()*/) {
if (mMediaFrameCb && (!pMedia_Frame->isProtected() || mDrmKeyValid)) {
// TODO: change to std::unique_ptr<IAFPacket>
mMediaFrameCb(mMediaFrameCbArg, pMedia_Frame, ST_TYPE_SUB);
}
Expand Down Expand Up @@ -3295,6 +3298,7 @@ void SuperMediaPlayer::Reset()
}

mSecretPlayBack = false;
mDrmKeyValid = false;
}

int SuperMediaPlayer::GetCurrentStreamIndex(StreamType type)
Expand Down
1 change: 1 addition & 0 deletions mediaPlayer/SuperMediaPlayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -508,6 +508,7 @@ namespace Cicada {
bool waitingForStart = false;
bool mBRendingStart {false};
bool mSecretPlayBack{false};
bool mDrmKeyValid{false};

private:

Expand Down
1 change: 1 addition & 0 deletions mediaPlayer/player_types.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ namespace Cicada {
maxVideoRecoverSize = 300;
mFastStart = true;
pixelBufferOutputFormat = 0;
drmMagicKey = "";
}
}

1 change: 1 addition & 0 deletions mediaPlayer/player_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ namespace Cicada {
int maxVideoRecoverSize;
bool mFastStart{true};
uint32_t pixelBufferOutputFormat;
string drmMagicKey;
};
}

Expand Down

0 comments on commit 7e33121

Please sign in to comment.