[MN-dev] [mndiff]: r65 - in trunk/2010: 2010.cpp 2_71x6.cpp 2_crypt.cpp 2_crypt.h 2_grafix.cpp 2_pal.h 2_vpaytv.cpp 2d 2d.txt
michael
subversion at mplayerhq.hu
Wed Jul 4 11:38:46 CEST 2007
Author: michael
Date: Wed Jul 4 11:38:46 2007
New Revision: 65
Log:
version from 2000-04-18 13:27
Added:
trunk/2010/2_pal.h
trunk/2010/2d.txt
- copied, changed from r62, /trunk/2010/2d
Removed:
trunk/2010/2d
Modified:
trunk/2010/2010.cpp
trunk/2010/2_71x6.cpp
trunk/2010/2_crypt.cpp
trunk/2010/2_crypt.h
trunk/2010/2_grafix.cpp
trunk/2010/2_vpaytv.cpp
Modified: trunk/2010/2010.cpp
==============================================================================
--- trunk/2010/2010.cpp (original)
+++ trunk/2010/2010.cpp Wed Jul 4 11:38:46 2007
@@ -50,7 +50,7 @@ extern bool drop;
int maxBuf=2;
int some=0;
-
+ int some2=0;
int _crt0_startup_flags = _CRT0_FLAG_NEARPTR | _CRT0_FLAG_NONMOVE_SBRK;
bool fShowRaw=false;
@@ -485,6 +485,10 @@ int main(int argc, char **argv){
break;
case '4' : some--; if(some<0) some=0;
break;
+ case '5' : some2++;
+ break;
+ case '6' : some2--; if(some2<0) some2=0;
+ break;
case 'a' :
case 'A' : if(TVStd!=TXTPAL) break;
tabActive=true;
Modified: trunk/2010/2_71x6.cpp
==============================================================================
--- trunk/2010/2_71x6.cpp (original)
+++ trunk/2010/2_71x6.cpp Wed Jul 4 11:38:46 2007
@@ -761,13 +761,16 @@ void doTxtHack(int txtHackState){
}
void vPayTvShiftHack(int amount)
- {
- write_saa7196(0x0F, 0x50);
+{
+// __dpmi_yield();
- for(int i=0; i<10000*amount; i++);
+ write_saa7196(0x0F, 0x50);
+
+// for(int i=1000*amount; i>0; i--);
+ for(int i=0; i<10000*amount; i++);
write_saa7196(0x0F, 0x10);
- }
+}
void vPayTvBrightHack(bool b, int posInLCC)
@@ -786,10 +789,10 @@ void vPayTvBrightHack(bool b, int posInL
int hSyncBegin= - 96 +posInLCC;
int hSyncStop= - 70 +posInLCC;
int hClampBegin= - 60 +posInLCC;
- int hClampStop= - 59 +posInLCC+some;
+ int hClampStop= - 59 +posInLCC+some/2;
int hSyncStartAfterPH1= 96;//+posInLCC;
- if(some==0) hClampStop= 148 +posInLCC;
+ if(some/2==0) hClampStop= 148 +posInLCC;
//else hClampStop= -59 +posInLCC + 10;
hSyncBegin = minmax(-382, hSyncBegin, 126);
@@ -807,7 +810,7 @@ void vPayTvBrightHack(bool b, int posInL
if(hClampBegin <= hSyncStop) hClampBegin= hSyncStop+1;
if(hClampStop <= hClampBegin) hClampStop= hClampBegin+1;
- if(b)
+ if(b ^ (some&1))
{
write_saa7196(0x01, (-hSyncBegin-3 )&0xFF);/* 7:0 Horizontal Sync Begin for 50hz */
write_saa7196(0x02, (-hSyncBegin )&0xFF);/* 7:0 Horizontal Sync Begin for 50hz */
Modified: trunk/2010/2_crypt.cpp
==============================================================================
--- trunk/2010/2_crypt.cpp (original)
+++ trunk/2010/2_crypt.cpp Wed Jul 4 11:38:46 2007
@@ -46,7 +46,7 @@ void decrypt(void){
}
if( cryptStd == nag && satur!=0 ) Decomb(0);
- if( cryptStd == vc && satur!=0 ) Decomb(1);
+ if( cryptStd == vc && satur!=0 ) Decomb(1);
if(iState){
T2=uclock();
Modified: trunk/2010/2_crypt.h
==============================================================================
--- trunk/2010/2_crypt.h (original)
+++ trunk/2010/2_crypt.h Wed Jul 4 11:38:46 2007
@@ -5,11 +5,6 @@
#define max_x 900
#define max_y 700
-#define BLACK_LEVEL 0.0
-#define BLANK_LEVEL 0.0
-#define WHITE_LEVEL 1.0
-#define SYNC_LEVEL (-43.0 / 100.0)
-
#define FREQ_CHROM 4433618.75
#define FREQ_HS 15625.0
#define FREQ_PIX (FREQ_HS * 1888.0 * 0.5)
Modified: trunk/2010/2_grafix.cpp
==============================================================================
--- trunk/2010/2_grafix.cpp (original)
+++ trunk/2010/2_grafix.cpp Wed Jul 4 11:38:46 2007
@@ -26,7 +26,7 @@
extern int infoPosX;
extern int infoPosY;
extern VID2MEMBUF *vid2MemBuf;
- extern int some;
+ extern int some, some2;
extern bool allowDrop;
bool helpState=true;
@@ -127,6 +127,8 @@ void showStuff(void){
sprintf(textbuf,"%d Some", some);
gprint(infoPosX, infoPosY+=10, c.col, textbuf);
+ sprintf(textbuf,"%d Some2", some2);
+ gprint(infoPosX, infoPosY+=10, c.col, textbuf);
infoPosY+=5;
}
if(iState==2){
Added: trunk/2010/2_pal.h
==============================================================================
--- (empty file)
+++ trunk/2010/2_pal.h Wed Jul 4 11:38:46 2007
@@ -0,0 +1,16 @@
+//2010 0.1 Copyright (C) Michael Niedermayer 2000
+#ifndef n2_pal_h
+#define n2_pal_h
+
+#define PAL_FREQ_CHROM 4433618.75
+#define PAL_FREQ_HS 15625.0
+#define PAL_NUM_LINES 625
+#define PAL_PHASE_DRIFT_PER_LINE (-fmod(PAL_FREQ_CHROM/PAL_FREQ_HS*4.0, 1.0)/4.0*PI*2.0)
+#define PAL_VSYNC_SIZE 26 //?
+
+#define PAL_BLACK_LEVEL 0.0
+#define PAL_BLANK_LEVEL 0.0
+#define PAL_WHITE_LEVEL 1.0
+#define PAL_SYNC_LEVEL (-43.0 / 100.0) //?
+
+#endif
Modified: trunk/2010/2_vpaytv.cpp
==============================================================================
--- trunk/2010/2_vpaytv.cpp (original)
+++ trunk/2010/2_vpaytv.cpp Wed Jul 4 11:38:46 2007
@@ -15,34 +15,41 @@
#include "2_nag_a.h"
#include "2_hw_mem.h"
#include "2_vpaytv.h"
+#include "2_pal.h"
#include "2010.h"
-#define FREQ_CHROM 4433618.75
-#define FREQ_HS 15625.0
-#define PHASE_DRIFT_PER_LINE (-fmod(FREQ_CHROM/FREQ_HS*4.0, 1.0)/4.0*PI*2.0)
-#define Q_2_HSYNC_DISTANCE 6 //HACK (only 400x300)
-#define VSYNC_SIZE 26
-
-#define REAL_QLINE_POS (wndx-10)
+/* SyncSupression Encoding Constants */
+#define Q_2_HSYNC_DISTANCE (QCOL_SIZE + 2) // only 400x300
+#define QCOL_SIZE 14 // only 400x300
-#define QLINE_COEFFICIENT_THRESHOLD 0.20
-//#define QLINE_OVERBRIGHT_THRESHOLD 220
-#define QLINE_OVERBRIGHT_THRESHOLD 240
-#define OVERBRIGHT_TEST_COLUMN 4
-#define HSYNC_THRESHOLD 30
-#define HSYNC_SEARCH_START (Q_2_HSYNC_DISTANCE-3)
-#define HSYNC_SEARCH_END 22
+/* VSync Detection */
#define VSYNC_SEARCH_COLUMN (-2)
-#define VSYNC_OVERBRIGHT_THRESHOLD 230
#define MIN_VSYNC_DISTANCE 20
-#define LEFT_QLINE_BOUNDRY (wndx-20)
-#define RIGHT_QLINE_BOUNDRY (wndx-7)
+/* HSync Detection */
+#define QCOL_CORREL_QCOL_SIZE 5 // only 400x300
+#define QCOL_CORREL_BORDER_SIZE (QCOL_CORREL_QCOL_SIZE) // only right, there is none at the left
+#define QCOL_CORREL_SIZE (QCOL_CORREL_QCOL_SIZE + QCOL_CORREL_BORDER_SIZE)
+#define QCOL_COEFFICIENT_THRESHOLD 0.20
+#define HSYNC_SEARCH_START (Q_2_HSYNC_DISTANCE-5)
+#define HSYNC_SEARCH_END (Q_2_HSYNC_DISTANCE+5)
+
+#define REAL_HSYNC_LOC (wndx-10)
+#define LEFT_HSYNC_BOUNDRY (wndx-10)
+#define RIGHT_HSYNC_BOUNDRY (wndx-5)
#define TOP_VSYNC_BOUNDRY (wndy-50)
#define BOTTOM_VSYNC_BOUNDRY (wndy+50)
-#define RELATIV_LEVEL_SHIFT 2.0
+/* Brightness / Contrast Fix */
+#define RELATIV_LEVEL_SHIFT 2.0
+#define BLANK_REF_LOC (-3)
+#define SYNC_REF_LOC 3
+//#define CLIP_REJECTION_THRESHOLD 1.5
+
+/* Color-Phase Fix */
+#define START_Q_PHASE (some2 /180.0*PI)
+#define Q_PHASE_DELTA (-2*PI /(PAL_NUM_LINES))
extern vgax, vgay, wndx, wndy, outy, y_field, x_field;
@@ -55,9 +62,11 @@ extern int yuvMode;
extern bool mmx;
extern int infoPosX;
extern int infoPosY;
-extern int some;
+extern int some, some2;
extern bool drop;
extern bool isVCPhaseTrick;
+extern int bright;
+extern int contr;
static inline float atan3(const float f1, const float f2){
float out;
@@ -73,7 +82,7 @@ static inline float atan3(const float f1
}
static int qPhase=0;
-int findQLine(void)
+int findHSync(void)
{
long T1=0, T2;
color c;
@@ -82,39 +91,53 @@ int findQLine(void)
if(iState==2)
T1=uclock();
+
+ static float blankCorrelVector[4]= {0.5, 0.5, 0.5, 0.5};
+ static float qColCorrelVector[4]= {1.0, 1.0, 0.0, 0.0};
- const int xSizeOfCorrelVector= 4;
- float correlVector[4][4]= { {1,1,0 ,0 },
- {0,0,0.33,0.33},
- {0,0,0.33,0.33},
- {0,0,0.33,0.33} };
+ static bool isFirst= true;
+ if(isFirst)
+ {
- float meanOfCorrelVector= 0;
- for(int y=0; y<4; y++)
- for(int x=0; x<xSizeOfCorrelVector; x++)
- meanOfCorrelVector+= correlVector[y][x];
+ /* Normalize CorrelVectors */
- meanOfCorrelVector/= xSizeOfCorrelVector*4;
-
- float varianceOfCorrelVector= 0;
- for(int y=0; y<4; y++)
- for(int x=0; x<xSizeOfCorrelVector; x++)
- {
- correlVector[y][x] -= meanOfCorrelVector;
- varianceOfCorrelVector+= correlVector[y][x] * correlVector[y][x];
- }
+ double mean= 0;
+ for(int y=0; y<4; y++)
+ {
+ mean+= blankCorrelVector[y] * QCOL_CORREL_BORDER_SIZE;
+ mean+= qColCorrelVector[y] * QCOL_CORREL_QCOL_SIZE;
+ }
+ mean/= 4.0 * QCOL_CORREL_SIZE;
- varianceOfCorrelVector/= xSizeOfCorrelVector*4;
+ float variance= 0;
+ for(int y=0; y<4; y++)
+ {
+ blankCorrelVector[y] -= mean;
+ qColCorrelVector[y] -= mean;
+
+ variance += blankCorrelVector[y] * blankCorrelVector[y] * QCOL_CORREL_BORDER_SIZE;
+ variance += qColCorrelVector[y] * qColCorrelVector[y] * QCOL_CORREL_QCOL_SIZE;
+ }
+ variance/= 4.0 * QCOL_CORREL_SIZE;
+ double stdDev= sqrt(variance);
+ for(int y=0; y<4; y++)
+ {
+ blankCorrelVector[y] /= stdDev;
+ qColCorrelVector[y] /= stdDev;
+ }
+
+ }
+
byte const * const p= &actVid2MemBufp->b[0];
if(iState==2)
- {
+ {
T2=uclock();
sprintf(textbuf,"%f X", (float)(T2-T1)/UCLOCKS_PER_SEC);
gprint(infoPosX, infoPosY+=10, c.col, textbuf);
T1=T2;
- }
+ }
int aSumsOfEquivalentPoints[4][1000];
for(int i=0; i<4; i++)
@@ -127,15 +150,13 @@ int findQLine(void)
for(int line=0; line<wndy; line+=3)
for(int x=0; x<wndx; x++)
- {
+ {
const int index= (line*vgax + x)*2;
- const int a=
- int(p[index + 1])
- + mabs(int((char)(p[index + 2])))
- + mabs(int((char)(p[index])));
+ const int a= mabs(int((char)(p[index + 2])))
+ + mabs(int((char)(p[index ])));
aSumsOfEquivalentPoints[line & 3][x]+= a;
aSumsOfSqrs[x]+= a*a;
- }
+ }
for(int x=0; x<wndx; x++)
{
@@ -143,117 +164,119 @@ int findQLine(void)
aSumsOfEquivalentPoints[1][x]*= 3;
aSumsOfEquivalentPoints[2][x]*= 3;
aSumsOfEquivalentPoints[3][x]*= 3;
- aSumsOfSqrs[x]*= 3;;
+ aSumsOfSqrs[x]*= 3;
}
if(iState==2)
- {
+ {
T2=uclock();
sprintf(textbuf,"%f EquivSum & SumSqr", (float)(T2-T1)/UCLOCKS_PER_SEC);
gprint(infoPosX, infoPosY+=10, c.col, textbuf);
T1=T2;
- }
+ }
+
int bestQLine=-1;
float bestCoefficient=-1;
- for(int qLine=0; qLine<wndx-xSizeOfCorrelVector+1; qLine++)
+ for(int xStart=0; xStart<wndx-QCOL_CORREL_SIZE; xStart++)
{
int sum=0;
for(int line=0; line<4; line++)
- for(int x=qLine; x<qLine + xSizeOfCorrelVector; x++)
+ for(int x=xStart; x<xStart + QCOL_CORREL_SIZE; x++)
sum+= aSumsOfEquivalentPoints[line][x];
- const double mean= double(sum) / (xSizeOfCorrelVector*wndy);
+ const double mean= double(sum) / (QCOL_CORREL_SIZE*wndy);
int sumOfSqrs=0;
- for(int x=qLine; x<qLine + xSizeOfCorrelVector; x++)
+ for(int x=xStart; x<xStart + QCOL_CORREL_SIZE; x++)
sumOfSqrs+= aSumsOfSqrs[x];
- float variance= (sumOfSqrs - sum*mean) / (xSizeOfCorrelVector*wndy);
+ float variance= (sumOfSqrs - sum*mean) / (QCOL_CORREL_SIZE*wndy);
// printf("%f = %d - %d * %f / ...\n", variance, sumOfSqrs, sum, mean);
if(variance<0.0) variance=0;
float coefficient[4]={0,0,0,0};
for(int line=0; line<4; line++)
- for(int x=qLine; x<qLine + xSizeOfCorrelVector; x++)
- {
- coefficient[0]+= (aSumsOfEquivalentPoints[line][x]-mean*wndy/4)
- * correlVector[(line+0) &3][x-qLine];
- coefficient[1]+= (aSumsOfEquivalentPoints[line][x]-mean*wndy/4)
- * correlVector[(line+1) &3][x-qLine];
- coefficient[2]+= (aSumsOfEquivalentPoints[line][x]-mean*wndy/4)
- * correlVector[(line+2) &3][x-qLine];
- coefficient[3]+= (aSumsOfEquivalentPoints[line][x]-mean*wndy/4)
- * correlVector[(line+3) &3][x-qLine];
- }
+ {
+ for(int x=xStart; x<xStart + QCOL_CORREL_QCOL_SIZE; x++)
+ {
+ coefficient[0]+= (aSumsOfEquivalentPoints[line][x]-mean*wndy/4) * qColCorrelVector[(line+0) &3];
+ coefficient[1]+= (aSumsOfEquivalentPoints[line][x]-mean*wndy/4) * qColCorrelVector[(line+1) &3];
+ coefficient[2]+= (aSumsOfEquivalentPoints[line][x]-mean*wndy/4) * qColCorrelVector[(line+2) &3];
+ coefficient[3]+= (aSumsOfEquivalentPoints[line][x]-mean*wndy/4) * qColCorrelVector[(line+3) &3];
+ }
- for(int i=0; i<4; i++)
+ for(int x=xStart + QCOL_CORREL_QCOL_SIZE; x<xStart + QCOL_CORREL_SIZE; x++)
{
- coefficient[i]/= xSizeOfCorrelVector*wndy* sqrt(variance * varianceOfCorrelVector + 0.000001);
+ coefficient[0]+= (aSumsOfEquivalentPoints[line][x]-mean*wndy/4) * blankCorrelVector[(line+0) &3];
+ coefficient[1]+= (aSumsOfEquivalentPoints[line][x]-mean*wndy/4) * blankCorrelVector[(line+1) &3];
+ coefficient[2]+= (aSumsOfEquivalentPoints[line][x]-mean*wndy/4) * blankCorrelVector[(line+2) &3];
+ coefficient[3]+= (aSumsOfEquivalentPoints[line][x]-mean*wndy/4) * blankCorrelVector[(line+3) &3];
+ }
+ }
- if(coefficient[i]>bestCoefficient)
- {
+ for(int i=0; i<4; i++)
+ {
+ coefficient[i]/= QCOL_CORREL_SIZE * wndy * sqrt(variance + 0.000001);
+
+ if(coefficient[i] > bestCoefficient)
+ {
bestCoefficient= coefficient[i];
- bestQLine= qLine;
+ bestQLine= xStart - QCOL_SIZE + QCOL_CORREL_QCOL_SIZE;
qPhase= (4-i) &3;
// some= int(minmax(-10000, bestCoefficient*100, 10000));
- }
}
}
+ }
if(iState==2)
- {
+ {
T2=uclock();
- sprintf(textbuf,"%f coeff", (float)(T2-T1)/UCLOCKS_PER_SEC);
+ sprintf(textbuf,"%f coeffTime", (float)(T2-T1)/UCLOCKS_PER_SEC);
gprint(infoPosX, infoPosY+=10, c.col, textbuf);
T1=T2;
- }
-
-
- if(bestCoefficient < QLINE_COEFFICIENT_THRESHOLD) return -1;
-
-
- // try to find the Sync pulse
+
+ sprintf(textbuf,"%f coeff", bestCoefficient);
+ gprint(infoPosX, infoPosY+=10, c.col, textbuf);
+ }
- int score[1000];
- for(int i=0; i<1000; i++)
- score[i]=0;
+
+ if(bestCoefficient < QCOL_COEFFICIENT_THRESHOLD) return -1;
- for(int x= min(bestQLine+HSYNC_SEARCH_END, wndx-1); x >= bestQLine + HSYNC_SEARCH_START; x--)
+ int bestHSyncScore= 0;
+ int bestHSync= 0;
+ int hSync;
+ for(hSync= bestQLine + HSYNC_SEARCH_START; hSync < bestQLine + HSYNC_SEARCH_END; hSync++)
+ {
+ if(hSync+1 >= wndx) return -1;
+
+ int hSyncScore= 0;
+ for(int line= 0; line<wndy; line+=3)
{
- for(int line=0; line<wndy; line+=3)
- {
- score[x] += p[(line*vgax + x)*2 + 1];
- }
-
- score[x]*= 3;
-
- if( x+2 <= min(bestQLine+HSYNC_SEARCH_END, wndx-1)
- && (score[x] - score[x+2])/wndy > HSYNC_THRESHOLD)
- {
- bestQLine= x - Q_2_HSYNC_DISTANCE;
- if(bestQLine<0) bestQLine=0;
- return bestQLine;
- }
+ if(line&3 == qPhase) continue;
+ hSyncScore+= (int)( (byte)( p[(line*vgax + hSync-1)*2 + 1] ) )
+ -(int)( (byte)( p[(line*vgax + hSync+1)*2 + 1] ) );
}
-
- if(bestQLine + OVERBRIGHT_TEST_COLUMN >= wndx) return -1;
- int sum=0;
- for(int line=0; line<wndy; line++)
- sum+= p[(line*vgax + bestQLine + OVERBRIGHT_TEST_COLUMN)*2 + 1];
-
- if(sum/wndy > QLINE_OVERBRIGHT_THRESHOLD) return -1; // Sync Pulse not found and Pic to Bright
-
- return bestQLine; //no Sync Pulse Found (Picture perhaps too dark)
- //perhaps -1 better
+
+ if(hSyncScore > bestHSyncScore)
+ {
+ bestHSyncScore= hSyncScore;
+ bestHSync= hSync;
+ }
+ }
+
+ return bestHSync;
+
+
+// return minmax(0, bestQLine + Q_2_HSYNC_DISTANCE, wndx-1);
}
-int findVSync(int qLine)
+int findVSync(int qCol)
{
- if(qLine==-1) return -1;
- if(qLine<2 || qLine+1>=wndx) return -1;
+ if(qCol==-1) return -1;
+ if(qCol<2 || qCol+1>=wndx) return -1;
byte const * const p= &actVid2MemBufp->b[0];
@@ -266,15 +289,15 @@ int findVSync(int qLine)
int runningNotQSum=0;
int nRunningQSum=0;
int nRunningNotQSum=0;
- for(int vSyncStart= -VSYNC_SIZE; vSyncStart<wndy; vSyncStart++)
+ for(int vSyncStart= -PAL_VSYNC_SIZE; vSyncStart<wndy; vSyncStart++)
{
- const vSyncEnd= vSyncStart + VSYNC_SIZE;
+ const vSyncEnd= vSyncStart + PAL_VSYNC_SIZE;
int index= vSyncStart;
- if(index<0) index= vSyncStart + wndy + VSYNC_SIZE;
+ if(index<0) index= vSyncStart + wndy + PAL_VSYNC_SIZE;
if(vSyncStart>=0)
{
- const int xP= (vSyncStart*vgax + qLine + VSYNC_SEARCH_COLUMN) * 2;
+ const int xP= (vSyncStart*vgax + qCol + VSYNC_SEARCH_COLUMN) * 2;
const int scoreStart= int(p[xP + 1])
+ mabs(int((char)(p[xP + 2])))
+ mabs(int((char)(p[xP])));
@@ -292,7 +315,7 @@ int findVSync(int qLine)
}
if(vSyncEnd<wndy)
{
- const int xP= (vSyncEnd*vgax + qLine + VSYNC_SEARCH_COLUMN) * 2;
+ const int xP= (vSyncEnd*vgax + qCol + VSYNC_SEARCH_COLUMN) * 2;
const int scoreEnd= int(p[xP + 1])
+ mabs(int((char)(p[xP + 2])))
+ mabs(int((char)(p[xP])));
@@ -322,7 +345,7 @@ int findVSync(int qLine)
int bestScore= -1000000;
int bestVSync= -1;
- for(int vSync= 0; vSync<wndy+VSYNC_SIZE; vSync++)
+ for(int vSync= 0; vSync<wndy+PAL_VSYNC_SIZE; vSync++)
{
if(vSync < wndy && vSync > wndy-MIN_VSYNC_DISTANCE) continue;
if(vSync >= wndy && vSync-wndy < MIN_VSYNC_DISTANCE) continue;
@@ -342,15 +365,17 @@ int findVSync(int qLine)
// Should be writen as an Object...
//6015X 10960D 994498XX 3224315DD 1789858XD 55n
+
static int hSyncDelaySumX= 6015;
static int hSyncDelaySumD= 10960;
static int hSyncDelaySumXX= 994498;
static int hSyncDelaySumDD= 3224315;
static int hSyncDelaySumDX= 1789858;
static int hSyncDelays=55;
+
static int lastHSyncDelay=0;
-static int lastQLine=0; //from last call to doHSyncDelay
-void doHSyncDelay(int hDistance, int qLine)
+static int lastHSync=0; //from last call to doHSyncDelay
+void doHSyncDelay(int hDistance, int hSync)
{
double sigmaXD= double(hSyncDelaySumDX) * double(hSyncDelays)
- double(hSyncDelaySumX) * double(hSyncDelaySumD);
@@ -363,7 +388,9 @@ void doHSyncDelay(int hDistance, int qLi
double diffFromMeanX= double(hDistance) - double(hSyncDelaySumX) / double(hSyncDelays);
double diffFromMeanD= diffFromMeanX * sigmaXD / sigmaX2;
-/* printf("%d %d\n", hDistance, qLine);
+
+ /*
+ printf("%d %d\n", hDistance, hSync);
printf("%dX %dD %dXX %dDD %dXD %dn\n",
hSyncDelaySumX, hSyncDelaySumD,
hSyncDelaySumXX, hSyncDelaySumDD,
@@ -371,7 +398,10 @@ void doHSyncDelay(int hDistance, int qLi
printf("%fSXD %fSX2\n",sigmaXD, sigmaX2);
printf("%fdfmx %fdfmd\n", diffFromMeanX, diffFromMeanD);
- printf("%f\n", diffFromMeanD + double(hSyncDelaySumD) / double(hSyncDelays) + 0.5);*/
+ printf("%f\n", diffFromMeanD + double(hSyncDelaySumD) / double(hSyncDelays) + 0.5);
+ */
+
+
int delay= int(diffFromMeanD + double(hSyncDelaySumD) / double(hSyncDelays) + 0.5);
if(delay<0) delay=0;
@@ -379,7 +409,7 @@ void doHSyncDelay(int hDistance, int qLi
// printf("%d Delay\n", delay);
lastHSyncDelay= delay;
- lastQLine= qLine;
+ lastHSync= hSync;
vPayTvShiftHack(delay);
}
@@ -387,13 +417,13 @@ void doHSyncDelay(int hDistance, int qLi
static nStat=0;
static int *statX= new int[10000];
static int *statY= new int[10000];
-void analyzeHSyncDelay(int newQLine)
+void analyzeHSyncDelay(int newHSync)
{
- int realHDistance= newQLine - lastQLine;
- if(newQLine!=-1 && realHDistance>0)
+ int realHDistance= newHSync - lastHSync;
+ if(newHSync!=-1 && realHDistance>0)
{
-// statX[nStat]= realHDistance;
-// statY[nStat++]= lastHSyncDelay;
+ statX[nStat]= realHDistance;
+ statY[nStat++]= lastHSyncDelay;
hSyncDelaySumX+= realHDistance;
hSyncDelaySumD+= lastHSyncDelay;
@@ -468,8 +498,8 @@ void analyzeVSyncDelay(int newVSync)
if(newVSync!=-1 && realVDistance>0)
{
- statX[nStat]= lastVSyncDelay;
- statY[nStat++]= realVDistance;
+// statX[nStat]= lastVSyncDelay;
+ // statY[nStat++]= realVDistance;
vSyncDelaySumY+= realVDistance;
vSyncDelaySumD+= lastVSyncDelay;
@@ -502,26 +532,61 @@ void analyzeVSyncDelay(int newVSync)
*/
}
-/*
-void fixColor(int qLine)
+
+void fixColor(int qCol)
{
- qLine&= ~1;
+ /*
+ qCol&= ~2;
byte * const p= &actVid2MemBufp->b[0];
- for(int line=qPhase; line<wndy-3; line+=4)
+ for(int qLine=qPhase+1; qLine<wndy-3; qLine+=4)
+ {
+ const float targetPhase= (START_Q_PHASE - Q_PHASE_DELTA*qLine)*0;
+
+ int nSamples=0;
+ int uSum=0, vSum=0;
+ for(int x=qCol+2; x<qCol + QCOL_SIZE-1; x+=2)
{
- int u=char(p[(line*vgax + qLine-2)*2 ]);
- int v=char(p[(line*vgax + qLine-2)*2 + 2]);
- printf("%d %d %f\n", u, v, atan3(u,v)/PI*180);
- for(int x=0; x<wndx-1; x+=2)
+ if(x>=wndx) break;
+
+ uSum+= char(p[(qLine*vgax + x)*2 ]);
+ vSum+= char(p[(qLine*vgax + x)*2 + 2]);
+
+ nSamples++;
+ }
+
+ const float u= ((float)uSum) / nSamples;
+ const float v= ((float)vSum) / nSamples;
+
+ const float qPhase= atan3(u, v);
+ const float phaseDiff= targetPhase - qPhase;
+
+ const int s= (int)(sin(phaseDiff)*127.0);
+ const int c= (int)(cos(phaseDiff)*127.0);
+
+ printf("%f %f %f %f \n", u, v, atan3(u,v)/PI*180, targetPhase/PI*180);
+ for(int line= qLine; line< qLine+4; line++)
+ {
+ for(int x=0; x<wndx-1; x+=2)
{
+ int ou= (char)p[ (line*vgax + x)*2 ];
+ int ov= (char)p[ (line*vgax + x)*2 + 2 ];
+
+ int nu= (ou*c - ov*s)>>7;
+ int nv= (ou*s + ov*c)>>7;
+
+ p[ (line*vgax + x)*2 ]= (char)nu;
+ p[ (line*vgax + x)*2 + 2 ]= (char)nv;
+
}
-
}
+
+ }
+ */
}
-*/
-void fixBrightness(int qLine)
+
+void fixBrightness(int hSync)
{
static int darkestVal=0;
static int brightestVal=255;
@@ -531,54 +596,84 @@ void fixBrightness(int qLine)
byte * const p= &actVid2MemBufp->b[0];
+ int nClipedPixels= 0;
+
+ infoPosY+=10;
+
for(int line=1; line<wndy; line++)
{
- if(qLine + Q_2_HSYNC_DISTANCE + 3>=wndx) break;
+ if(hSync + 3>=wndx) break;
double encodedBlankLevel = 0;
double encodedSyncLevel = 0;
int nLines= 0;
- for(int refLine= max(line-4, 0); refLine<min(wndy, line+4); refLine++)
+ for(int refLine= max(line-2, 0); refLine<min(wndy, line+2); refLine++)
{
if((refLine&3) == qPhase) continue;
nLines++;
- encodedBlankLevel += p[(refLine*vgax + qLine + Q_2_HSYNC_DISTANCE - 3)*2 + 1];
- encodedSyncLevel += p[(refLine*vgax + qLine + Q_2_HSYNC_DISTANCE + 3)*2 + 1];
+ encodedBlankLevel += p[(refLine*vgax + hSync + BLANK_REF_LOC)*2 + 1];
+ encodedSyncLevel += p[(refLine*vgax + hSync + SYNC_REF_LOC )*2 + 1];
}
encodedBlankLevel/= nLines;
encodedSyncLevel /= nLines;
- const double shift= RELATIV_LEVEL_SHIFT* (encodedBlankLevel - encodedSyncLevel);
+ const double shift= (RELATIV_LEVEL_SHIFT + (bright - 0x80) / 4.0)* (encodedBlankLevel - encodedSyncLevel);
const double blankLevel = encodedBlankLevel - shift;
const double syncLevel = encodedSyncLevel - shift;
- const int blackLevel = int(blankLevel) -20;
+ const int blackLevel = int(blankLevel) ;
- const int scale = int((BLANK_LEVEL - SYNC_LEVEL) / max(blankLevel - syncLevel, 1.0) * (256.0 * 235.0));
+ const int scale =
+ int((PAL_BLANK_LEVEL - PAL_SYNC_LEVEL) / max(blankLevel - syncLevel, 1.0) * (256.0 * 255.0) * (contr-0x40+10)/10.0);
+
+ const int brightestPossible= ((255 - blackLevel) * scale) >> 8;
+ const int darkestPossible= ((0 - blackLevel) * scale) >> 8;
+
+ if(iState>=1)
+ {
+ for(int x=0; x<256; x++)
+ {
+ if(x<darkestPossible || x>brightestPossible)
+ {
+ p[((infoPosY+5)*vgax + x)*2 + 1]= 255;
+ p[((infoPosY+6)*vgax + x)*2 + 1]= 0;
+
+ p[((infoPosY+5)*vgax + x)*2 ]= 0;
+ p[((infoPosY+6)*vgax + x)*2 ]= 0;
+ }
+ }
+ }
- for(int x=0; x<min(qLine, wndx); x++)
- {
+
+
+
+ for(int x=0; x<min(hSync + BLANK_REF_LOC - 1, wndx); x++)
+ {/*
if(p[(line*vgax + x)*2 + 1] >= brightestVal && (some&1))
{
p[(line*vgax + x)*2]= 127;
+ // nClipedPixels++;
+
if(p[(line*vgax + x)*2 + 1] > brightestVal) brightestVal= p[(line*vgax + x)*2 + 1];
}
else if( p[(line*vgax + x)*2 + 1] <= darkestVal && (some&1))
{
p[(line*vgax + x)*2]= 128;
+ // nClipedPixels++;
+
if(p[(line*vgax + x)*2 + 1] < darkestVal) darkestVal= p[(line*vgax + x)*2 + 1];
}
- else
+ else*/
{
int v = p[(line*vgax + x)*2 + 1];
@@ -589,6 +684,11 @@ void fixBrightness(int qLine)
}
}
}
+
+
+// static int nClipedPixelSum=0;
+
+// nClipedPixelSum += nClipedPixels;
}
void showStat(void)
@@ -604,7 +704,7 @@ void showStat(void)
for(int i=0; i<nStat; i++)
{
int x= statX[i] + 100;
- int y= statY[i] + 100;
+ int y= statY[i]/10 + 100;
if(y<0 || x<0) continue;
if(y>=wndy || x>=wndx) continue;
@@ -613,6 +713,38 @@ void showStat(void)
}
}
+void movePic(int hSync)
+{
+ int nPixMove= REAL_HSYNC_LOC - hSync;
+
+ if(nPixMove>wndx) nPixMove=0;
+ if(nPixMove<-wndx) nPixMove=0;
+
+ byte * p= &actVid2MemBufp->b[0];
+ for(int line=1; line<wndy; line++)
+ {
+ if(nPixMove>0)
+ {
+ memmove(&p[nPixMove*2], &p[0], (wndx-nPixMove)*2);
+ }
+ else if(nPixMove<0)
+ {
+ memmove(&p[0], &p[-nPixMove*2], (wndx+nPixMove)*2);
+ }
+ if(nPixMove & 1)
+ for(int x=0; x<wndx-2; x++)
+ {
+ p[x*2]= p[x*2+2];
+ }
+ for(int x=0; x<wndx-2; x++)
+ {
+// p[x*2]=0;
+ }
+ p+= vgax<<1;
+ }
+}
+
+
extern volatile bool isVPayTvBrightHack;
extern volatile int vPayTvQPosInLCC;
@@ -633,118 +765,98 @@ void vPayTvDecrypt(void)
if(dropList[0]&2) return;
}
- int qLine= findQLine();
- int vSync= -1;//findVSync(qLine);
+ int hSync= findHSync();
+ int vSync= -1;//findVSync(qCol);
- if(qLine!= -1)
- {
- vPayTvQPosInLCC= (qLine-wndx-6)*1888 / wndx;
- }
+ if(hSync!= -1)
+ {
+ vPayTvQPosInLCC= (hSync-wndx-12)*1888 / wndx; //FIXME #DEFINE IT
+ }
+ int qCol;
+ if(hSync==-1) qCol= -1;
+ else qCol= hSync - Q_2_HSYNC_DISTANCE;
+
byte * p= &actVid2MemBufp->b[0];
for(int line=0; line<wndy; line++)
- {
+ {
if((line&3) == qPhase)
- {
- p[2*qLine+1]=0;
- p[2*qLine+3]=255;
- }
- p+= vgax<<1;
+ {
+ p[2*qCol+1]=0;
+ p[2*qCol+3]=255;
+ p[2*hSync+1]=0;
+ p[2*hSync+3]=255;
}
+ p+= vgax<<1;
+ }
p= &actVid2MemBufp->b[0];
for(int x=0; x<wndx; x++)
- {
+ {
if((x&3)==0)
- {
+ {
// p[(vSync*vgax + x)*2 + 1]=0;
// p[(vSync*vgax + x)*2 + 3]=255;
- }
}
+ }
if(lastHSyncDelay!=0)
- {
- analyzeHSyncDelay(qLine);
- }
+ {
+ analyzeHSyncDelay(hSync);
+ }
if(lastVSyncDelay!=0)
- {
+ {
analyzeVSyncDelay(vSync);
- }
+ }
static bool isVSyncBad= false;
if(vSync!=-1 && (vSync<TOP_VSYNC_BOUNDRY || vSync>BOTTOM_VSYNC_BOUNDRY) && 0)
- {
+ {
if(isVSyncBad)
- {
+ {
doVSyncDelay(BOTTOM_VSYNC_BOUNDRY - vSync, vSync);
dropList[1]|=2;
isVSyncBad= false;
- }
+ }
else
- {
+ {
isVSyncBad= true;
- }
}
- else if(qLine!=-1 && qLine<LEFT_QLINE_BOUNDRY)
- {
- doHSyncDelay((RIGHT_QLINE_BOUNDRY + LEFT_QLINE_BOUNDRY)/2 - qLine, qLine);
+ }
+ else if(hSync!=-1 && hSync<LEFT_HSYNC_BOUNDRY)
+ {
+ doHSyncDelay((RIGHT_HSYNC_BOUNDRY + LEFT_HSYNC_BOUNDRY)/2 - hSync, hSync);
dropList[1]|=2;
- }
- else if(qLine==-1 && 0)
- {
+ }
+ else if(hSync==-1 && 0)
+ {
doHSyncDelay(wndx/2, 1);
lastHSyncDelay=0;
dropList[1]|=2;
- }
+ }
else if(isVCPhaseTrick)
- {
+ {
isVCPhaseTrick= false;
vPayTvShiftHack(1000);
dropList[1]|=2;
- }
+ }
else
- {
+ {
isVSyncBad= false;
- }
+ }
- if(qLine==-1) dropList[1]|=2;
+ if(hSync==-1) dropList[1]|=2;
- fixBrightness(qLine);
+ fixBrightness(hSync);
+
+ //fixColor(qCol);
// showStat();
- int nPixMove= REAL_QLINE_POS - qLine;
-
- if(nPixMove>wndx) nPixMove=0;
- if(nPixMove<-wndx) nPixMove=0;
-
-
- p= &actVid2MemBufp->b[0];
- for(int line=1; line<wndy; line++)
- {
- if(nPixMove>0)
- {
- memmove(&p[nPixMove*2], &p[0], (wndx-nPixMove)*2);
- }
- else if(nPixMove<0)
- {
- memmove(&p[0], &p[-nPixMove*2], (wndx+nPixMove)*2);
- }
- if(nPixMove & 1)
- for(int x=0; x<wndx-2; x++)
- {
- p[x*2]= p[x*2+2];
- }
- for(int x=0; x<wndx-2; x++)
- {
-// p[x*2]=0;
- }
- p+= vgax<<1;
- }
-
+ movePic(hSync);
- lastQLine= qLine;
+ lastHSync= hSync;
}
Copied: trunk/2010/2d.txt (from r62, /trunk/2010/2d)
==============================================================================
--- /trunk/2010/2d (original)
+++ trunk/2010/2d.txt Wed Jul 4 11:38:46 2007
@@ -1,3 +1,9 @@
+VPAYTV
+timing Info
+optimieren
+fine Tunenen v #defines
+
+sync info verschieben abhngig v vLine
txt restart!?
rgb565 / 1555 stuff not realy correct but works
add rgb1555 support
@@ -21,11 +27,11 @@ vc color deco mmx
nag last line ?
-yuv2rgb mmx
-
NAG_LINES ?
teletext:
BETTER decode
SAVE
fix fractional digits
+
+a few PAL-Constants are in 2_crypt.h should be in 2_pal.h
More information about the Mndiff-dev
mailing list