mirror of
https://github.com/marqs85/ossc
synced 2026-11-02 13:17:18 +03:00
get_pure_lm_mode() picks the preset with the nearest total line count. Several workstation display modes share line counts with each other or with VESA modes while having one fixed refresh rate (e.g. Sun 1152x900 is 937 lines at both 66 Hz and 76.6 Hz on cg6 boards, and Sun 1280x1024@76 has the 1066 lines of VESA 1280x1024). Add GROUP_FIXED_VHZ. Presets in this group are candidates only when the measured refresh is within +-0.3 Hz of the preset (the measured refresh is exact to about 0.01 Hz). They are appended at the end of the table, so the early exit of the search loop is replaced by a flag that skips the remaining regular presets exactly as before but still lets fixed-refresh presets take part, including the existing equal-line refresh tie-break (group >= GROUP_720P). Group-indexed arrays in video_modes.c and controls.c get the extra entry. No preset uses the group yet, so behaviour is unchanged. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WiXHy7Jhh5yTdsBaenucgw
192 lines
4.9 KiB
C
192 lines
4.9 KiB
C
//
|
|
// Copyright (C) 2015-2023 Markus Hiienkari <mhiienka@niksula.hut.fi>
|
|
//
|
|
// This file is part of Open Source Scan Converter project.
|
|
//
|
|
// 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 3 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.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
//
|
|
|
|
#ifndef VIDEO_MODES_H_
|
|
#define VIDEO_MODES_H_
|
|
|
|
#include <stdint.h>
|
|
#include "sysconfig.h"
|
|
#include "avconfig.h"
|
|
#include "it6613_sys.h"
|
|
|
|
#define DEF_PHASE 0x10
|
|
|
|
#define H_TOTAL_MIN 300
|
|
#define H_TOTAL_MAX 3200
|
|
#define H_TOTAL_ADJ_MAX 19
|
|
#define H_SYNCLEN_MIN 10
|
|
#define H_SYNCLEN_MAX 255
|
|
#define H_BPORCH_MIN 0
|
|
#define H_BPORCH_MAX 511
|
|
#define H_ACTIVE_MIN 200
|
|
#define H_ACTIVE_MAX 3000
|
|
#define H_ACTIVE_SMP_MAX 2048
|
|
#define V_SYNCLEN_MIN 1
|
|
#define V_SYNCLEN_MAX 15
|
|
#define V_BPORCH_MIN 0
|
|
#define V_BPORCH_MAX 511
|
|
#define V_ACTIVE_MIN 160
|
|
#define V_ACTIVE_MAX 1728
|
|
|
|
typedef enum {
|
|
FORMAT_RGBS = 0,
|
|
FORMAT_RGBHV = 1,
|
|
FORMAT_RGsB = 2,
|
|
FORMAT_YPbPr = 3
|
|
} video_format;
|
|
|
|
typedef enum {
|
|
VIDEO_SDTV = (1<<0),
|
|
VIDEO_EDTV = (1<<1),
|
|
VIDEO_HDTV = (1<<2),
|
|
VIDEO_PC = (1<<3),
|
|
} video_type;
|
|
|
|
typedef enum {
|
|
GROUP_NONE = 0,
|
|
GROUP_240P = 1,
|
|
GROUP_288P = 2,
|
|
GROUP_384P = 3,
|
|
GROUP_480I = 4,
|
|
GROUP_576I = 5,
|
|
GROUP_480P = 6,
|
|
GROUP_576P = 7,
|
|
GROUP_720P = 8,
|
|
GROUP_1080I = 9,
|
|
GROUP_1080P = 10,
|
|
GROUP_FIXED_VHZ = 11, // fixed-refresh workstation modes: only matched when the input refresh is within FIXED_VHZ_TOL_X100
|
|
} video_group;
|
|
|
|
#define FIXED_VHZ_TOL_X100 30 // +-0.30 Hz (measured refresh is exact to ~0.01 Hz)
|
|
|
|
typedef enum {
|
|
MODE_INTERLACED = (1<<0), //deprecated
|
|
MODE_CRT = (1<<1),
|
|
//at least one of the flags below must be set for each P-LM mode
|
|
MODE_PT = (1<<2),
|
|
MODE_L2 = (1<<3),
|
|
MODE_L2_512_COL = (1<<4),
|
|
MODE_L2_384_COL = (1<<5),
|
|
MODE_L2_320_COL = (1<<6),
|
|
MODE_L2_256_COL = (1<<7),
|
|
MODE_L2_240x360 = (1<<8),
|
|
MODE_L3_GEN_16_9 = (1<<9),
|
|
MODE_L3_GEN_4_3 = (1<<10),
|
|
MODE_L3_512_COL = (1<<11),
|
|
MODE_L3_384_COL = (1<<12),
|
|
MODE_L3_320_COL = (1<<13),
|
|
MODE_L3_256_COL = (1<<14),
|
|
MODE_L3_240x360 = (1<<15),
|
|
MODE_L4_GEN_4_3 = (1<<16),
|
|
MODE_L4_512_COL = (1<<17),
|
|
MODE_L4_384_COL = (1<<18),
|
|
MODE_L4_320_COL = (1<<19),
|
|
MODE_L4_256_COL = (1<<20),
|
|
MODE_L5_GEN_4_3 = (1<<21),
|
|
MODE_L5_512_COL = (1<<22),
|
|
MODE_L5_384_COL = (1<<23),
|
|
MODE_L5_320_COL = (1<<24),
|
|
MODE_L5_256_COL = (1<<25),
|
|
MODE_L6_GEN_4_3 = (1<<26),
|
|
MODE_L6_512_COL = (1<<27),
|
|
MODE_L6_384_COL = (1<<28),
|
|
MODE_L6_320_COL = (1<<29),
|
|
MODE_L6_256_COL = (1<<30),
|
|
} mode_flags;
|
|
|
|
typedef enum {
|
|
VMODE_480p = 24,
|
|
} vmode_t;
|
|
|
|
typedef struct {
|
|
uint16_t h_active;
|
|
uint16_t v_active;
|
|
uint16_t v_hz_x100;
|
|
uint16_t h_total;
|
|
uint8_t h_total_adj;
|
|
uint16_t v_total;
|
|
uint16_t h_backporch;
|
|
uint16_t v_backporch;
|
|
uint8_t h_synclen;
|
|
uint8_t v_synclen;
|
|
uint8_t interlaced;
|
|
} sync_timings_t;
|
|
|
|
typedef struct {
|
|
uint8_t h;
|
|
uint8_t v;
|
|
} aspect_ratio_t;
|
|
|
|
typedef struct {
|
|
uint8_t h;
|
|
uint8_t v;
|
|
} mask_t;
|
|
|
|
typedef enum {
|
|
TX_1X = 0,
|
|
TX_2X = 1,
|
|
TX_4X = 2
|
|
} HDMI_pixelrep_t;
|
|
|
|
typedef struct {
|
|
char name[11];
|
|
HDMI_Video_Type vic;
|
|
sync_timings_t timings;
|
|
uint8_t sampler_phase;
|
|
union {
|
|
aspect_ratio_t ar;
|
|
mask_t mask;
|
|
};
|
|
video_type type;
|
|
video_group group;
|
|
mode_flags flags;
|
|
} mode_data_t;
|
|
|
|
typedef struct {
|
|
int8_t x_rpt;
|
|
int8_t y_rpt;
|
|
uint8_t h_skip;
|
|
uint8_t h_sample_sel;
|
|
int16_t x_offset;
|
|
int16_t y_offset;
|
|
uint16_t x_size;
|
|
uint16_t y_size;
|
|
uint16_t framesync_line;
|
|
uint8_t x_start_lb;
|
|
int8_t y_start_lb;
|
|
uint8_t framelock;
|
|
uint8_t tx_pixelrep;
|
|
uint8_t hdmitx_pixr_ifr;
|
|
// for generation from 27MHz clock
|
|
int8_t si_pclk_mult;
|
|
} vm_proc_config_t;
|
|
|
|
|
|
void set_default_vm_table();
|
|
|
|
uint32_t estimate_dotclk(mode_data_t *vm_in, uint32_t h_hz);
|
|
|
|
uint32_t calculate_pclk(uint32_t src_clk_hz, mode_data_t *vm_out, vm_proc_config_t *vm_conf);
|
|
|
|
int get_pure_lm_mode(avconfig_t *cc, mode_data_t *vm_in, mode_data_t *vm_out, vm_proc_config_t *vm_conf);
|
|
|
|
int get_vmode(vmode_t vmode_id, mode_data_t *vm_in, mode_data_t *vm_out, vm_proc_config_t *vm_conf);
|
|
|
|
#endif /* VIDEO_MODES_H_ */
|