blob: 6e436ab32bed3e97bac19a91390953fa1df207b1 [file] [log] [blame]
/*
* Copyright (C) 2020 Amlogic, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
*/
#ifndef AML_MSYNC_H
#define AML_MSYNC_H
#ifndef __KERNEL__
#include <stdint.h>
#endif
struct pts_tri {
uint32_t wall_clock;
uint32_t pts;
uint32_t delay;
};
struct pcr_pair {
uint32_t pts;
uint64_t mono_clock;
};
struct pts_wall {
uint32_t wall_clock;
uint32_t interval;
};
enum av_sync_mode {
AVS_MODE_A_MASTER,
AVS_MODE_V_MASTER,
AVS_MODE_PCR_MASTER,
AVS_MODE_IPTV,
AVS_MODE_FREE_RUN
};
struct session_sync_stat {
uint32_t v_active;
uint32_t a_active;
/* enum av_sync_mode */
uint32_t mode;
/* valid in aligned sync */
uint32_t v_timeout;
/* in audio switching process */
uint32_t audio_switch;
};
enum avs_event {
AVS_VIDEO_START,
AVS_PAUSE,
AVS_RESUME,
AVS_VIDEO_STOP,
AVS_AUDIO_STOP,
AVS_VIDEO_TSTAMP_DISCONTINUITY,
AVS_AUDIO_TSTAMP_DISCONTINUITY,
AVS_AUDIO_SWITCH,
AVS_EVENT_MAX,
};
enum avs_astart_mode {
AVS_START_SYNC = 0,
AVS_START_ASYNC,
AVS_START_AGAIN,
AVS_START_MAX
};
struct audio_start {
/* in first audio pts */
uint32_t pts;
/* in render delay */
uint32_t delay;
/* out enum avs_astart_mode */
uint32_t mode;
};
struct session_event {
/* enum avs_event */
uint32_t event;
uint32_t value;
};
struct session_debug {
uint32_t debug_freerun;
uint32_t pcr_init_flag;
uint32_t pcr_init_mode;
};
#define AVS_INVALID_PTS 0xFFFFFFFFUL
#define AMSYNC_START_V_FIRST 0x1
#define AMSYNC_START_A_FIRST 0x2
#define AMSYNC_START_ASAP 0x3
#define AMSYNC_START_ALIGN 0x4
/* msync ioctl */
#define _A_M_S 'M'
#define AMSYNC_IOC_ALLOC_SESSION _IOW((_A_M_S), 0x00, int)
#define AMSYNC_IOC_REMOVE_SESSION _IOR((_A_M_S), 0x01, int)
/* session ioctl */
#define _A_M_SS 'S'
#define AMSYNCS_IOC_SET_MODE _IOW((_A_M_SS), 0x00, unsigned int)
#define AMSYNCS_IOC_GET_MODE _IOR((_A_M_SS), 0x01, unsigned int)
#define AMSYNCS_IOC_SET_START_POLICY _IOW((_A_M_SS), 0x02, unsigned int)
#define AMSYNCS_IOC_GET_START_POLICY _IOR((_A_M_SS), 0x03, unsigned int)
#define AMSYNCS_IOC_SET_V_TS _IOW((_A_M_SS), 0x04, struct pts_tri)
#define AMSYNCS_IOC_GET_V_TS _IOWR((_A_M_SS), 0x05, struct pts_tri)
#define AMSYNCS_IOC_SET_A_TS _IOW((_A_M_SS), 0x06, struct pts_tri)
#define AMSYNCS_IOC_GET_A_TS _IOWR((_A_M_SS), 0x07, struct pts_tri)
#define AMSYNCS_IOC_SEND_EVENT _IOWR((_A_M_SS), 0x08, struct session_event)
//For PCR/IPTV mode only
#define AMSYNCS_IOC_GET_SYNC_STAT _IOWR((_A_M_SS), 0x09, struct session_sync_stat)
#define AMSYNCS_IOC_SET_PCR _IOW((_A_M_SS), 0x0a, struct pcr_pair)
#define AMSYNCS_IOC_GET_PCR _IOWR((_A_M_SS), 0x0b, struct pcr_pair)
#define AMSYNCS_IOC_GET_WALL _IOR((_A_M_SS), 0x0c, struct pts_wall)
#define AMSYNCS_IOC_SET_RATE _IOW((_A_M_SS), 0x0d, unsigned int)
#define AMSYNCS_IOC_GET_RATE _IOR((_A_M_SS), 0x0e, unsigned int)
#define AMSYNCS_IOC_SET_NAME _IOR((_A_M_SS), 0x0f, char *)
#define AMSYNCS_IOC_SET_WALL_ADJ_THRES _IOW((_A_M_SS), 0x10, unsigned int)
#define AMSYNCS_IOC_GET_WALL_ADJ_THRES _IOR((_A_M_SS), 0x11, unsigned int)
#define AMSYNCS_IOC_GET_CLOCK_START _IOR((_A_M_SS), 0x12, unsigned int)
#define AMSYNCS_IOC_AUDIO_START _IOW((_A_M_SS), 0x13, struct audio_start)
#define AMSYNCS_IOC_SET_CLK_DEV _IOW((_A_M_SS), 0x14, int)
#define AMSYNCS_IOC_GET_CLK_DEV _IOR((_A_M_SS), 0x15, int)
//For debuging
#define AMSYNCS_IOC_GET_DEBUG_MODE _IOR((_A_M_SS), 0x100, struct session_debug)
int msync_vsync_update(void);
#endif