blob: be3a803ca4cc5fd3f663ef6b6e824a1ea4de7f65 [file] [log] [blame] [edit]
/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
/*
* Copyright (c) 2019 Amlogic, Inc. All rights reserved.
*/
#ifndef AMSTREAM_H
#define AMSTREAM_H
/* #include <linux/interrupt.h> */
#include <linux/amlogic/media/utils/vformat.h>
#include <linux/amlogic/media/utils/aformat.h>
//#if IS_ENABLED(CONFIG_AMLOGIC_DEBUG_ATRACE)
#include <trace/events/meson_atrace.h>
//#endif
#include <uapi/amlogic/amvideo.h>
#include <uapi/amlogic/amvdec_ioc.h>
#ifdef __KERNEL__
#define PORT_FLAG_IN_USE 0x0001
#define PORT_FLAG_VFORMAT 0x0002
#define PORT_FLAG_AFORMAT 0x0004
#define PORT_FLAG_FORMAT (PORT_FLAG_VFORMAT | PORT_FLAG_AFORMAT)
#define PORT_FLAG_VID 0x0008
#define PORT_FLAG_AID 0x0010
#define PORT_FLAG_SID 0x0020
#define PORT_FLAG_UD 0x0040
#define PORT_FLAG_DRM 0x0080
#define PORT_FLAG_ID (PORT_FLAG_VID | \
PORT_FLAG_AID | PORT_FLAG_SID | PORT_FLAG_UD)
#define PORT_FLAG_INITED 0x100
#define PORT_FLAG_DMABUF 0x200
#define PORT_FLAG_TSYNC 0x400
#define PORT_TYPE_VIDEO 0x01
#define PORT_TYPE_AUDIO 0x02
#define PORT_TYPE_MPTS 0x04
#define PORT_TYPE_MPPS 0x08
#define PORT_TYPE_ES 0x10
#define PORT_TYPE_RM 0x20
#define PORT_TYPE_SUB 0x40
#define PORT_TYPE_SUB_RD 0x80
#define PORT_TYPE_HEVC 0x100
#define PORT_TYPE_USERDATA 0x200
#define PORT_TYPE_FRAME 0x400
#define PORT_TYPE_DECODER_SCHED 0x800
#define PORT_TYPE_DUALDEC 0x1000
#endif
#define _A_M_VS 'S'
/*
* #define AMSTREAM_IOC_UD_BUF_STATUS _IOR((_A_M),
* 0x5c, struct userdata_buf_state_t)
*/
#define GET_FIRST_APTS_FLAG _IOR((_A_M_VS), 0x82, int)
#define TRICKMODE_NONE 0x00
#define TRICKMODE_I 0x01
#define TRICKMODE_FFFB 0x02
#define TRICKMODE_I_HEVC 0x07
#define TRICK_STAT_DONE 0x01
#define TRICK_STAT_WAIT 0x00
#define MAX_SUB_NUM 32
enum VIDEO_DEC_TYPE {
VIDEO_DEC_FORMAT_UNKNOWN,
VIDEO_DEC_FORMAT_MPEG4_3,
VIDEO_DEC_FORMAT_MPEG4_4,
VIDEO_DEC_FORMAT_MPEG4_5,
VIDEO_DEC_FORMAT_H264,
VIDEO_DEC_FORMAT_MJPEG,
VIDEO_DEC_FORMAT_MP4,
VIDEO_DEC_FORMAT_H263,
VIDEO_DEC_FORMAT_REAL_8,
VIDEO_DEC_FORMAT_REAL_9,
VIDEO_DEC_FORMAT_WMV3,
VIDEO_DEC_FORMAT_WVC1,
VIDEO_DEC_FORMAT_SW,
VIDEO_DEC_FORMAT_MAX
};
/*struct vdec_status.status*/
#define STAT_TIMER_INIT 0x01
#define STAT_MC_LOAD 0x02
#define STAT_ISR_REG 0x04
#define STAT_VF_HOOK 0x08
#define STAT_TIMER_ARM 0x10
#define STAT_VDEC_RUN 0x20
#define STAT_TIMER_BACK_ARM 0x40
#define STAT_TIMER_BACK_INIT 0x80
/*struct vdec_status.status on error*/
#define PARSER_FATAL_ERROR (0x10 << 16)
#define DECODER_ERROR_VLC_DECODE_TBL (0x20 << 16)
#define PARSER_ERROR_WRONG_HEAD_VER (0x40 << 16)
#define PARSER_ERROR_WRONG_PACKAGE_SIZE (0x80 << 16)
#define DECODER_FATAL_ERROR_SIZE_OVERFLOW (0x100 << 16)
#define DECODER_FATAL_ERROR_UNKNOWN (0x200 << 16)
#define DECODER_FATAL_ERROR_NO_MEM (0x400 << 16)
#define DECODER_ERROR_MASK (0xffff << 16)
/* The total slot number for fifo_buf */
struct codec_profile_t {
char *name; /* video codec short name */
char *profile; /* Attributes,separated by commas */
};
/*******************************************************************
* 0x100~~0x1FF : set cmd
* 0x200~~0x2FF : set ex cmd
* 0x300~~0x3FF : set ptr cmd
* 0x400~~0x7FF : set reserved cmd
* 0x800~~0x8FF : get cmd
* 0x900~~0x9FF : get ex cmd
* 0xA00~~0xAFF : get ptr cmd
* 0xBFF~~0xFFF : get reserved cmd
* 0xX00~~0xX5F : amstream cmd(X: cmd type)
* 0xX60~~0xXAF : video cmd(X: cmd type)
* 0xXAF~~0xXFF : reserved cmd(X: cmd type)
******************************************************************
*/
/* amstream set cmd */
#define AMSTREAM_SET_VB_START 0x101
#define AMSTREAM_SET_VB_SIZE 0x102
#define AMSTREAM_SET_AB_START 0x103
#define AMSTREAM_SET_AB_SIZE 0x104
#define AMSTREAM_SET_VFORMAT 0x105
#define AMSTREAM_SET_AFORMAT 0x106
#define AMSTREAM_SET_VID 0x107
#define AMSTREAM_SET_AID 0x108
#define AMSTREAM_SET_SID 0x109
#define AMSTREAM_SET_PCRID 0x10A
#define AMSTREAM_SET_ACHANNEL 0x10B
#define AMSTREAM_SET_SAMPLERATE 0x10C
#define AMSTREAM_SET_DATAWIDTH 0x10D
#define AMSTREAM_SET_TSTAMP 0x10E
#define AMSTREAM_SET_TSTAMP_US64 0x10F
#define AMSTREAM_SET_APTS 0x110
#define AMSTREAM_PORT_INIT 0x111
#define AMSTREAM_SET_TRICKMODE 0x112
/* amstream,video */
#define AMSTREAM_AUDIO_RESET 0x013
#define AMSTREAM_SUB_RESET 0x114
#define AMSTREAM_DEC_RESET 0x115
#define AMSTREAM_SET_TS_SKIPBYTE 0x116
#define AMSTREAM_SET_SUB_TYPE 0x117
#define AMSTREAM_SET_PCRSCR 0x118
#define AMSTREAM_SET_DEMUX 0x119
#define AMSTREAM_SET_VIDEO_DELAY_LIMIT_MS 0x11A
#define AMSTREAM_SET_AUDIO_DELAY_LIMIT_MS 0x11B
#define AMSTREAM_SET_DRMMODE 0x11C
#define AMSTREAM_SET_VIDEO_ID 0x11E
#define AMSTREAM_SET_FCC_MODE 0x11F
/* video set cmd */
#define AMSTREAM_SET_OMX_VPTS 0x160
#define AMSTREAM_SET_VPAUSE 0x161
#define AMSTREAM_SET_AVTHRESH 0x162
#define AMSTREAM_SET_SYNCTHRESH 0x163
#define AMSTREAM_SET_SYNCENABLE 0x164
#define AMSTREAM_SET_SYNC_ADISCON 0x165
#define AMSTREAM_SET_SYNC_VDISCON 0x166
#define AMSTREAM_SET_SYNC_ADISCON_DIFF 0x167
#define AMSTREAM_SET_SYNC_VDISCON_DIFF 0x168
#define AMSTREAM_SET_VIDEO_DISABLE 0x169
#define AMSTREAM_SET_VIDEO_DISCONTINUE_REPORT 0x16A
#define AMSTREAM_SET_SCREEN_MODE 0x16B
#define AMSTREAM_SET_BLACKOUT_POLICY 0x16C
#define AMSTREAM_CLEAR_VBUF 0x16D
#define AMSTREAM_SET_CLEAR_VIDEO 0x16E
#define AMSTREAM_SET_FREERUN_MODE 0x16F
#define AMSTREAM_SET_DISABLE_SLOW_SYNC 0x170
#define AMSTREAM_SET_3D_TYPE 0x171
#define AMSTREAM_SET_VSYNC_UPINT 0x172
#define AMSTREAM_SET_VSYNC_SLOW_FACTOR 0x173
#define AMSTREAM_SET_FRAME_BASE_PATH 0x174
#define AMSTREAM_SET_EOS 0x175
#define AMSTREAM_SET_RECEIVE_ID 0x176
#define AMSTREAM_SET_IS_RESET 0x177
#define AMSTREAM_SET_NO_POWERDOWN 0x178
#define AMSTREAM_SET_DV_META_WITH_EL 0x179
/* video set ex cmd */
#define AMSTREAM_SET_EX_VIDEO_AXIS 0x260
#define AMSTREAM_SET_EX_VIDEO_CROP 0x261
/* amstream set ptr cmd */
#define AMSTREAM_SET_PTR_AUDIO_INFO 0x300
#define AMSTREAM_SET_PTR_CONFIGS 0x301
#define AMSTREAM_SET_PTR_HDR10P_DATA 0x302
/* amstream get cmd */
#define AMSTREAM_GET_SUB_LENGTH 0x800
#define AMSTREAM_GET_UD_LENGTH 0x801
#define AMSTREAM_GET_APTS_LOOKUP 0x802
#define AMSTREAM_GET_FIRST_APTS_FLAG 0x803
#define AMSTREAM_GET_APTS 0x804
#define AMSTREAM_GET_VPTS 0x805
#define AMSTREAM_GET_PCRSCR 0x806
#define AMSTREAM_GET_LAST_CHECKIN_APTS 0x807
#define AMSTREAM_GET_LAST_CHECKIN_VPTS 0x808
#define AMSTREAM_GET_LAST_CHECKOUT_APTS 0x809
#define AMSTREAM_GET_LAST_CHECKOUT_VPTS 0x80A
#define AMSTREAM_GET_SUB_NUM 0x80B
#define AMSTREAM_GET_VIDEO_DELAY_LIMIT_MS 0x80C
#define AMSTREAM_GET_AUDIO_DELAY_LIMIT_MS 0x80D
#define AMSTREAM_GET_AUDIO_CUR_DELAY_MS 0x80E
#define AMSTREAM_GET_VIDEO_CUR_DELAY_MS 0x80F
#define AMSTREAM_GET_AUDIO_AVG_BITRATE_BPS 0x810
#define AMSTREAM_GET_VIDEO_AVG_BITRATE_BPS 0x811
#define AMSTREAM_GET_ION_ID 0x812
#define AMSTREAM_GET_NEED_MORE_DATA 0x813
#define AMSTREAM_GET_FREED_HANDLE 0x814
#define AMSTREAM_GET_VPTS_U64 0x815
#define AMSTREAM_GET_APTS_U64 0x816
/* video get cmd */
#define AMSTREAM_GET_OMX_VPTS 0x860
#define AMSTREAM_GET_TRICK_STAT 0x861
#define AMSTREAM_GET_TRICK_VPTS 0x862
#define AMSTREAM_GET_SYNC_ADISCON 0x863
#define AMSTREAM_GET_SYNC_VDISCON 0x864
#define AMSTREAM_GET_SYNC_ADISCON_DIFF 0x865
#define AMSTREAM_GET_SYNC_VDISCON_DIFF 0x866
#define AMSTREAM_GET_VIDEO_DISABLE 0x867
#define AMSTREAM_GET_VIDEO_DISCONTINUE_REPORT 0x868
#define AMSTREAM_GET_SCREEN_MODE 0x869
#define AMSTREAM_GET_BLACKOUT_POLICY 0x86A
#define AMSTREAM_GET_FREERUN_MODE 0x86B
#define AMSTREAM_GET_3D_TYPE 0x86C
#define AMSTREAM_GET_VSYNC_SLOW_FACTOR 0x86D
/* amstream get ex cmd */
#define AMSTREAM_GET_EX_VB_STATUS 0x900
#define AMSTREAM_GET_EX_AB_STATUS 0x901
#define AMSTREAM_GET_EX_VDECSTAT 0x902
#define AMSTREAM_GET_EX_ADECSTAT 0x903
#define AMSTREAM_GET_EX_UD_POC 0x904
#define AMSTREAM_GET_EX_WR_COUNT 0x905
/* video get ex cmd */
#define AMSTREAM_GET_EX_VF_STATUS 0x960
#define AMSTREAM_GET_EX_VIDEO_AXIS 0x961
#define AMSTREAM_GET_EX_VIDEO_CROP 0x962
/* amstream get ptr cmd */
#define AMSTREAM_GET_PTR_SUB_INFO 0xA00
struct vdec_frames_s {
u64 hw_decode_start;
u64 hw_decode_time;
u32 frame_size;
u32 rd;
u32 wr;
struct vframe_comm_s comm;
struct vframe_counter_s fifo_buf[NUM_FRAME_VDEC];
};
#define SUPPORT_VDEC_NUM (64)
int vcodec_profile_register(const struct codec_profile_t *vdec_profile);
ssize_t vcodec_profile_read(char *buf);
bool is_support_profile(char *name);
#ifdef __KERNEL__
#include <linux/interrupt.h>
/*TS demux operation interface*/
struct tsdemux_ops {
int (*reset)(void);
int (*set_reset_flag)(void);
int (*request_irq)(irq_handler_t handler, irq_handler_t thread_handler, void *data);
int (*free_irq)(void);
int (*set_vid)(int vpid);
int (*set_aid)(int apid);
int (*set_sid)(int spid);
int (*set_pcrid)(int pcrpid);
int (*set_skipbyte)(int skipbyte);
int (*set_demux)(int dev);
unsigned long (*hw_dmx_lock)(unsigned long flags);
int (*hw_dmx_unlock)(unsigned long flags);
};
void tsdemux_set_ops(struct tsdemux_ops *ops);
int tsdemux_set_reset_flag(void);
int amports_switch_gate(const char *name, int enable);
int tsdemux_get_pcr(int demux_device_index, int index, u64 *pcr);
void set_adec_func(int (*adec_func)(struct adec_status *));
void wakeup_sub_poll(void);
void init_userdata_fifo(void);
void reset_userdata_fifo(int binit);
int wakeup_userdata_poll(struct userdata_poc_info_t poc,
int wp, unsigned long start_phyaddr,
int buf_size, int data_length);
int get_sub_type(void);
#endif /**/
//#if !IS_ENABLED(CONFIG_AMLOGIC_DEBUG_ATRACE)
//static inline void ATRACE_COUNTER(const char *name, int val) { return; }
//#endif
#ifdef CONFIG_AMLOGIC_MEDIA_VIDEO
void set_vsync_pts_inc_mode(int inc);
int query_video_status(int type, int *value);
void set_trickmode_I_frame(u32 trickmode);
u32 get_post_canvas(void);
#else
static inline void set_vsync_pts_inc_mode(int inc) { return; }
static inline void set_trickmode_I_frame(u32 trickmode) { return; }
#endif
#endif /* AMSTREAM_H */