annotate libvo/gtf.c @ 36295:0bd0297b073a

Handle special argument -1 to switch_ratio as intended. Reset to the original aspect ratio that would have been used for the very first rescaling rather than to the display size ratio. This will now handle anamorphic videos correctly as well.
author ib
date Thu, 01 Aug 2013 21:18:14 +0000
parents 32725ca88fed
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
1 /*
27509
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 25563
diff changeset
2 * GTF calculations formulas are taken from GTF_V1R1.xls
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 25563
diff changeset
3 * created by ANDY.MORRISH@NSC.COM
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 25563
diff changeset
4 *
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 25563
diff changeset
5 * copyright (C) 2002 Rudolf Marek <r.marek@assembler.cz>
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 25563
diff changeset
6 *
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 25563
diff changeset
7 * This file is part of MPlayer.
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
8 *
27509
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 25563
diff changeset
9 * MPlayer is free software; you can redistribute it and/or modify
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 25563
diff changeset
10 * it under the terms of the GNU General Public License as published by
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 25563
diff changeset
11 * the Free Software Foundation; either version 2 of the License, or
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 25563
diff changeset
12 * (at your option) any later version.
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 25563
diff changeset
13 *
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 25563
diff changeset
14 * MPlayer is distributed in the hope that it will be useful,
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 25563
diff changeset
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 25563
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 25563
diff changeset
17 * GNU General Public License for more details.
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 25563
diff changeset
18 *
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 25563
diff changeset
19 * You should have received a copy of the GNU General Public License along
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 25563
diff changeset
20 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 25563
diff changeset
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
22 */
27509
d97a607821f1 Replace casual GPL notices by proper license headers.
diego
parents: 25563
diff changeset
23
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
24 //Version 0.4
15394
d701716bfbbc if define HAVE_ROUND do not define round again. patch by Steven M. Schultz <sms@2BSD.COM>
nplourde
parents: 7069
diff changeset
25 #include "config.h"
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
26 #include <stdio.h>
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
27 #include <stdlib.h>
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
28 #include <math.h>
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
29 #include "gtf.h"
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
30
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
31 #undef GTF_DEBUG
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
32
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
33 #ifdef GTF_DEBUG
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
34 #define DEBUG_PRINTF(a,b) printf(a,b);
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
35 #else
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
36 #define DEBUG_PRINTF(a,b)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
37 #endif
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
38
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
39 static GTF_constants GTF_given_constants = { 3.0,550.0,1,8,1.8,8,40,20,128,600 };
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
40
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
41 static void GetRoundedConstants(GTF_constants *c)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
42 {
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
43 c->Vsync_need = round(GTF_given_constants.Vsync_need);
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
44 c->min_Vsync_BP = GTF_given_constants.min_Vsync_BP;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
45 c->min_front_porch = round(GTF_given_constants.min_front_porch);
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
46 c->char_cell_granularity = GTF_given_constants.char_cell_granularity;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
47 c->margin_width = GTF_given_constants.margin_width;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
48 c->sync_width = GTF_given_constants.sync_width;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
49 c->c = ((GTF_given_constants.c - GTF_given_constants.j)*(GTF_given_constants.k / 256)) + GTF_given_constants.j;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
50 c->j = GTF_given_constants.j;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
51 c->k = GTF_given_constants.k;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
52 c->m = (GTF_given_constants.k / 256) * GTF_given_constants.m;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
53 }
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
54
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
55 void GTF_calcTimings(double X,double Y,double freq, int type,
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
56 int want_margins, int want_interlace,struct VesaCRTCInfoBlock *result )
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
57 {
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
58 GTF_constants c;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
59 double RR, margin_top, margin_bottom, margin_left, margin_right;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
60 double estimated_H_period,sync_plus_BP,BP,interlace,V_total_lines_field;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
61 double estimated_V_field_rate,actual_H_period,actual_V_field_freq;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
62 double total_active_pixels, ideal_duty_cycle, blanking_time, H_total_pixels;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
63 double H_freq, pixel_freq,actual_V_frame_freq;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
64 double H_sync_start, H_sync_end, H_back_porch, H_front_porch, H_sync_width;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
65 double V_back_porch, V_front_porch, V_sync_start, V_sync_end,V_sync_width;
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
66 double ideal_H_period;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
67 GetRoundedConstants(&c);
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
68
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
69
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
70 pixel_freq = RR = freq;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
71
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
72 /* DETERMINE IF 1/2 LINE INTERLACE IS PRESENT */
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
73
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
74 interlace = 0;
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
75
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
76 if (want_interlace) {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
77 RR = RR * 2;
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
78 Y=Y/2;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
79 interlace = 0.5;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
80 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
81
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
82 result->Flags = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
83
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
84 if ((Y==300)||(Y==200)||(Y==240))
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
85 {
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
86 Y*=2;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
87 result->Flags = VESA_CRTC_DOUBLESCAN; /* TODO: check if mode support */
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
88 }
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
89
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
90 /* DETERMINE NUMBER OF LINES IN V MARGIN */
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
91 /* DETERMINE NUMBER OF PIXELS IN H MARGIN [pixels] */
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
92
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
93 margin_left = margin_right = 0;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
94 margin_top = margin_bottom = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
95
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
96 if (want_margins) {
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
97 margin_top = margin_bottom = (c.margin_width / 100) * Y;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
98 margin_left = round(( X* c.margin_width/100)/c.char_cell_granularity) \
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
99 * c.char_cell_granularity;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
100 margin_right = margin_left;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
101 DEBUG_PRINTF("margin_left_right : %f\n",margin_right)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
102 DEBUG_PRINTF("margin_top_bottom : %f\n",margin_top)
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
103 }
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
104
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
105 /* FIND TOTAL NUMBER OF ACTIVE PIXELS (IMAGE + MARGIN) [pixels] */
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
106
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
107 total_active_pixels = margin_left + margin_right + X;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
108 DEBUG_PRINTF("total_active_pixels: %f\n",total_active_pixels)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
109
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
110 if (type == GTF_PF)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
111 {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
112 ideal_H_period = ((c.c-100)+(sqrt(((100-c.c)*(100-c.c) )+(0.4*c.m*(total_active_pixels + margin_left + margin_right) / freq))))/2/c.m*1000;
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
113
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
114 DEBUG_PRINTF("ideal_H_period: %f\n",ideal_H_period)
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
115
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
116 /* FIND IDEAL BLANKING DUTY CYCLE FROM FORMULA [%] */
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
117 ideal_duty_cycle = c.c - (c.m * ideal_H_period /1000);
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
118 DEBUG_PRINTF("ideal_duty_cycle: %f\n",ideal_duty_cycle)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
119
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
120 /* FIND BLANKING TIME (TO NEAREST CHAR CELL) [pixels] */
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
121
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
122 blanking_time = round(total_active_pixels * ideal_duty_cycle \
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
123 / (100-ideal_duty_cycle) / (2*c.char_cell_granularity)) \
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
124 * (2*c.char_cell_granularity);
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
125 DEBUG_PRINTF("blanking_time : %f\n",blanking_time )
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
126
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
127 /* FIND TOTAL NUMBER OF PIXELS IN A LINE [pixels] */
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
128 H_total_pixels = total_active_pixels + blanking_time ;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
129 DEBUG_PRINTF("H_total_pixels: %f\n",H_total_pixels)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
130 H_freq = freq / H_total_pixels * 1000;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
131 DEBUG_PRINTF("H_freq: %f\n",H_freq)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
132 actual_H_period = 1000 / H_freq;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
133 DEBUG_PRINTF("actual_H_period: %f\n",actual_H_period)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
134 sync_plus_BP = round(H_freq * c.min_Vsync_BP/1000);
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
135 // sync_plus_BP = round( freq / H_total_pixels * c.min_Vsync_BP);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
136
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
137 DEBUG_PRINTF("sync_plus_BP: %f\n",sync_plus_BP)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
138
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
139 } else if (type == GTF_VF)
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
140 {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
141
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
142 /* ESTIMATE HORIZ. PERIOD [us] */
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
143
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
144 estimated_H_period = (( 1/RR ) - c.min_Vsync_BP/1000000 ) / (Y + (2 * margin_top) + c.min_front_porch + interlace) * 1000000;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
145
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
146 DEBUG_PRINTF("estimated_H_period: %f\n",estimated_H_period)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
147
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
148 /* FIND NUMBER OF LINES IN (SYNC + BACK PORCH) [lines] */
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
149
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
150 sync_plus_BP = round( c.min_Vsync_BP / estimated_H_period );
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
151 DEBUG_PRINTF("sync_plus_BP: %f\n",sync_plus_BP)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
152
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
153 } else if (type == GTF_HF)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
154 {
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
155 sync_plus_BP = round(freq * c.min_Vsync_BP/1000);
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
156 DEBUG_PRINTF("sync_plus_BP: %f\n",sync_plus_BP)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
157 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
158
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
159
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
160
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
161 /* FIND TOTAL NUMBER OF LINES IN VERTICAL FIELD */
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
162
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
163 V_total_lines_field = sync_plus_BP+interlace+margin_bottom+margin_top+Y+c.min_front_porch;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
164 DEBUG_PRINTF("V_total_lines_field : %f\n",V_total_lines_field )
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
165
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
166 if (type == GTF_VF)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
167 {
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
168 /* ESTIMATE VERTICAL FIELD RATE [hz] */
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
169
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
170 estimated_V_field_rate = 1 / estimated_H_period / V_total_lines_field * 1000000;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
171 DEBUG_PRINTF(" estimated_V_field_rate: %f\n", estimated_V_field_rate)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
172 /* FIND ACTUAL HORIZONTAL PERIOD [us] */
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
173
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
174 actual_H_period = estimated_H_period / (RR / estimated_V_field_rate);
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
175 DEBUG_PRINTF("actual_H_period: %f\n",actual_H_period)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
176 /* FIND ACTUAL VERTICAL FIELD FREQUENCY [Hz] */
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
177
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
178 actual_V_field_freq = 1 / actual_H_period / V_total_lines_field * 1000000;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
179 DEBUG_PRINTF("actual_V_field_freq: %f\n",actual_V_field_freq)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
180
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
181 /* FIND IDEAL BLANKING DUTY CYCLE FROM FORMULA [%] */
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
182 ideal_duty_cycle = c.c - (c.m * actual_H_period /1000);
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
183 DEBUG_PRINTF("ideal_duty_cycle: %f\n",ideal_duty_cycle)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
184 //if (type == GTF_VF)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
185 //{
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
186 //moved
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
187 //}
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
188 } else if (type == GTF_HF)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
189 {
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
190 /* FIND IDEAL BLANKING DUTY CYCLE FROM FORMULA [%] */
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
191 ideal_duty_cycle = c.c - (c.m / freq);
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
192 DEBUG_PRINTF("ideal_duty_cycle: %f\n",ideal_duty_cycle)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
193 }
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
194
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
195 /* FIND BLANKING TIME (TO NEAREST CHAR CELL) [pixels] */
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
196
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
197 if (!(type == GTF_PF))
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
198 {
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
199 blanking_time = round(total_active_pixels * ideal_duty_cycle \
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
200 / (100-ideal_duty_cycle) / (2*c.char_cell_granularity)) \
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
201 * (2*c.char_cell_granularity);
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
202 DEBUG_PRINTF("blanking_time : %f\n",blanking_time )
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
203 }
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
204 else
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
205 // if (type == GTF_PF)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
206 {
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
207 actual_V_field_freq = H_freq / V_total_lines_field * 1000;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
208 }
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
209
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
210 if (type == GTF_HF)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
211 {
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
212 /* Hz */
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
213 actual_V_field_freq = freq / V_total_lines_field * 1000;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
214 DEBUG_PRINTF("actual_V_field_freq: %f\n",actual_V_field_freq)
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
215 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
216
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
217
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
218 actual_V_frame_freq = actual_V_field_freq;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
219
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
220 /* FIND ACTUAL VERTICAL FRAME FREQUENCY [Hz]*/
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
221
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
222 if (want_interlace) actual_V_frame_freq = actual_V_field_freq / 2;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
223 DEBUG_PRINTF("actual_V_frame_freq: %f\n",actual_V_frame_freq)
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
224
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
225 // V_freq = actual_V_frame_freq;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
226 // DEBUG_PRINTF("V_freq %f\n",V_freq)
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
227
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
228
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
229 if (!(type == GTF_PF))
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
230 {
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
231 /* FIND TOTAL NUMBER OF PIXELS IN A LINE [pixels] */
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
232 H_total_pixels = total_active_pixels + blanking_time ;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
233 DEBUG_PRINTF("H_total_pixels: %f\n",H_total_pixels)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
234 if (type == GTF_VF)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
235 {
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
236 /* FIND PIXEL FREQUENCY [Mhz] */
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
237 pixel_freq = H_total_pixels / actual_H_period ;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
238 DEBUG_PRINTF("pixel_freq: %f\n",pixel_freq)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
239 } else if (type == GTF_HF)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
240 {
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
241 /* FIND PIXEL FREQUENCY [Mhz] */
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
242 pixel_freq = H_total_pixels * freq / 1000 ;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
243 DEBUG_PRINTF("pixel_freq: %f\n",pixel_freq)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
244 actual_H_period = 1000/freq;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
245 }
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
246
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
247 /* FIND ACTUAL HORIZONTAL FREQUENCY [KHz] */
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
248
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
249 H_freq = 1000 / actual_H_period;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
250 DEBUG_PRINTF("H_freq %f\n",H_freq)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
251
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
252
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
253 }
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
254
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
255 /* FIND NUMBER OF LINES IN BACK PORCH [lines] */
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
256
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
257 BP = sync_plus_BP - c.Vsync_need;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
258 DEBUG_PRINTF("BP: %f\n",BP)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
259
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
260 /*------------------------------------------------------------------------------------------------*/
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
261 /* FIND H SYNC WIDTH (TO NEAREST CHAR CELL) */
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
262 H_sync_width = round(c.sync_width/100*H_total_pixels/c.char_cell_granularity)*c.char_cell_granularity;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
263 DEBUG_PRINTF("H_sync_width %f\n",H_sync_width)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
264
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
265 /* FIND FRONT H PORCH(TO NEAREST CHAR CELL) */
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
266 H_front_porch = (blanking_time/2) - H_sync_width;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
267 DEBUG_PRINTF("H_front_porch %f\n",H_front_porch)
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
268 /* FIND BACK H PORCH(TO NEAREST CHAR CELL) */
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
269 H_back_porch = H_sync_width + H_front_porch;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
270 DEBUG_PRINTF("H_back_porch%f\n",H_back_porch)
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
271
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
272 H_sync_start = H_total_pixels - (H_sync_width + H_back_porch);
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
273 DEBUG_PRINTF("H_sync_start %f\n",H_sync_start)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
274 H_sync_end = H_total_pixels - H_back_porch;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
275 DEBUG_PRINTF("H_sync_end %f\n",H_sync_end)
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
276
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
277 V_back_porch = interlace + BP;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
278 DEBUG_PRINTF("V_back_porch%f\n",V_back_porch)
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
279 V_front_porch = interlace + c.min_front_porch;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
280 DEBUG_PRINTF("V_front_porch%f\n",V_front_porch)
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
281
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
282 V_sync_width = c.Vsync_need;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
283 V_sync_start = V_total_lines_field - (V_sync_width + V_back_porch);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
284 DEBUG_PRINTF("V_sync_start %f\n",V_sync_start)
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
285 V_sync_end = V_total_lines_field - V_back_porch;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
286 DEBUG_PRINTF("V_sync_end %f\n",V_sync_end)
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
287
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
288 result->hTotal = H_total_pixels;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
289 result-> hSyncStart = H_sync_start; /* Horizontal sync start in pixels */
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
290 result-> hSyncEnd = H_sync_end; /* Horizontal sync end in pixels */
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
291 result-> vTotal= V_total_lines_field; /* Vertical total in lines */
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
292 result-> vSyncStart = V_sync_start; /* Vertical sync start in lines */
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
293 result-> vSyncEnd = V_sync_end; /* Vertical sync end in lines */
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
294 result-> Flags = (result->Flags)|VESA_CRTC_HSYNC_NEG; /* Flags (Interlaced, Double Scan etc) */
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
295
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
296 if (want_interlace)
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
297 {
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
298 result->Flags = (result->Flags) | VESA_CRTC_INTERLACED;
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
299 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
300
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
301 result-> PixelClock = pixel_freq*1000000; /* Pixel clock in units of Hz */
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
302 result-> RefreshRate = actual_V_frame_freq*100;/* Refresh rate in units of 0.01 Hz*/
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27509
diff changeset
303
7069
21e1ab99cb21 General Timing Formula algorithm from a scratch.
arpi
parents:
diff changeset
304 }