Files
BPI-CM9-Linux/aml-comp/multimedia/aml_mp_sdk/player/AmlCTCPlayer.h
T
2026-08-24 10:03:24 +08:00

448 lines
11 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_CTC_PLAYER_H_
#define _AML_CTC_PLAYER_H_
#include "AmlPlayerBase.h"
//#include <CTC_MediaProcessor.h>
struct ANativeWindow;
namespace aml_mp {
typedef void * AML_HANDLE;
typedef unsigned int AML_U32;
typedef int AML_S32;
typedef void AML_VOID;
typedef int32_t AML_HADECODE_OPENPARAM_S;
typedef uint8_t AML_DMX_DATA_S;
#define AML_SUCCESS (0)
#define AML_FAILURE (-1)
#define AML_TRUE (1)
#define AML_FALSE (0)
#define AUDIO_MAX_TRACKS (10) //keep sync with CTC
////////////////////////////////////////////////////////////////////////////////
typedef enum AML_AVPLAY_EVENT_E {
EVENT_VIDEO_STREAM_INFO_CHANGED,
EVENT_AUDIO_STREAM_INFO_CHANGED,
EVENT_FIRST_IFRAME_DISPLAYED,
EVENT_FRAME_DISPLAYED, // event->data is HalPtsInfo
EVENT_VIDEO_END_OF_STREAM,
EVENT_AUDIO_END_OF_STREAM,
EVENT_SUBTITLE_DATA,
EVENT_DECODE_ERROR,
// used in SKB
EVENT_AUDIO_RECONFIG,
//AML_AVPLAY_EVENT_EOS,
// added in SKB
EVENT_AUDIO_PCM_DATA,
EVENT_AV_SYNC_LOCKED,
EVENT_AUDIO_FIRST_DECODED,
EVENT_USERDATA_READY,
EVENT_PLAY_COMPLETED,
EVENT_BAD_DECODING,
EVENT_BUFFER_FULL,
} AML_AVPLAY_EVENT_E;
typedef void (*AML_TVS_EVENT)(void* handler, AML_AVPLAY_EVENT_E evt, unsigned long param1, int param2);
typedef int (*AML_SECTION_FILTER_CB)(unsigned int u32AcquiredNum, unsigned char* pstBuf, void* pUserData);
typedef enum
{
NORMAL = 0,
BT = 1,
AUDIOMIRROR = 2,
REMOTE_SUBMIX = 3,
UNKNOWN = 4,
} AUDIO_OUTPUT_TYPE;
/////////////////////////////////////////////////////////////
// copy from AmlCommon.h
typedef enum AMLOGIC_VIDEO_CODEC_TYPE_e {
AMLOGIC_VCODEC_TYPE_UNKNOWN = 0,
AMLOGIC_VCODEC_TYPE_MPEG2 = 1,
AMLOGIC_VCODEC_TYPE_MPEG4,
AMLOGIC_VCODEC_TYPE_H263,
AMLOGIC_VCODEC_TYPE_H264,
AMLOGIC_VCODEC_TYPE_HEVC,
AMLOGIC_VCODEC_TYPE_VC1,
AMLOGIC_VCODEC_TYPE_AVS,
AMLOGIC_VCODEC_TYPE_AVS2,
} AMLOGIC_VIDEO_CODEC_TYPE;
typedef enum AMLOGIC_AUDIO_CODEC_TYPE_e {
AMLOGIC_ACODEC_TYPE_UNKNOWN = 0,
AMLOGIC_ACODEC_TYPE_MP2,
AMLOGIC_ACODEC_TYPE_AAC, // 0x0F, 0x11
AMLOGIC_ACODEC_TYPE_ADPCM, // AMLOGIC_ACODEC_TYPE_BLYRAYLPCM?
AMLOGIC_ACODEC_TYPE_DOLBY_AC3, // ??
AMLOGIC_ACODEC_TYPE_DOLBY_TRUEHD,
AMLOGIC_ACODEC_TYPE_DOLBY_AC3PLUS,
AMLOGIC_ACODEC_TYPE_DTSHD,
} AMLOGIC_AUDIO_CODEC_TYPE;
typedef struct{
uint32_t u32AudBufSize;
uint32_t u32VidBufSize;
} AML_AVPLAY_BUF_SIZE_S;
typedef struct{
uint32_t u32DemuxId;
AML_AVPLAY_BUF_SIZE_S stStreamAttr;
} AML_AVPLAY_ATTR_S;
typedef enum {
AML_AVPLAY_STREAM_TYPE_NONE = -1,
AML_AVPLAY_STREAM_TYPE_TS,
AML_AVPLAY_STREAM_TYPE_ES,
} AML_AVPLAY_STREAM_TYPE_E;
////////////////////////////////////////
//add for audio or video change
typedef enum {
AML_AVPLAY_ATTR_ID_NONE,
AML_AVPLAY_ATTR_ID_SYNC,
AML_AVPLAY_ATTR_ID_PCR_PID,
} AML_AVPLAY_ATTR_ID_E;
//add for av sync
typedef enum {
AML_UNF_SYNC_REF_NONE,
AML_UNF_SYNC_REF_AUDIO,
AML_UNF_SYNC_REF_VIDEO,
AML_UNF_SYNC_REF_PCR,
} AML_AVPLAY_SYNC_MODE_E;
typedef struct{
AML_AVPLAY_SYNC_MODE_E enSyncRef;
AML_HANDLE mDemux;
AML_U32 pcrPid;
} AML_UNF_SYNC_ATTR_S;
typedef union {
AML_UNF_SYNC_ATTR_S syncAttr;
AML_U32 pcrPid;
} AML_AVPLAY_ATTR_U;
////////////////////////////////////////
//add for pause
typedef struct{
uint32_t u32Reserved;
} AML_AVPLAY_PAUSE_OPT_S;
////////////////////////////////////////
typedef struct{
} AML_AVPLAY_RESUME_OPT_S;
////////////////////////////////////////
typedef struct{
} AML_AVPLAY_START_OPT_S;
////////////////////////////////////////
typedef struct{
} AML_AVPLAY_STOP_OPT_S;
////////////////////////////////////////
typedef struct{
} AML_AVPLAY_FLUSH_STREAM_OPT_S;
////////////////////////////////////////
//add for reset
typedef struct{
uint32_t u32SeekPtsMs;
} AML_AVPLAY_RESET_OPT_S;
////////////////////////////////////////
// add for fast play
typedef enum {
AML_AVPLAY_TPLAY_DIRECT_NONE,
AML_AVPLAY_TPLAY_DIRECT_BACKWARD,
AML_AVPLAY_TPLAY_DIRECT_FORWARD,
} AML_AVPLAY_TPLAY_DIRECT_E;
typedef struct{
AML_AVPLAY_TPLAY_DIRECT_E enTplayDirect;
uint32_t u32SpeedInteger;
uint32_t u32SpeedDecimal;
} AML_AVPLAY_TPLAY_OPT_S;
////////////////////////////////////////
typedef enum {
AML_VCODEC_MODE_NONE,
AML_VCODEC_MODE_I,
} AML_AVPLAY_VCODEC_MODE_E;
////////////////////////////////////////
//add for get av info and avsync info
typedef struct {
int64_t u32LastAudPts;
int64_t u32LastVidPts;
} AML_AVPLAY_SYNC_STATUS_S;
typedef struct {
uint32_t usedSize;
uint32_t totalSize;
int64_t bufferedUs;
} AML_AVPLAY_BUFFER_STATUS_S;
typedef struct {
AML_AVPLAY_SYNC_STATUS_S stSyncStatus;
AML_AVPLAY_BUFFER_STATUS_S videoBufferStatus;
AML_AVPLAY_BUFFER_STATUS_S audioBufferStatus;
} AML_AVPLAY_STATUS_INFO_S;
////////////////////////////////////////
//for amlvideo and amlaudio
typedef enum {
AML_PLAYER_MEDIA_CHAN_NONE,
AML_PLAYER_MEDIA_CHAN_VID,
AML_PLAYER_MEDIA_CHAN_AUD,
AML_PLAYER_MEDIA_CHAN_SUB,
} AML_PLAYER_MEDIA_CHAN_E;
typedef enum {
AML_PLAYER_ATTR_ID_NONE,
AML_PLAYER_ATTR_ID_VDEC,
AML_PLAYER_ATTR_ID_AUD_PID,
AML_PLAYER_ATTR_ID_VID_PID,
AML_PLAYER_ATTR_ID_MULTIAUD,
AML_PLAYER_ATTR_ID_EOSREACHED,
} AML_PLAYER_ATTR_ID_E;
typedef enum {
AML_UNF_VCODEC_MODE_NORMAL,
} AML_PLAYER_VCODEC_MODE_E;
typedef struct {
AMLOGIC_VIDEO_CODEC_TYPE enType;
AML_PLAYER_VCODEC_MODE_E enMode;
uint32_t u32ErrCover;
uint32_t u32Priority;
uint32_t u32Pid;
uint32_t zorder;
uint32_t width;
uint32_t height;
void* extraData;
uint32_t extraDataSize;
} AML_UNF_VCODEC_ATTR_S;
typedef struct {
AMLOGIC_AUDIO_CODEC_TYPE enType;
AML_HADECODE_OPENPARAM_S stDecodeParam;
uint32_t u32CurPid;
uint16_t zorder;
uint16_t nChannels;
uint16_t nSampleRate;
bool trackChanged;
bool audioFocusedStart;
void* extraData;
uint32_t extraDataSize;
} AML_UNF_ACODEC_ATTR_S;
typedef struct {
} AML_UNF_SUB_ATTR_S;
typedef struct {
AMLOGIC_AUDIO_CODEC_TYPE enType;
AML_UNF_ACODEC_ATTR_S pstAcodecAttr[AUDIO_MAX_TRACKS];
uint32_t u32PidNum;
uint32_t u32CurPid;
unsigned int pu32AudPid[AUDIO_MAX_TRACKS];
} AML_PLAY_MULTIAUD_ATTR_S;
typedef union {
AML_UNF_VCODEC_ATTR_S vcodecAttr;
AML_UNF_ACODEC_ATTR_S audioAttr;
AML_U32 videoPid;
AML_S32 eosReached;
AML_PLAY_MULTIAUD_ATTR_S multiAudioAttr;
} AML_PLAYER_ATTR_U;
////////////////////////////////////////
typedef enum {
AML_PLAYER_SCREEN_MODE_FIT,
AML_PLAYER_SCREEN_MODE_STRETCH,
} AML_PLAYER_SCREEN_MODE_E;
typedef enum {
AML_PLAYER_LAST_FRAME_MODE_BLACK,
AML_PLAYER_LAST_FRAME_MODE_STILL,
} AML_PLAYER_LAST_FRAME_MODE_E;
typedef struct {
AML_PLAYER_LAST_FRAME_MODE_E enMode;
AML_PLAYER_SCREEN_MODE_E screenMode;
} AML_PLAYER_VIDEO_OPEN_OPT_S;
typedef struct {
bool audioOnly;
} AML_PLAYER_AUDIO_OPEN_OPT_S;
typedef union {
AML_PLAYER_VIDEO_OPEN_OPT_S videoOptions;
AML_PLAYER_AUDIO_OPEN_OPT_S audioOptions;
} AML_PLAYER_OPEN_OPT_U;
////////////////////////////////////////
typedef struct {
} AML_PLAYER_VIDEO_START_OPT_S;
typedef struct {
} AML_PLAYER_AUDIO_START_OPT_S;
typedef union {
AML_PLAYER_VIDEO_START_OPT_S videoOptions;
AML_PLAYER_AUDIO_START_OPT_S audioOptions;
} AML_PLAYER_START_OPT_U;
////////////////////////////////////////
typedef struct {
AML_PLAYER_LAST_FRAME_MODE_E enMode;
uint32_t u32TimeoutMs;
} AML_PLAYER_VIDEO_STOP_OPT_S;
typedef struct {
} AML_PLAYER_AUDIO_STOP_OPT_S;
typedef union {
AML_PLAYER_VIDEO_STOP_OPT_S videoOptions;
AML_PLAYER_AUDIO_STOP_OPT_S audioOptions;
} AML_PLAYER_STOP_OPT_U;
////////////////////////////////////////
typedef struct {
AML_PLAYER_LAST_FRAME_MODE_E enMode;
} AML_PLAYER_VIDEO_CLOSE_OPT_S;
typedef struct {
} AML_PLAYER_AUDIO_CLOSE_OPT_S;
typedef union {
AML_PLAYER_VIDEO_CLOSE_OPT_S videoOptions;
AML_PLAYER_AUDIO_CLOSE_OPT_S audioOptions;
} AML_PLAYER_CLOSE_OPT_U;
////////////////////////////////////////
typedef enum {
AML_PLAYER_CONFIG_AUDIO_MUTE,
} AML_PLAYER_CONFIG_E;
typedef struct {
bool mute;
} AML_PLAYER_CONFIG_AUDIO_MUTE_S;
typedef union {
AML_PLAYER_CONFIG_AUDIO_MUTE_S configAudioMute;
} AML_PLAYER_CONFIG_OPT_U;
class AmlHalPlayer;
class AmlCTCPlayer : public aml_mp::AmlPlayerBase
{
public:
AmlCTCPlayer(Aml_MP_PlayerCreateParams* createParams, int instanceId);
~AmlCTCPlayer();
int setANativeWindow(ANativeWindow* nativeWindow) override;
int initCheck() const override;
int setVideoParams(const Aml_MP_VideoParams* params) override;
int setAudioParams(const Aml_MP_AudioParams* params) override;
int start() override;
int stop() override;
int pause() override;
int resume() override;
int flush() override;
int setPlaybackRate(float rate) override;
int getPlaybackRate(float* rate) override;
int switchAudioTrack(const Aml_MP_AudioParams* params) override;
int writeData(const uint8_t* buffer, size_t size) override;
int writeEsData(Aml_MP_StreamType type, const uint8_t* buffer, size_t size, int64_t pts) override;
int getCurrentPts(Aml_MP_StreamType type, int64_t* pts) override;
int getFirstPts(Aml_MP_StreamType type, int64_t* pts) override;
int getBufferStat(Aml_MP_BufferStat* bufferStat) override;
int setVideoWindow(int x, int y, int width, int height) override;
int setVolume(float volume) override;
int getVolume(float* volume) override;
int showVideo() override;
int hideVideo() override;
int setParameter(Aml_MP_PlayerParameterKey key, void* parameter) override;
int getParameter(Aml_MP_PlayerParameterKey key, void* parameter) override;
int setAVSyncSource(Aml_MP_AVSyncSource syncSource) override;
int setPcrPid(int pid) override;
int startVideoDecoding() override;
int stopVideoDecoding() override;
int pauseVideoDecoding() override;
int resumeVideoDecoding() override;
int startAudioDecoding() override;
int stopAudioDecoding() override;
int pauseAudioDecoding() override;
int resumeAudioDecoding() override;
int setADParams(const Aml_MP_AudioParams* params, bool enableMix) override;
int setADVolume(float volume) override;
int getADVolume(float* volume) override;
private:
void eventCb(AML_AVPLAY_EVENT_E event, unsigned long param1, int param2);
char mName[50];
sptr<AmlHalPlayer> mHalPlayer;
bool mVideoParaSeted = false;
bool mAudioParaSeted = false;
AML_UNF_VCODEC_ATTR_S mVideoFormat;
AML_UNF_ACODEC_ATTR_S mAudioFormat;
int mZorder = 0;
AML_HANDLE mPlayer = nullptr;
AML_HANDLE mDemux = nullptr;
bool mRequestKeepLastFrame = true;
float mVolume = 100.0f;
AML_AVPLAY_SYNC_MODE_E mAvSyncMode = AML_UNF_SYNC_REF_AUDIO;
int mPcrPid = AML_MP_INVALID_PID;
AML_AVPLAY_STREAM_TYPE_E mStreamType = AML_AVPLAY_STREAM_TYPE_TS;
ANativeWindow* mSurface = nullptr;
int mVideoTunnelId = -1;
AUDIO_OUTPUT_TYPE mAudioOutputType = AUDIO_OUTPUT_TYPE::NORMAL;
private:
AmlCTCPlayer(const AmlCTCPlayer&) = delete;
AmlCTCPlayer& operator= (const AmlCTCPlayer&) = delete;
};
}
#endif