blob: 4f32f1f22ab00c645ecf1b2ab028c477e8a938ec [file] [log] [blame]
/*
* include/linux/amlogic/media/vfm/vframe.h
*
* Copyright (C) 2017 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 VFRAME_H
#define VFRAME_H
#include <linux/types.h>
#include <linux/amlogic/media/frame_provider/tvin/tvin.h>
#include <linux/amlogic/media/canvas/canvas.h>
#include <linux/atomic.h>
#include <linux/amlogic/iomap.h>
#define VIDTYPE_PROGRESSIVE 0x0
#define VIDTYPE_INTERLACE_TOP 0x1
#define VIDTYPE_INTERLACE_BOTTOM 0x3
#define VIDTYPE_TYPEMASK 0x7
#define VIDTYPE_INTERLACE 0x1
#define VIDTYPE_INTERLACE_FIRST 0x8
#define VIDTYPE_MVC 0x10
#define VIDTYPE_NO_VIDEO_ENABLE 0x20
#define VIDTYPE_SEC_MD 0x40
#define VIDTYPE_VIU_NV12 0x80
#define VIDTYPE_VIU_422 0x800
#define VIDTYPE_VIU_FIELD 0x1000
#define VIDTYPE_VIU_SINGLE_PLANE 0x2000
#define VIDTYPE_VIU_444 0x4000
#define VIDTYPE_VIU_NV21 0x8000
#define VIDTYPE_VSCALE_DISABLE 0x10000
#define VIDTYPE_CANVAS_TOGGLE 0x20000
#define VIDTYPE_PRE_INTERLACE 0x40000
#define VIDTYPE_HIGHRUN 0x80000
#define VIDTYPE_COMPRESS 0x100000
#define VIDTYPE_PIC 0x200000
#define VIDTYPE_SCATTER 0x400000
#define VIDTYPE_VD2 0x800000
#define VIDTYPE_COMPRESS_LOSS 0x1000000
#define VIDTYPE_COMB_MODE 0x2000000
#define VIDTYPE_NO_DW 0x4000000
#define VIDTYPE_SUPPORT_COMPRESS 0x8000000
#define VIDTYPE_PRE_DI_AFBC 0x10000000
#define VIDTYPE_RGB_444 0x20000000
#define VIDTYPE_V4L_EOS 0x80000000
/* 2019-04-22 Suggestions from brian.zhu*/
#define VIDTYPE_DI_PW 0x40000000
#define DISP_RATIO_FORCECONFIG 0x80000000
#define DISP_RATIO_FORCE_NORMALWIDE 0x40000000
#define DISP_RATIO_FORCE_FULL_STRETCH 0x20000000
#define DISP_RATIO_ADAPTED_PICMODE 0x10000000
#define DISP_RATIO_INFOFRAME_AVAIL 0x08000000
#define DISP_RATIO_CTRL_MASK 0x00000003
#define DISP_RATIO_NO_KEEPRATIO 0x00000000
#define DISP_RATIO_KEEPRATIO 0x00000001
#define DISP_RATIO_PORTRAIT_MODE 0x00000004
#define DISP_RATIO_ASPECT_RATIO_MASK 0x0003ff00
#define DISP_RATIO_ASPECT_RATIO_BIT 8
#define DISP_RATIO_ASPECT_RATIO_MAX 0x3ff
#define TB_DETECT_MASK 0x00000040
#define TB_DETECT_MASK_BIT 6
#define TB_DETECT_NONE 0
#define TB_DETECT_INVERT 1
#define TB_DETECT_NC 0
#define TB_DETECT_TFF 1
#define TB_DETECT_BFF 2
#define TB_DETECT_TBF 3
#define VFRAME_FLAG_NO_DISCONTINUE 1
#define VFRAME_FLAG_SWITCHING_FENSE 2
#define VFRAME_FLAG_HIGH_BANDWIDTH 4
#define VFRAME_FLAG_ERROR_RECOVERY 8
#define VFRAME_FLAG_SYNCFRAME 0x10
#define VFRAME_FLAG_GAME_MODE 0x20
#define VFRAME_FLAG_VIDEO_COMPOSER 0x40
#define VFRAME_FLAG_VIDEO_COMPOSER_BYPASS 0x80
#define VFRAME_FLAG_COMPOSER_DONE 0x100
#define VFRAME_FLAG_VIDEO_COMPOSER_DMA 0x200
#define VFRAME_FLAG_VIDEO_LINEAR 0x400
#define VFRAME_FLAG_EMPTY_FRAME_V4L 0x800
#define VFRAME_FLAG_FAKE_FRAME 0x1000
#define VFRAME_FLAG_DOUBLE_FRAM 0x2000
#define VFRAME_FLAG_VIDEO_DRM 0x4000
#define VFRAME_FLAG_VIDEO_VDETECT 0x8000
#define VFRAME_FLAG_VIDEO_VDETECT_PUT 0x10000
#define VFRAME_FLAG_VIDEO_SECURE 0x20000
#define VFRAME_FLAG_DI_P_ONLY 0x40000 /* ary */
#define VFRAME_FLAG_CONTAIN_POST_FRAME 0x80000
#define VFRAME_FLAG_DI_PW_VFM 0x100000
#define VFRAME_FLAG_DI_PW_N_LOCAL 0x200000
#define VFRAME_FLAG_DI_PW_N_EXT 0x400000
enum pixel_aspect_ratio_e {
PIXEL_ASPECT_RATIO_1_1,
PIXEL_ASPECT_RATIO_8_9,
PIXEL_ASPECT_RATIO_16_15,
};
/*
* If pixel_sum[21:0] == 0, then all Histogram information are invalid
*/
struct vframe_hist_s {
unsigned int hist_pow;
unsigned int luma_sum;
unsigned int chroma_sum;
unsigned int pixel_sum; /* [31:30] POW [21:0] PIXEL_SUM */
unsigned int height;
unsigned int width;
unsigned char luma_max;
unsigned char luma_min;
unsigned short gamma[64];
unsigned int vpp_luma_sum; /*vpp hist info */
unsigned int vpp_chroma_sum;
unsigned int vpp_pixel_sum;
unsigned int vpp_height;
unsigned int vpp_width;
unsigned char vpp_luma_max;
unsigned char vpp_luma_min;
unsigned short vpp_gamma[64];
unsigned int vpp_hue_gamma[32];
unsigned int vpp_sat_gamma[32];
#ifdef AML_LOCAL_DIMMING
unsigned int ldim_max[100];
#endif
} /*vframe_hist_t */;
struct tvin_hdr10p_data_s {
uint32_t vsif_hb;
uint32_t vsif_ieee_code;
struct pb4_st {
uint8_t rvd:1;
uint8_t max_lumin:5;
uint8_t app_ver:2;
} __packed pb4_st;
uint8_t average_maxrgb;
uint8_t distrib_valus0;
uint8_t distrib_valus1;
uint8_t distrib_valus2;
uint8_t distrib_valus3;
uint8_t distrib_valus4;
uint8_t distrib_valus5;
uint8_t distrib_valus6;
uint8_t distrib_valus7;
uint8_t distrib_valus8;
struct pb15_18_st {
uint32_t knee_point_x_9_6:4;
uint32_t num_bezier_curve_anchors:4;
uint32_t knee_point_y_9_8:2;
uint32_t knee_point_x_5_0:6;
uint32_t knee_point_y_7_0:8;
uint32_t bezier_curve_anchors0:8;
} __packed pb15_18_st;
uint8_t bezier_curve_anchors1;
uint8_t bezier_curve_anchors2;
uint8_t bezier_curve_anchors3;
uint8_t bezier_curve_anchors4;
uint8_t bezier_curve_anchors5;
uint8_t bezier_curve_anchors6;
uint8_t bezier_curve_anchors7;
uint8_t bezier_curve_anchors8;
struct pb27_st {
uint8_t rvd:6;
uint8_t no_delay_flag:1;
uint8_t overlay_flag:1;
} __packed pb27_st;
} __packed;
/*vdin dolby vsi info param*/
struct tvin_dv_vsif_s {
uint8_t dobly_vision_signal:1;
uint8_t backlt_ctrl_MD_present:1;
uint8_t auxiliary_MD_present:1;
uint8_t eff_tmax_PQ_hi;
uint8_t eff_tmax_PQ_low;
uint8_t auxiliary_runmode;
uint8_t auxiliary_runversion;
uint8_t auxiliary_debug0;
};
/*
* If bottom == 0 or right == 0, then all Blackbar information are invalid
*/
struct vframe_bbar_s {
unsigned short top;
unsigned short bottom;
unsigned short left;
unsigned short right;
} /*vfame_bbar_t */;
/*
* If vsin == 0, then all Measurement information are invalid
*/
struct vframe_meas_s {
/* float frin; frame Rate of Video Input in the unit of Hz */
unsigned int vs_span_cnt;
unsigned long long vs_cnt;
unsigned int hs_cnt0;
unsigned int hs_cnt1;
unsigned int hs_cnt2;
unsigned int hs_cnt3;
unsigned int vs_cycle;
unsigned int vs_stamp;
} /*vframe_meas_t */;
struct vframe_view_s {
int start_x;
int start_y;
unsigned int width;
unsigned int height;
} /*vframe_view_t */;
#define SEI_PicTiming 1
#define SEI_MasteringDisplayColorVolume 137
#define SEI_ContentLightLevel 144
struct vframe_content_light_level_s {
u32 present_flag;
u32 max_content;
u32 max_pic_average;
}; /* content_light_level from SEI */
struct vframe_master_display_colour_s {
u32 present_flag;
u32 primaries[3][2];
u32 white_point[2];
u32 luminance[2];
struct vframe_content_light_level_s
content_light_level;
}; /* master_display_colour_info_volume from SEI */
/* vframe properties */
struct vframe_prop_s {
struct vframe_hist_s hist;
struct vframe_bbar_s bbar;
struct vframe_meas_s meas;
struct vframe_master_display_colour_s
master_display_colour;
struct tvin_hdr10p_data_s hdr10p_data;
} /*vframe_prop_t */;
struct vdisplay_info_s {
u32 frame_hd_start_lines_;
u32 frame_hd_end_lines_;
u32 frame_vd_start_lines_;
u32 frame_vd_end_lines_;
u32 display_vsc_startp;
u32 display_vsc_endp;
u32 display_hsc_startp;
u32 display_hsc_endp;
u32 screen_vd_v_start_;
u32 screen_vd_v_end_;
u32 screen_vd_h_start_;
u32 screen_vd_h_end_;
};
enum vframe_source_type_e {
VFRAME_SOURCE_TYPE_OTHERS = 0,
VFRAME_SOURCE_TYPE_TUNER,
VFRAME_SOURCE_TYPE_CVBS,
VFRAME_SOURCE_TYPE_COMP,
VFRAME_SOURCE_TYPE_HDMI,
VFRAME_SOURCE_TYPE_PPMGR,
VFRAME_SOURCE_TYPE_OSD,
};
enum vframe_source_mode_e {
VFRAME_SOURCE_MODE_OTHERS = 0,
VFRAME_SOURCE_MODE_PAL,
VFRAME_SOURCE_MODE_NTSC,
VFRAME_SOURCE_MODE_SECAM,
};
enum vframe_secam_phase_e {
VFRAME_PHASE_DB = 0,
VFRAME_PHASE_DR,
};
enum vframe_disp_mode_e {
VFRAME_DISP_MODE_NULL = 0,
VFRAME_DISP_MODE_UNKNOWN,
VFRAME_DISP_MODE_SKIP,
VFRAME_DISP_MODE_OK,
};
enum vframe_signal_fmt_e {
VFRAME_SIGNAL_FMT_INVALID = -1,
VFRAME_SIGNAL_FMT_SDR = 0,
VFRAME_SIGNAL_FMT_HDR10 = 1,
VFRAME_SIGNAL_FMT_HDR10PLUS = 2,
VFRAME_SIGNAL_FMT_HDR10PRIME = 3,
VFRAME_SIGNAL_FMT_HLG = 4,
VFRAME_SIGNAL_FMT_DOVI = 5,
VFRAME_SIGNAL_FMT_DOVI_LL = 6,
VFRAME_SIGNAL_FMT_MVC = 7
};
#define SEI_MAGIC_CODE 0x53656920 /* SEI */
/* signal format and sei data */
struct vframe_src_fmt_s {
enum vframe_signal_fmt_e fmt;
u32 sei_magic_code;
void *sei_ptr;
u32 sei_size;
bool dual_layer;
char *md_buf;
char *comp_buf;
int md_size;
int comp_size;
int parse_ret_flags;
};
enum pic_mode_provider_e {
PIC_MODE_PROVIDER_DB = 0,
PIC_MODE_PROVIDER_WSS,
PIC_MODE_UNKNOWN,
};
struct vframe_pic_mode_s {
int hs;
int he;
int vs;
int ve;
u32 screen_mode;
u32 custom_ar;
u32 AFD_enable;
enum pic_mode_provider_e provider;
};
#define BITDEPTH_Y_SHIFT 8
#define BITDEPTH_Y8 (0 << BITDEPTH_Y_SHIFT)
#define BITDEPTH_Y9 (1 << BITDEPTH_Y_SHIFT)
#define BITDEPTH_Y10 (2 << BITDEPTH_Y_SHIFT)
#define BITDEPTH_Y12 (3 << BITDEPTH_Y_SHIFT)
#define BITDEPTH_YMASK (3 << BITDEPTH_Y_SHIFT)
#define BITDEPTH_U_SHIFT 10
#define BITDEPTH_U8 (0 << BITDEPTH_U_SHIFT)
#define BITDEPTH_U9 (1 << BITDEPTH_U_SHIFT)
#define BITDEPTH_U10 (2 << BITDEPTH_U_SHIFT)
#define BITDEPTH_U12 (3 << BITDEPTH_U_SHIFT)
#define BITDEPTH_UMASK (3 << BITDEPTH_U_SHIFT)
#define BITDEPTH_V_SHIFT 12
#define BITDEPTH_V8 (0 << BITDEPTH_V_SHIFT)
#define BITDEPTH_V9 (1 << BITDEPTH_V_SHIFT)
#define BITDEPTH_V10 (2 << BITDEPTH_V_SHIFT)
#define BITDEPTH_V12 (3 << BITDEPTH_V_SHIFT)
#define BITDEPTH_VMASK (3 << BITDEPTH_V_SHIFT)
#define BITDEPTH_MASK (BITDEPTH_YMASK | BITDEPTH_UMASK | BITDEPTH_VMASK)
#define BITDEPTH_SAVING_MODE 0x1
#define FULL_PACK_422_MODE 0x2
struct codec_mm_box_s {
void *mmu_box;
int mmu_idx;
void *bmmu_box;
int bmmu_idx;
};
struct vsif_info {
void *addr;
unsigned int size;
};
struct emp_info {
void *addr;
unsigned int size;
};
#define MAX_COMPOSER_COUNT 9
#define AXIS_INFO_COUNT 4
struct componser_info_t {
int count;
int axis[MAX_COMPOSER_COUNT][AXIS_INFO_COUNT];
};
struct dcntr_mem_s {
u32 index;
u32 grd_addr;
u32 yds_addr;
u32 cds_addr;
u32 grd_size;
u32 yds_size;
u32 cds_size;
u32 ds_ratio;
u32 pre_out_fmt;//VIDTYPE_VIU_NV12, VIDTYPE_VIU_444
u32 yflt_wrmif_length;
u32 cflt_wrmif_length;
bool free;
bool use_org;
bool grd_swap_64bit;
bool yds_swap_64bit;
bool cds_swap_64bit;
bool grd_little_endian;
bool yds_little_endian;
bool cds_little_endian;
bool yds_canvas_mode;//0:linear address mode 1:canvas mode
bool cds_canvas_mode;
};
struct vframe_s {
u32 index;
u32 index_disp;
u32 omx_index;
u32 type;
u32 type_backup;
u32 type_original;
u32 blend_mode;
u32 duration;
u32 duration_pulldown;
u32 pts;
u64 pts_us64;
bool next_vf_pts_valid;
u32 next_vf_pts;
u32 disp_pts;
u64 disp_pts_us64;
u64 timestamp;
u32 flag;
u32 canvas0Addr;
u32 canvas1Addr;
u32 compHeadAddr;
u32 compBodyAddr;
u32 plane_num;
struct canvas_config_s canvas0_config[3];
struct canvas_config_s canvas1_config[3];
u32 bufWidth;
u32 width;
u32 height;
u32 compWidth;
u32 compHeight;
u32 ratio_control;
u32 bitdepth;
/*
* bit 30: is_dv
* bit 29: present_flag
* bit 28-26: video_format
* "component", "PAL", "NTSC", "SECAM", "MAC", "unspecified"
* bit 25: range "limited", "full_range"
* bit 24: color_description_present_flag
* bit 23-16: color_primaries
* "unknown", "bt709", "undef", "bt601", "bt470m", "bt470bg",
* "smpte170m", "smpte240m", "film", "bt2020"
* bit 15-8: transfer_characteristic
* "unknown", "bt709", "undef", "bt601", "bt470m", "bt470bg",
* "smpte170m", "smpte240m", "linear", "log100", "log316",
* "iec61966-2-4", "bt1361e", "iec61966-2-1", "bt2020-10",
* "bt2020-12", "smpte-st-2084", "smpte-st-428"
* bit 7-0: matrix_coefficient
* "GBR", "bt709", "undef", "bt601", "fcc", "bt470bg",
* "smpte170m", "smpte240m", "YCgCo", "bt2020nc", "bt2020c"
*/
u32 signal_type;
u32 orientation;
u32 video_angle;
enum vframe_source_type_e source_type;
enum vframe_secam_phase_e phase;
enum vframe_source_mode_e source_mode;
enum tvin_sig_fmt_e sig_fmt;
enum tvin_trans_fmt trans_fmt;
struct vframe_view_s left_eye;
struct vframe_view_s right_eye;
u32 mode_3d_enable;
/* vframe extension */
int (*early_process_fun)(void *arg, struct vframe_s *vf);
int (*process_fun)(void *arg, unsigned int zoom_start_x_lines,
unsigned int zoom_end_x_lines,
unsigned int zoom_start_y_lines,
unsigned int zoom_end_y_lines, struct vframe_s *vf);
void *private_data;
#if 1
/* vframe properties */
struct vframe_prop_s prop;
#endif
struct list_head list;
struct tvafe_vga_parm_s vga_parm;
/* pixel aspect ratio */
enum pixel_aspect_ratio_e pixel_ratio;
u64 ready_jiffies64; /* ready from decode on jiffies_64 */
long long ready_clock[5];/*ns*/
long long ready_clock_hist[2];/*ns*/
atomic_t use_cnt;
atomic_t use_cnt_pip;
u32 frame_dirty;
/*
*prog_proc_config:
*1: process p from decoder as filed;
*0: process p from decoder as frame
*/
u32 prog_proc_config;
/* used for indicate current video is motion or static */
int combing_cur_lev;
/*
*for vframe's memory,
* used by memory owner.
*/
void *mem_handle;
/*for MMU H265/VP9 compress header*/
void *mem_head_handle;
struct vframe_pic_mode_s pic_mode;
unsigned long v4l_mem_handle;
u32 sar_width;
u32 sar_height;
/*****************
* di pulldown info
* bit 3: interlace
* bit 2: flmxx
* bit 1: flm22
* bit 0: flm32
*****************/
u32 di_pulldown;
u32 di_gmv;
u32 di_cm_cnt;
u32 axis[4];
u32 crop[4];
u32 zorder;
u32 repeat_count[2];
struct file *file_vf;
bool rendered;
struct codec_mm_box_s mm_box;
struct vsif_info vsif;
struct emp_info emp;
/* signal format and sei data */
struct vframe_src_fmt_s src_fmt;
/*for di process NR and cts, storage dec vf*/
void *vf_ext;
u32 dwHeadAddr;
u32 dwBodyAddr;
bool fgs_valid;
u32 fgs_table_adr;
u32 di_instance_id;
int sidebind_type;
int sidebind_channel_id;
/*for double write VP9/AV1 vf*/
void *mem_dw_handle;
struct fence *fence;
/*current is dv input*/
bool dv_input;
/* dv mode crc check:
* true: crc check ok
* false: crc check fail
*/
bool dv_crc_sts;
/* currently only for keystone use */
unsigned int crc;
struct componser_info_t *componser_info;
void *decontour_pre;
u32 hdr10p_data_size;
char *hdr10p_data_buf;
bool discard_dv_data;
} /*vframe_t */;
#if 0
struct vframe_prop_s *vdin_get_vframe_prop(u32 index);
#endif
int get_curren_frame_para(int *top, int *left, int *bottom, int *right);
u8 is_vpp_postblend(void);
void pause_video(unsigned char pause_flag);
s32 update_vframe_src_fmt(
struct vframe_s *vf, void *sei,
u32 size, bool dual_layer,
char *prov_name, char *recv_name);
void *get_sei_from_src_fmt(struct vframe_s *vf, u32 *sei_size);
enum vframe_signal_fmt_e get_vframe_src_fmt(struct vframe_s *vf);
s32 clear_vframe_src_fmt(struct vframe_s *vf);
int get_md_from_src_fmt(struct vframe_s *vf);
#endif /* VFRAME_H */