blob: a100955ffc10c547b6d6c23dd6e949efb9e8b547 [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_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 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_EMPTY_FRAME_V4L 0x800
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];
#ifdef AML_LOCAL_DIMMING
unsigned int ldim_max[100];
#endif
} /*vframe_hist_t */;
/*
* 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 */
struct vframe_hdr_plus_sei_s {
u16 present_flag;
u16 itu_t_t35_country_code;
u16 itu_t_t35_terminal_provider_code;
u16 itu_t_t35_terminal_provider_oriented_code;
u16 application_identifier;
u16 application_version;
/*num_windows max is 3*/
u16 num_windows;
/*windows xy*/
u16 window_upper_left_corner_x[3];
u16 window_upper_left_corner_y[3];
u16 window_lower_right_corner_x[3];
u16 window_lower_right_corner_y[3];
u16 center_of_ellipse_x[3];
u16 center_of_ellipse_y[3];
u16 rotation_angle[3];
u16 semimajor_axis_internal_ellipse[3];
u16 semimajor_axis_external_ellipse[3];
u16 semiminor_axis_external_ellipse[3];
u16 overlap_process_option[3];
/*target luminance*/
u32 tgt_sys_disp_max_lumi;
u16 tgt_sys_disp_act_pk_lumi_flag;
u16 num_rows_tgt_sys_disp_act_pk_lumi;
u16 num_cols_tgt_sys_disp_act_pk_lumi;
u16 tgt_sys_disp_act_pk_lumi[25][25];
/*num_windows max is 3, e.g maxscl[num_windows][i];*/
u32 maxscl[3][3];
u32 average_maxrgb[3];
u16 num_distribution_maxrgb_percentiles[3];
u16 distribution_maxrgb_percentages[3][15];
u32 distribution_maxrgb_percentiles[3][15];
u16 fraction_bright_pixels[3];
u16 mast_disp_act_pk_lumi_flag;
u16 num_rows_mast_disp_act_pk_lumi;
u16 num_cols_mast_disp_act_pk_lumi;
u16 mast_disp_act_pk_lumi[25][25];
/*num_windows max is 3, e.g knee_point_x[num_windows]*/
u16 tone_mapping_flag[3];
u16 knee_point_x[3];
u16 knee_point_y[3];
u16 num_bezier_curve_anchors[3];
u16 bezier_curve_anchors[3][15];
u16 color_saturation_mapping_flag[3];
u16 color_saturation_weight[3];
};
/* 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;
} /*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 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 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 org_width;
u32 org_height;
u32 sar_width;
u32 sar_height;
u32 compWidth;
u32 compHeight;
u32 ratio_control;
u32 bitdepth;
u32 signal_type;
/*
* 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 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;
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;
/* in secure memory */
bool mem_sec;
/*for MMU H265/VP9 compress header*/
void *mem_head_handle;
struct vframe_pic_mode_s pic_mode;
unsigned long v4l_mem_handle;
} /*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);
#endif /* VFRAME_H */