/* * Copyright (c) 2026 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: Amlogic MP SDK Player Client Header */ #ifdef CONFIG_AMP_SERVER #pragma once #include #include #include #include #include #include "cas/AmlCasBase.h" #include "Aml_MP/Aml_MP.h" #include "utils/AmlMpHandle.h" #include "AmlMpChunkFifo.h" #include "AmlMpBuffer.h" #include "Aml_MP_PlayerBase.h" #include "Aml_MP_PlayerImpl.h" #include #include #include #include #include #include #include #include #include #include #include using namespace aml_mp; using ::android::AidlMessageQueue; using ::aidl::android::hardware::common::fmq::MQDescriptor; using ::aidl::android::hardware::common::fmq::SynchronizedReadWrite; using ::aidl::com::amlogic::aml_mp::common::AmlMpBufPoolDataPacket; using aidl::com::amlogic::aml_mp::common::AmlMpPlayerEvent; using aidl::com::amlogic::aml_mp::player::BnAmlMpPlayerCallback; using DataQueueMQ = AidlMessageQueue; using FreeQueueMQ = AidlMessageQueue; /** * Aml_MP_PlayerClient * * SDK-side player instance. * * Responsibilities: * - Owns playback state and controls * - Builds AmlMpPlayerParam and talks to IAmlMpPlayer (Binder) * - All playback and parameter logic lives here * * NOTE: * - This class is NOT part of the frozen AIDL ABI, but must * respect the frozen Binder interfaces. * - Legacy void* based APIs are kept for compatibility only. */ class Aml_MP_PlayerClient final : public Aml_MP_PlayerBase { public: using status = ::ndk::ScopedAStatus; explicit Aml_MP_PlayerClient(const Aml_MP_PlayerCreateParams* createParams); ~Aml_MP_PlayerClient(); int getId() const { return player_id; } /* int getPlayerId() const { return player_id; } int getChannelId() const { return create_params.channelId; } int getDemuxId() const { return create_params.demuxId; } int getSourceType() const { return create_params.sourceType; } uint64_t getOptions() const { return create_params.options; } */ int registerEventCallback(Aml_MP_PlayerEventCallback cb, void* userData) override; int setVideoParams(const Aml_MP_VideoParams* params) override; int setAudioParams(const Aml_MP_AudioParams* params) override; int setSubtitleParams(const Aml_MP_SubtitleParams* params) override; int setCasSession(AML_MP_CASSESSION casSession) override; int setIptvCASParams(Aml_MP_CASServiceType serviceType, const Aml_MP_IptvCASParams* params) override; int start() override; int stop() override; int pause() override; int resume() override; int flush() override; int setPlaybackRate(float rate) override; int setPlaybackRate2(float rate, Aml_MP_VideoDecodeMode decodeMode) override; int getPlaybackRate(float* rate) override; int switchAudioTrack(const Aml_MP_AudioParams* params) override; int switchSubtitleTrack(const Aml_MP_SubtitleParams* params) override; int writeData(const uint8_t* buffer, size_t size) override; int writeEsData(Aml_MP_StreamType streamType, const uint8_t* buffer, size_t size, int64_t pts) override; int getCurrentPts(Aml_MP_StreamType streamType, int64_t* pts) override; int getFirstPts(Aml_MP_StreamType streamType, int64_t* pts) override; int getBufferStat(Aml_MP_BufferStat* bufferStat) override; int setANativeWindow(ANativeWindow* nativeWindow) override; int setVideoWindow(int32_t x, int32_t y, int32_t width, int32_t height) override; int setVolume(float volume) override; int getVolume(float* volume) override; int showVideo() override; int hideVideo() override; int showSubtitle() override; int hideSubtitle() override; int setParameter(Aml_MP_PlayerParameterKey key, void* parameter) override; int getParameter(Aml_MP_PlayerParameterKey key, void* parameter) override; int setSubtitleWindow(int x, int y, int width, int height) override; int setAVSyncSource(Aml_MP_AVSyncSource syncSource) override; int setPcrPid(int pid) override; int startVideoDecoding() override; int stopVideoDecoding() override; int startAudioDecoding() override; int stopAudioDecoding() override; int startSubtitleDecoding() override; int stopSubtitleDecoding() override; int startADDecoding() override; int stopADDecoding() override; int setADParams(Aml_MP_AudioParams* params) override; int setADVolume(float volume) override; int getADVolume(float* volume) override; int getDecodingState(Aml_MP_StreamType streamType, AML_MP_DecodingState* decodingState) override; private: bool connectToService(); Aml_MP_PlayerCreateParams mCreateParams; int player_id = -1; mutable std::mutex mutex; std::shared_ptr mPlayerService; std::atomic mServiceConnected = false; char mName[64] = {}; BufPoolNode *mBufPoolBufs = nullptr; int32_t mBufPoolBufCnt = -1; int32_t mBufPoolBufOne = -1; std::atomic mBufPoolHasInit = false; int32_t mBufPoolFd = -1; void *mBufPoolPtr = nullptr; std::unique_ptr mBufPoolDataMq = nullptr; std::unique_ptr mBufPoolFreeMq = nullptr; void InitBufPool(); void FreeBufPool(); int32_t setBufPool2Servier(); ANativeWindow* mNativeWindow = nullptr; android::sp mSidebandHandle = nullptr; int mTunnelId = -1; int mMesonVtFd = -1; void clearTunnelId(); int32_t allocTunnelId(); class ClientEventCallBack : public BnAmlMpPlayerCallback { public: ClientEventCallBack(aml_mp::wptr& weakThis, int32_t playerId, Aml_MP_PlayerEventCallback cb = nullptr, void* userData = nullptr); ~ClientEventCallBack() {} status onPlayerEvent(const AmlMpPlayerEvent &event); int setCallBack(Aml_MP_PlayerEventCallback cb, void *userData); private: Aml_MP_PlayerEventCallback mCb = nullptr; void* mUserData = nullptr; wptr mClient; mutable std::mutex mutex; char mName[64] = {}; }; std::shared_ptr mCallback = nullptr; Aml_MP_CASServiceType mCasServiceType{AML_MP_CAS_SERVICE_TYPE_INVALID}; Aml_MP_IptvCASParams mIptvCasParams; sptr mWriteBuffer; AmlMpChunkFifo mTsBuffer; size_t mCacheEcmSize = 0; WaitingEcmMode mWaitingEcmMode = kWaitingEcmSynchronous; bool mWaitingEcmAtServer = true; bool mFirstEcmWritten = false; bool mIsStandaloneCas = false; bool mHasStartCas = false; sptr mCasHandle = nullptr; std::vector mEcmPids; void startDescrambling_l(); void stopDescrambling_l(); int processEcmBeforeWrite(const uint8_t* buffer, size_t size); void resetEcmVariables(); void setEcmPidToServer(); int doWriteTsData(const uint8_t* buffer, size_t size); int makeCallbackToServer(Aml_MP_PlayerEventCallback cb = nullptr, void* userData = nullptr); static void onBinderDied(void* cookie); std::atomic mServiceDead = false; AIBinder_DeathRecipient* mRecipient = nullptr; AIBinder* mRawBinder = nullptr; }; #endif