/* * Copyright (c) 2020 Amlogic, Inc. All rights reserved. * * This source code is subject to the terms and conditions defined in the * file 'LICENSE' which is part of this source code package. * * Description: */ #ifndef _PLAYBACK_H_ #define _PLAYBACK_H_ #include "demux/AmlTsParser.h" #include "source/Source.h" #ifdef ANDROID #include #include #endif #include #include "TestModule.h" #include "AmlMpTestSupporter.h" #include "BufferQueue.h" namespace aml_mp { class CasPlugin : public AmlMpRefBase { public: CasPlugin(Aml_MP_DemuxId demuxId, Aml_MP_InputSourceType sourceType, const sptr& programInfo); ~CasPlugin(); int start(); int stop(); void setPMTSectionData(const sptr& pmt); void setCATSectionData(const sptr& cat); AML_MP_CASSESSION casSession() const { return mCasSession; } Aml_MP_InputStreamType inputStreamType() const { return mInputStreamType; } private: int startDVBDescrambling(); int startIPTVDescrambling(); int stopDVBDescrambling(); int stopIPTVDescrambling(); const Aml_MP_DemuxId mDemuxId{AML_MP_DEMUX_ID_DEFAULT}; const Aml_MP_InputSourceType mSourceType; const sptr mProgramInfo; Aml_MP_InputStreamType mInputStreamType{AML_MP_INPUT_STREAM_ENCRYPTED}; AML_MP_CASSESSION mCasSession = nullptr; AML_MP_SECMEM mSecMem = nullptr; CasPlugin(const CasPlugin&) = delete; CasPlugin& operator=(const CasPlugin&) = delete; }; class TsDemuxer : public AmlMpRefBase { public: using StreamConsumer = int(Aml_MP_StreamType type, const uint8_t* data, size_t size, int64_t pts); TsDemuxer(Aml_MP_DemuxType demuxType, Aml_MP_DemuxId demuxId); ~TsDemuxer(); int feedTs(const uint8_t* data, size_t size); void getFlowStatus(bool* underflow, bool* overflow); int openStream(Aml_MP_StreamType streamType, size_t bufferCount, size_t bufferSize, bool isSVP, const std::function& consumerCb); int closeStream(Aml_MP_StreamType streamType); int startStream(Aml_MP_StreamType streamType, int pid, Aml_MP_CodecID codec); int stopStream(Aml_MP_StreamType streamType); int pauseStream(Aml_MP_StreamType streamType); int resumeStream(Aml_MP_StreamType streamType); int notifyStreamInputBufferDone(Aml_MP_StreamType streamType, int64_t handle); private: sptr mDemux; struct Stream { sptr bufferQueue; sptr bufferQueueConsumer; std::function consumerCb; int pid; AmlDemuxBase::CHANNEL channel; AmlDemuxBase::FILTER filter; int dumpFd; sptr streamParser; size_t filterCbCount; }; Stream* getStream(Aml_MP_StreamType streamType); std::map mStreams; std::map mPids; private: TsDemuxer(const TsDemuxer&) = delete; TsDemuxer& operator=(const TsDemuxer&) = delete; }; // for iptv (encrypt) playback, dvb (encrypt) playback class Playback : public TestModule, public ISourceReceiver { public: using PlayMode = AmlMpTestSupporter::PlayMode; Playback(Aml_MP_DemuxId demuxId, Aml_MP_InputSourceType sourceType, Aml_MP_InputStreamType inputStreamType, uint64_t options); ~Playback(); #ifdef ANDROID void setANativeWindow(const android::sp& window); #endif void playerRegisterEventCallback(Aml_MP_PlayerEventCallback cb, void* userData); int start(const sptr& programInfo, AML_MP_CASSESSION casSession, PlayMode mode); int stop(); void signalQuit(); virtual int writeData(const uint8_t* buffer, size_t size) override; int setSubtitleDisplayWindow(int x, int y, int width, int height); int setVideoWindow(int x, int y, int width, int height); int setParameter(Aml_MP_PlayerParameterKey key, void* parameter); int setAVSyncSource(Aml_MP_AVSyncSource syncSource); int setPcrPid(int pid); Aml_MP_AVSyncSource mSyncSource = AML_MP_AVSYNC_SOURCE_DEFAULT; mutable std::mutex mLock; int mPcrPid = AML_MP_INVALID_PID; protected: const Command* getCommandTable() const override; void* getCommandHandle() const override; private: int startDVBDescrambling(); int stopDVBDescrambling(); int startIPTVDescrambling(); int stopIPTVDescrambling(); bool setAudioParams(); bool setADParams(); bool setVideoParams(); bool setSubtitleParams(); void printStreamsInfo(); private: void eventCallback(Aml_MP_PlayerEventType eventType, int64_t param); const Aml_MP_DemuxId mDemuxId; Aml_MP_InputStreamType mDrmMode; sptr mProgramInfo; AML_MP_PLAYER mPlayer = AML_MP_INVALID_HANDLE; Aml_MP_PlayerEventCallback mEventCallback = nullptr; Aml_MP_DVRRecorderEventCallback mDVRRecorderEventCallback = nullptr; void* mUserData = nullptr; uint64_t mOptions = 0; PlayMode mPlayMode = PlayMode::START_ALL_STOP_ALL; sptr mDemuxer; private: Playback(const Playback&) = delete; Playback& operator= (const Playback&) = delete; }; } #endif