Files

255 lines
10 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 MEDIA_SYNC_INTERFACE_H_
#define MEDIA_SYNC_INTERFACE_H_
#include <stdint.h>
typedef enum {
MEDIA_SYNC_VMASTER = 0,
MEDIA_SYNC_AMASTER = 1,
MEDIA_SYNC_PCRMASTER = 2,
MEDIA_SYNC_MODE_MAX = 255,
}sync_mode;
typedef enum {
MEDIA_VIDEO = 0,
MEDIA_AUDIO = 1,
MEDIA_DMXPCR = 2,
MEDIA_SUBTITLE = 3,
MEDIA_COMMON = 4,
MEDIA_TYPE_MAX = 255,
}sync_stream_type;
typedef enum {
MEDIA_SYNC_NOSYNC = 0,
MEDIA_SYNC_PAUSED = 1,
MEDIA_SYNC_DISCONTINUE = 2,
MEDIA_SYNC_STATUS_MAX = 255,
}sync_status;
typedef enum {
AM_MEDIASYNC_OK = 0, // OK
AM_MEDIASYNC_ERROR_INVALID_PARAMS = -1, // Parameters invalid
AM_MEDIASYNC_ERROR_INVALID_OPERATION = -2, // Operation invalid
AM_MEDIASYNC_ERROR_INVALID_OBJECT = -3, // Object invalid
AM_MEDIASYNC_ERROR_RETRY = -4, // Retry
AM_MEDIASYNC_ERROR_BUSY = -5, // Device busy
AM_MEDIASYNC_ERROR_END_OF_STREAM = -6, // End of stream
AM_MEDIASYNC_ERROR_IO = -7, // Io error
AM_MEDIASYNC_ERROR_WOULD_BLOCK = -8, // Blocking error
AM_MEDIASYNC_ERROR_MAX = -254
} mediasync_result;
typedef enum {
MEDIA_WORK_DEFAULT = 0,
MEDIA_VIDEO_WORK_DTV = 1, //video on DTV mode
MEDIA_VIDEO_WORK_MM = 2, //video on MM mode
MEDIA_AUDIO_WORK_DTV = 3, //audio on DTV mode
MEDIA_AUDIO_WORK_MM = 4, //audio on MM mode
} mediasync_av_scenario;
typedef enum {
MEDIASYNC_KEY_HASAUDIO = 0,
MEDIASYNC_KEY_HASVIDEO,
MEDIASYNC_KEY_VIDEOLATENCY, //us
MEDIASYNC_KEY_AUDIOFORMAT,
MEDIASYNC_KEY_STARTTHRESHOLD,
MEDIASYNC_KEY_ISOMXTUNNELMODE,
MEDIASYNC_KEY_AUDIOCACHE,
MEDIASYNC_KEY_VIDEOWORKMODE,
MEDIASYNC_KEY_AUDIOMUTE,
MEDIASYNC_KEY_SOURCETYPE,
MEDIASYNC_KEY_ALSAREADY,
MEDIASYNC_KEY_VSYNC_INTERVAL_MS,
MEDIASYNC_KEY_VIDEOFRAME, //set video frame rate with mediasync_fraction point
MEDIASYNC_KEY_VIDEOTRICKMODE,
MEDIASYNC_KEY_VIDEO_FREERUN,
MEDIASYNC_KEY_AUDIO_FREERUN,
MEDIASYNC_KEY_VIDEO_SYNC_THRESHOLD, //us
MEDIASYNC_KEY_AUDIO_SYNC_THRESHOLD, //us
MEDIASYNC_KEY_VIDEO_DURING_SLOW_SYNC,
MEDIASYNC_KEY_VIDEO_FRAME_ADVANCE,
MEDIASYNC_KEY_AUDIO_EQUIPMENT,
MEDIASYNC_KEY_VIDEO_DRIVER_LAYER_SYNC,
MEDIASYNC_KEY_SHOW_FIRST_FRAME_NOSYNC,
MEDIASYNC_KEY_SLOWSYNC_ENABLE,
MEDIASYNC_KEY_SLOWSYNC_PREROLL_RATE,
MEDIASYNC_KEY_SLOWSYNC_AV_TOLERANCE,
MEDIASYNC_KEY_START_STRATEGY,
MEDIASYNC_KEY_RESUME_PLAYING_PTS,
MEDIASYNC_KEY_VIDEO_HOLD,
MEDIASYNC_KEY_VIDEO_HWC_LATENCY, //vsync count
MEDIASYNC_KEY_SHOWFRAME_BEFORE_AVSYNC_STAGE,//set output first frame before av sync stage.
MEDIASYNC_KEY_RESET_VIDEO_STATE_MACHINE,
MEDIASYNC_KEY_AUDIO_WAIT_BIND_THRESHOLD, //us
MEDIASYNC_KEY_VIDEO_WAIT_BIND_THRESHOLD, //us
MEDIASYNC_KEY_AUDIO_WAIT_VIDEO_THRESHOLD, //us
MEDIASYNC_KEY_VIDEO_WAIT_AUDIO_THRESHOLD, //us
MEDIASYNC_KEY_AV_WORK_SCENARIO, // set audio video work scenario: DTV or MM with mediasync_av_scenario
MEDIASYNC_KEY_MAX = 255,
} mediasync_parameter;
typedef enum {
MEDIASYNC_UNIT_MS = 0,
MEDIASYNC_UNIT_US,
MEDIASYNC_UNIT_PTS,
MEDIASYNC_UNIT_MAX,
} mediasync_time_unit;
typedef enum {
MEDIASYNC_AUDIO_UNKNOWN = 0,
MEDIASYNC_AUDIO_NORMAL_OUTPUT,
MEDIASYNC_AUDIO_DROP_PCM,
MEDIASYNC_AUDIO_INSERT,
MEDIASYNC_AUDIO_HOLD,
MEDIASYNC_AUDIO_MUTE,
MEDIASYNC_AUDIO_RESAMPLE,
MEDIASYNC_AUDIO_ADJUST_CLOCK,
MEDIASYNC_AUDIO_EXIT,
} audio_policy;
typedef enum {
MEDIASYNC_VIDEO_UNKNOWN = 0,
MEDIASYNC_VIDEO_NORMAL_OUTPUT,
MEDIASYNC_VIDEO_HOLD,
MEDIASYNC_VIDEO_DROP,
MEDIASYNC_VIDEO_EXIT,
} video_policy;
/*Video trick mode*/
typedef enum {
VIDEO_TRICK_MODE_NONE = 0, // Disable trick mode
VIDEO_TRICK_MODE_PAUSE = 1, // Pause the video decoder
VIDEO_TRICK_MODE_PAUSE_NEXT = 2, // Pause the video decoder when a new frame displayed
VIDEO_TRICK_MODE_IONLY = 3, // Decoding and Out I frame only
VIDEO_TRICK_MODE_IONLY_SYNC_BYPASS = 4, // Decoding and Out I frame only, bypass mediasync to playback
} mediasync_video_trick_mode;
struct mediasync_audio_policy {
audio_policy audiopolicy;
int32_t param1;
int32_t param2;
};
struct mediasync_video_policy {
video_policy videopolicy;
int64_t param1;
int32_t param2;
};
struct mediasync_audio_format {
int samplerate;
int datawidth;
int channels;
int format;
};
typedef enum {
MEDIA_VIDEO_TIME = 0,
MEDIA_AUDIO_TIME = 1,
MEDIA_DMXPCR_TIME = 2,
MEDIA_STC_TIME = 3,
MEDIA_TIME_TYPE_MAX = 255,
} media_time_type;
typedef struct audioinfo{
int cacheSize;
int cacheDuration;
}mediasync_audioinfo;
typedef struct videoinfo{
int cacheSize;
int specialSizeCount;
int cacheDuration;
}mediasync_videoinfo;
struct mediasync_audio_queue_info{
int64_t apts;
int size;
int duration;
mediasync_time_unit tunit;
bool isworkingchannel;
bool isneedupdate;
};
typedef struct frameinfo{
int64_t framePts;
int64_t frameSystemTime;
}mediasync_frameinfo;
typedef struct {
int num; //numerator
int denom; //denominator
} mediasync_fraction;
typedef struct vsync_info{
int64_t lastVsyncTime;
int vsyncIntervalUs;
} mediasync_vsync_info;
extern void* MediaSync_create();
extern mediasync_result MediaSync_allocInstance(void* handle, int32_t DemuxId,
int32_t PcrPid,
int32_t *SyncInsId);
extern mediasync_result MediaSync_bindInstance(void* handle, uint32_t SyncInsId,
sync_stream_type streamtype);
extern mediasync_result MediaSync_bindStaticInstance(void* handle, uint32_t SyncInsId,
sync_stream_type streamtype);
extern mediasync_result MediaSync_setPlayerInsNumber(void* handle, int32_t number);
extern mediasync_result MediaSync_setSyncMode(void* handle, sync_mode mode);
extern mediasync_result MediaSync_getSyncMode(void* handle, sync_mode *mode);
extern mediasync_result MediaSync_setPause(void* handle, bool pause);
extern mediasync_result MediaSync_getPause(void* handle, bool *pause);
extern mediasync_result MediaSync_setStartingTimeMedia(void* handle, int64_t startingTimeMediaUs);
extern mediasync_result MediaSync_clearAnchor(void* handle);
extern mediasync_result MediaSync_updateAnchor(void* handle, int64_t anchorTimeMediaUs,
int64_t anchorTimeRealUs,
int64_t maxTimeMediaUs);
extern mediasync_result MediaSync_setPlaybackRate(void* handle, float rate);
extern mediasync_result MediaSync_getPlaybackRate(void* handle, float *rate);
extern mediasync_result MediaSync_getMediaTime(void* handle, int64_t realUs,
int64_t *outMediaUs,
bool allowPastMaxTime);
extern mediasync_result MediaSync_getRealTimeFor(void* handle, int64_t targetMediaUs, int64_t *outRealUs);
extern mediasync_result MediaSync_getRealTimeForNextVsync(void* handle, int64_t *outRealUs);
extern mediasync_result MediaSync_getTrackMediaTime(void* handle, int64_t *outMediaUs);
extern mediasync_result MediaSync_setUpdateTimeThreshold(void* handle, int64_t updateTimeThreshold);
extern mediasync_result MediaSync_getUpdateTimeThreshold(void* handle, int64_t* updateTimeThreshold);
extern mediasync_result MediaSync_setStartThreshold(void* handle, int32_t startplaythreshold);
extern mediasync_result MediaSync_getStartThreshold(void* handle, int32_t* startplaythreshold);
extern mediasync_result mediasync_setParameter(void* handle, mediasync_parameter type, void* arg);
extern mediasync_result mediasync_getParameter(void* handle, mediasync_parameter type, void* arg);
extern mediasync_result MediaSync_queueAudioFrame(void* handle, struct mediasync_audio_queue_info* info);
extern mediasync_result MediaSync_queueVideoFrame(void* handle, int64_t vpts, int size, int duration, mediasync_time_unit tunit);
extern mediasync_result MediaSync_AudioProcess(void* handle, int64_t apts, int64_t cur_apts, mediasync_time_unit tunit, struct mediasync_audio_policy* asyncPolicy);
extern mediasync_result MediaSync_VideoProcess(void* handle, int64_t vpts, int64_t cur_vpts, mediasync_time_unit tunit, struct mediasync_video_policy* vsyncPolicy);
extern mediasync_result MediaSync_getFirstAudioFrameInfo(void* handle, mediasync_frameinfo* info);
extern mediasync_result MediaSync_getCurAudioFrameInfo(void* handle, mediasync_frameinfo* info);
extern mediasync_result MediaSync_GetMediaTimeByType(void* handle, media_time_type mediaTimeType,mediasync_time_unit tunit,int64_t* mediaTime);
extern mediasync_result MediaSync_getFirstVideoFrameInfo(void* handle, mediasync_frameinfo * arg);
extern mediasync_result MediaSync_GetFirstQueueVideoInfo(void* handle, mediasync_frameinfo *info);
extern mediasync_result MediaSync_GetQueueVideoInfo(void* handle, mediasync_frameinfo *info);
extern mediasync_result MediaSync_GetVideoInfo(void* handle, mediasync_videoinfo *info);
extern mediasync_result MediaSync_GetFirstQueueAudioInfo(void* handle, mediasync_frameinfo *info);
extern mediasync_result MediaSync_GetQueueAudioInfo(void* handle, mediasync_frameinfo *info);
extern mediasync_result MediaSync_GetAudioInfo(void* handle, mediasync_audioinfo *info);
extern mediasync_result MediaSync_RegisterCb(void* handle,int type,void* pfunc,void *cbHandle);
extern mediasync_result MediaSync_setPcrAndDmxId(void* handle, int32_t DemuxId, int32_t PcrPid);
extern mediasync_result MediaSync_reset(void* handle);
extern mediasync_result MediaSync_audioSwitch(void* handle, bool start, int64_t pts);
extern void MediaSync_destroy(void* handle);
#endif // MEDIA_CLOCK_H_