Files
2026-08-24 10:03:24 +08:00

179 lines
4.7 KiB
C++

/*
* 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 _AML_MP_MEDIAPLAYER_IMPL_H_
#define _AML_MP_MEDIAPLAYER_IMPL_H_
#include <Aml_MP/Aml_MediaPlayer.h>
#include <utils/AmlMpRefBase.h>
#include <utils/AmlMpHandle.h>
#include <utils/AmlMpPlayerRoster.h>
#ifdef ANDROID
#include <system/window.h>
#endif
#include <mutex>
#include <map>
#include "utils/AmlMpChunkFifo.h"
#include <condition_variable>
#include "cas/AmlCasBase.h"
#include "demux/AmlTsParser.h"
#ifdef ANDROID
#ifndef __ANDROID_VNDK__
#include <gui/Surface.h>
#include <gui/SurfaceComposerClient.h>
#endif
#endif
#ifdef ANDROID
#include <utils/RefBase.h>
#endif
#include "AmlMediaPlayerBase.h"
namespace aml_mp {
#ifdef ANDROID
using android::RefBase;
#endif
class AmlMediaPlayerBase;
class AmlMpConfig;
class AmlMpMediaPlayerImpl final : public AmlMpHandle
{
public:
explicit AmlMpMediaPlayerImpl();
~AmlMpMediaPlayerImpl();
int setDataSource(const char *uri);
int setANativeWindow(ANativeWindow* nativeWindow);
int setVideoWindow(int32_t x, int32_t y, int32_t width, int32_t height);
int prepare();
int prepareAsync();
int start();
int seekTo(int msec);
int pause();
int resume();
int stop();
int reset();
int release();
int getCurrentPosition(int* msec);
int getDuration(int* msec);
int setMute(bool mute);
int setVolume(float volume);
int getVolume(float* volume);
int showVideo();
int hideVideo();
int showSubtitle();
int hideSubtitle();
int setSubtitleWindow(int x, int y, int width, int height);
int invoke(Aml_MP_MediaPlayerInvokeRequest* request, Aml_MP_MediaPlayerInvokeReply* reply);
int setAVSyncSource(Aml_MP_MediaPlayerAVSyncSource syncSource);
int setParameter(Aml_MP_MediaPlayerParameterKey key, void* parameter);
int getParameter(Aml_MP_MediaPlayerParameterKey key, void* parameter);
bool isPlaying();
int registerEventCallBack(Aml_MP_MediaPlayerEventCallback cb, void* userData);
int setPlaybackRate(float rate);
int setLooping(int loop);
private:
enum State {
STATE_IDLE,
STATE_INITED,
STATE_PREPARING,
STATE_PREPARED,
STATE_RUNNING,
STATE_PAUSED,
STATE_STOPPED,
STATE_COMPLETED,
};
struct WindowSize {
int x = 0;
int y = 0;
int width = -1;
int height = -1;
};
private:
int setDataSource_l(const char * uri);
int prepare_l();
int prepareAsync_l();
int start_l();
int seekTo_l(int msec);
int pause_l();
int resume_l();
int stop_l();
int reset_l();
int release_l();
int getCurrentPosition_l(int* msec);
int getDuration_l(int* msec);
int setMute_l(bool mute);
int setVolume_l(float volume);
int getVolume_l(float* volume);
int showVideo_l();
int hideVideo_l();
int showSubtitle_l();
int hideSubtitle_l();
int setSubtitleWindow_l(int x, int y, int width, int height);
int invoke_l(Aml_MP_MediaPlayerInvokeRequest* request, Aml_MP_MediaPlayerInvokeReply* reply);
int setAVSyncSource_l(Aml_MP_AVSyncSource syncSource);
int setParameter_l(Aml_MP_MediaPlayerParameterKey key, void* parameter);
int getParameter_l(Aml_MP_MediaPlayerParameterKey key, void* parameter);
bool isPlaying_l();
void notifyListener(Aml_MP_MediaPlayerEventType eventType, int64_t param);
int setPlaybackRate_l(float rate);
int setLooping_l(int loop);
const char* stateString(State state);
void setState_l(State state);
private:
const int mInstanceId;
char mName[50];
AmlMediaPlayerBase* mPlayer;
//playback
float mPlaybackRate = 1.0f;
Aml_MP_VideoDecodeMode mVideoDecodeMode{AML_MP_VIDEO_DECODE_MODE_NONE};
float mVolume = 1.0f;
bool mMute = 0;
mutable std::mutex mLock;
State mState{STATE_IDLE};
//event
std::mutex mEventLock;
Aml_MP_MediaPlayerEventCallback mEventCb = nullptr;
void* mUserData = nullptr;
//surface
#ifdef ANDROID
android::sp<ANativeWindow> mNativeWindow;
int mZorder;
#ifndef __ANDROID_VNDK__
android::sp<android::SurfaceComposerClient> mComposerClient;
android::sp<android::SurfaceControl> mSurfaceControl;
android::sp<android::Surface> mSurface = nullptr;
#endif
#endif
WindowSize mVideoWindow;
//subtitle
WindowSize mSubtitleWindow;
//syncSource
Aml_MP_AVSyncSource mSyncSource = AML_MP_AVSYNC_SOURCE_DEFAULT;
private:
AmlMpMediaPlayerImpl(const AmlMpMediaPlayerImpl&) = delete;
AmlMpMediaPlayerImpl& operator= (const AmlMpMediaPlayerImpl&) = delete;
};
}
#endif