Je préfère de loin faire des trucs rapides. Tiens, entre hier et aujourd'hui sur TO8 j'ai obtenu le code ASM suivant:
Code : Tout sélectionner
10 CLEAR,&H8FFF
30 READ A$:IF LEN(A$)=4 THEN A=VAL("&H"+A$):GOTO 30
40 IF A$="**" THEN EXEC A ELSE POKE A,VAL("&H"+A$):A=A+1:GOTO 30
50 DATA 9000
60 DATA 34,7F,1A,50,CE,90,6A,E6,C0,BD
70 DATA E8,03,26,F9,CE,E7,C3,1F,30,1F
80 DATA 8B,CE,90,AB,8E,0C,60,A6,C8,D4
90 DATA A7,C0,30,1F,26,F7,86,7E,A7,C0
100 DATA CC,90,40,ED,C4,4F,5F,DD,CE,C6
110 DATA 7F,DD,CC,8A,04,97,CE,97,CF,8E
120 DATA 9D,0C,20,3F,96,CC,34,02,CC,90
130 DATA 6F,ED,C4,8E,9D,0E,5F,D7,DB,EC
140 DATA 81,D7,DA,97,DA,8C,9D,2E,26,F5
150 DATA CC,90,00,97,E7,D7,E5,8E,A0,00
160 DATA 35,02,20,09,35,FF,1B,60,1B,5E
170 DATA 00,96,CC,97,CD,34,32,35,32,34
180 DATA 36,35,36,21,EB,2C,E9,96,CC,97
190 DATA CD,D6,CC,27,05,3A,96,CC,20,07
200 DATA 8E,A0,00,96,CC,20,00,D6,CC,ED
210 DATA 84,D6,CC,27,05,3A,96,CC,20,07
220 DATA 8E,A0,00,96,CC,20,00,D6,CC,ED
230 DATA 84
240 DATA 9000,**
Code : Tout sélectionner
#/bin/perl
##############################################################################
# Conversion de fichier video en fichier SD fonctionnant avec le
# player SDANIM3 de Daniel Coulom pour THOMSON modifié pour le mode
# "2 octets"
#
# (http://forum.system-cfg.com/viewtopic.php?p=104928#p104928)
#
# par Samuel Devulder.
#
# Historique:
# ===========
# 09/06/2015 - version initiale. Portage semi direct du code C.
#
# 10/06/2015 - utilisation de la matrice vac-8 qui donne une image plus
# fine que le h4x4a
# - fps et zoom revu pour avoir une vitesse et une qualité
# très correcte (10fps et zoom 70%)
# - optimisation de la vitesse de compression:
# - les bords noirs supérieur et inférieurs de l'écran
# sont ignores
# - la boucle while cherchant les différences ne lit à
# présent qu'un seul des deux tablraux puisque la lecture
# nous fournit en cible le delta avec l'image actuelle.
# du coup la vitesse d'encodage passe de x0.4 à x1.
# - meilleure synchro video quand une image est compressée en
# moins de BUFFSIZE octets: on retourne simplement en haut
# de l'écran sans re-encoder la même image de sorte qu'au
# changement d'écran on redémarre en haut de la nouvelle image.
# On ne voit quasiment plus des demi-images et la vidéo est
# très fluide
# - mise en place d'une correction sonnore auto-adaptative.
# Donne d'excellents resultats pour Dire Straits (sultan of
# swing est fort et clair avec une bonne dynamique à présent).
# - stockage des images temporaires dans un sous-dossier tmp/
# pour ne opas polluer le répertoire courant.
#
# 12/06/2015 - mise en place d'un algo pour calculer le meilleur zoom
# ou framerate. Dans un 1er temps la vidéo est échantillonnée
# à 1 image /sec (pour aller vite) avec un zoom de 1. Puis
# compressée sans limite de taille de buffer. A la fin de la
# vidéo on obtient le nombre d'octets moyen par image (LEN_BY_IMG).
#
# si LEN_BY_IMG est inférieur au BUFFERSIZE associé au framerate
# choisi (FPS), ca veut dire que le framerate est un peu petit
# et que l'on gaspille des octets puisque BUFFERSIZE n'est pas
# complètement rempli. On peut alors augmenter le framerate de
# la même proportion d'écart entre BUFFERSIZE et LEN_BY_IMG:
# FPS <- FPS*(BUFFERSIZE/LEN_BY_IMG)
# C'est ce qu'il se passe avec les video facilement compressibles
# l'outil va en profiter pour augmenter le FPS afin d'occuper
# tout le buffer alloué à une image. Cependant le cas le plus
# fréquent est le suivant:
#
# Si LEN_BY_IMG est supérieur à BUFFERSIZE, c'est que ce dernier
# est trop petit pour contenir une image compressée. On peut alors
# jouer sur le facteur de zoom pour que l'image compressée tienne
# dans BUFFERSIZE. En première approximation si on réduit l'image
# d'un facteur r<1, le nombre de pixel à compresser est réduit
# d'un facteur r*r. La taille compressée est elle aussi sensiblement
# réduite du même facteur (imaginez diviser une image par 2, il y a
# 4x fois moins d'information à compresser, et la compression sera
# aussi 4x plus petite). Du coup cela veut dire que r*r peut valoir
# LEN_BY_IMG/BUFFERSIZE plus une petite marge (que je fixe à 15%).
# Cela signifie que l'on peut utiliser un zoom de
# SQRT(BUFFERSIZE/(LEN_BY_IMG + 15%))
# pour avoisiner le taux d'occupation idéal de BUFFERSIZE.
#
# - mise en place d'un contraste sigmoidal qui tasse les intensités
# sombre et lumineuses afin d'avoir des image très contrastée qui
# apparaissent dès lors un peu moins bruitées. Cependant je
# les trouve alors moins riche au niveau des dégradés.
#
# 27/06/2015 - Adapation au player "2octets", retour au ordered-dither,
# detection du bon espace RGB linéaire.
#
# 30/06/2015 - Ajout d'un algo de re-normalisation des niveau RVB pour eviter
# d'avoir un film globalement trop sombre. Le contraste et les
# couleurs sont grandement amméliorés.
#
# 03/07/2015 - Adaptation au protocole "sans acquitement" permettant d'avoir
# une bande passante video 3x par rapport à l'audio.
#
# 11/07/2015 - Adaptation au protocole "par block" avec un débit de 60 cycles
# pour un échantillon audio et 2 triplets video.
#
# 18/09/2015 - Debut d'adapation pour le mode BM16.
#
##############################################################################
$file = $ARGV[0];
# params par defaut
mkdir("tmp");
$img_pattern = "tmp/img%05d.bmp";
($w, $h) = (160, 100); # 16:9
$cycles = 60; # cyles cpu par echantillon audio
$hz = int(2000000/$cycles+.5)/2;
$fps = 10;
$interlace = 1; # 0=off, 1=simple
$audio_dither = 0;
$dither = "vac4";
$zigzag = 1;
# recherche la taille de l'image
($x,$y, $aspect_ratio) = (160,100,"16:9");
open(IN, "./ffmpeg -i \"$file\" 2>&1 |");
while(<IN>) {
if(/, (\d+)x(\d+)/) {
($x,$y) = ($1, $2);
# 4:3
if(abs($x - 4/3*$y) < abs($x - 16/9*$y)) {
($w,$h,$aspect_ratio) = (133,100,"4:3");
}
}
}
close(IN);
$h = int(($w=160)*$y/$x);
$w = int(($h=100)*$x/$y) if $h>100;
print $file," : ${x}x${y} ($aspect_ratio) -> ${w}x${h}\n";
# AUDIO: unsigned 8bits, mono, 16125hz
open(AUDIO, "./ffmpeg -i \"$file\" -v 0 -f u8 -ac 1 -ar ".int(2*$hz)." -acodec pcm_u8 - |");
binmode(AUDIO);
# tuyau vers ffmpeg pour images
open(FFMPEG,'| (read line; $line)');# -vf format=gray
binmode(FFMPEG);
# fichier video (entree)
open(IN, "<$file");
binmode(IN);
# détermination des parametres de dither
open(DITHER_O,"| ./ffmpeg -i - -v 0 -r 1 -s ${w}x${h} -an $img_pattern");
open(DITHER_I, "<$file");
binmode(DITHER_I);
binmode(DITHER_O);
# guess zoom
open(GUESS_O,"| ./ffmpeg -i - -v 0 -r 1 -s ${w}x${h} -an $img_pattern");
open(GUESS_I, "<$file");
binmode(GUESS_I);
binmode(GUESS_O);
# init image magick
&magick_init;
# parametres de dither
&dither_init(\*DITHER_I, \*DITHER_O, $dither, $w, $h);
# determination du zoom optimal
$zoom = &guess_zoom(\*GUESS_I, \*GUESS_O, $w, $h); close(GUESS_I); close(GUESS_O);
$fps = int($fps * ($zoom>1?$zoom:1));
$w = int($w*($zoom>1?1:$zoom));
$h = int($h*($zoom>1?1:$zoom));
print sprintf("zoom = %.2g -> %dx%d @ %dfps\n", $zoom, $w, $h, $fps);
$fps = 25 if $fps>25;
$cmd = "./ffmpeg -i - -v 0 -r $fps -s ${w}x${h} -an $img_pattern\n";
syswrite(FFMPEG, $cmd, length($cmd));
# nettoyage
unlink(<tmp/img*.bmp>);
# fichier sd (sortie)
$name = $file; $name =~ s/\.[^\.]*$//; $name .= ".sd";
open(OUT, ">$name");
binmode(OUT);
# multiplicateur audio
@audio_cor = (8, 255);
# compteur image
$cpt = 1;
# ecran courant
@ecran = ((0) x 16384);
# position dans ecran
$pos = 16384;
# 1er bloc donnée: palette
push(@pal, 0, $GRN0*16, 0, $GRN1*16, 0,$GRN2*16, 0,$GRN3*16);
for my $r ($RED0, $RED1, $RED2, $RED3) {
for my $b ($BLU0, $BLU1, $BLU2) {
push(@pal, $b, $r);
}
}
while($#pal<291) {push(@pal, 0);}
# compression
$time = 0; $start = time; $realimg = 0; $start_pos=0; $pause = 60;
$cycles_per_img = 1000000/$fps;
$current_cycle = $cycles_per_img; $clk = 0;
# 1er bloc donnees
@buf = ();
while(1) {
push(@buf, 0x80 | ($clk ^= 0x40)); # son
last if $#buf==511;
push(@buf, 2); # depl
push(@buf, splice(@pal,0,2));
push(@buf, 2); # depl
push(@buf, splice(@pal,0,2));
}
print OUT pack('C*', @buf);
@buf = ();
for($running = 0x80; 1; $current_cycle += $cycles) {
push(@buf, &echantillon_audio());
if($#buf<511) {
push(@buf, &triplets_video());
} else {
# write
print OUT pack('C*', @buf);
@buf = ();
# fin fichier
last unless $running;
}
}
# nettoyage et fermetue flux
print STDERR "\n";
unlink(<tmp/img*.bmp>);
close(OUT);
close(IN);
close(FFMPEG);
close(AUDIO);
# Lit 2 échantillons audio de FFMPEG et le converti en échantillon audio pour le flux SD
sub echantillon_audio {
if(!@AUDIO) {
my($buf);
$running = 0 if !read(AUDIO,$buf,8192);
push(@AUDIO, unpack('C*', $buf));
}
my $v = (shift(@AUDIO)+shift(@AUDIO))/2;
# volume auto
$audio_cor[1] = $v if $v<$audio_cor[1];
$v-=$audio_cor[1];
$audio_cor[0] = 255/$v if $v*$audio_cor[0]>255;
$v *= $audio_cor[0];
# dither audio
$v += int(rand(3)) if $audio_dither;
$v=255 if $v>255;
# sortie audio
return ($v>>2) | $running | ($clk ^= 0x40);
}
# retourne 2 triplets video
sub triplets_video {
my($num, @buf) = 2;
if($current_cycle>=$cycles_per_img) {
$current_cycle-=$cycles_per_img;
&next_image(\*IN,\*FFMPEG,$w,$h);
# image complète ?
if($pos>=16384+$start_pos) {
++$realimg;
push(@buf, 0, $ecran[0] ^= $cible[0], $ecran[1] ^= $cible[1]);
$cible[0] = $cible[1] = 0;
$pos = 0; $num = 1;
}
$start_pos = $pos;
# infos à l'écran
if($cpt%$fps == 0) {
++$time;
my($d) = time-$start+.0001;
print STDERR sprintf("%d:%02d:%02d (%.2gx) v=1:%.3g a=(x%+d)*%.1g \r",
int($time/3600), int($time/60)%60, $time%60,
int(100*$time/$d)/100, $realimg/($cpt-1), -$audio_cor[1], $audio_cor[0]);
# pour ne pas trop faire chauffer le CPU
if($d>$pause) {$pause = $d+60;sleep(10);}
}
}
for (1..$num) {
my($k,$p) = (0, $pos % 16192);
while($k<255 && !$cible[$p+$k]) {++$k;}
$pos+=$k;
if(($p+=$k)>=16192) {
$k = $p = 0;
$pos = int($pos/16192)*16192;
}
my($q) = $p+1;
push(@buf, $k, $ecran[$p] ^= $cible[$p], $ecran[$q] ^= $cible[$q]);
$cible[$p] = 0 if $p<16192;
$cible[$q] = 0 if $q<16192;
}
return @buf;
}
sub tune_image {
my($tmp) = @_;
$tmp->Modulate(saturation=>140); # un peu plus de couleurs
$tmp->Evaluate(operator=>'Multiply', value=>255/245);
}
# Lit l'image suivante. Retourne 1 si ok, 0 si fin fichier
sub next_image {
my($IN, $OUT, $w, $h) = @_;
# nom du fichier BMP
my $name = sprintf($img_pattern, $cpt++);
# taille fichier BMP
my $expected_size = $h*(($w*3 + 3)&~3) + 54; # couleur
#print "$w, $h, $expected_size\n";
# on nourrit ffmpeg jusqu'a obtenir un fichier BMP fini
while($expected_size != -s $name) {
my $buf;
my $read = read($IN,$buf,8192);
last unless $read;
syswrite $OUT, $buf, $read;
}
# lecture image
my $tmp = Image::Magick->new();
my $z = $tmp->Read($name);
#print STDERR $z if $z;
return 0 if $z; # si erreur => fin fichier
unlink $name;
# dither
$tmp->Set(depth=>16);
$tmp->Set(colorspace=>$LINEAR_SPACE);
&tune_image($tmp);
my @px = $tmp->GetPixels(height=>$h, normalize=>"True"); undef $tmp;
for my $c (@px) {$c = int($c*255);}
$dR = sub {
my($v, $d,$a,$b) = @_;
my($k) = "$v,$d";
my $t = $glb_dR{$k};
return $t if defined $t;
$d /= $mat_x*$mat_y+1.0;
($a,$b) = ($lin_pal[$RED2],$lin_pal[$RED3]);
return $glb_dR{$k}=(($v-$a)/($b-$a)>=$d ? 3 : 2) if $v>=$a;
($a,$b) = ($lin_pal[$RED1],$a);
return $glb_dR{$k}=(($v-$a)/($b-$a)>=$d ? 2 : 1) if $v>=$a;
($a,$b) = ($lin_pal[$RED0],$a);
return $glb_dR{$k}=(($v-$a)/($b-$a)>=$d ? 1 : 0);
} unless $dR;
$dG = sub {
my($v, $d,$a,$b) = @_;
my($k) = "$v,$d";
my $t = $glb_dG{$k};
return $t if defined $t;
$d /= $mat_x*$mat_y+1.0;
($a,$b) = ($lin_pal[$GRN2],$lin_pal[$GRN3]);
return $glb_dG{$k}=(($v-$a)/($b-$a)>=$d ? 3 : 2) if $v>=$a;
($a,$b) = ($lin_pal[$GRN1],$a);
return $glb_dG{$k}=(($v-$a)/($b-$a)>=$d ? 2 : 1) if $v>=$a;
($a,$b) = ($lin_pal[$GRN0],$a);
return $glb_dG{$k}=(($v-$a)/($b-$a)>=$d ? 1 : 0);
} unless $dG;
$dB = sub {
my($v, $d,$a,$b) = @_;
my($k) = "$v,$d";
my $t = $glb_dB{$k};
return $t if defined $t;
$d /= $mat_x*$mat_y+1.0;
($a,$b) = ($lin_pal[$BLU1],$lin_pal[$BLU2]);
return $glb_dB{$k}=(($v-$a)/($b-$a)>=$d ? 2 : 1) if $v>=$a;
($a,$b) = ($lin_pal[$BLU0],$a);
return $glb_dB{$k}=(($v-$a)/($b-$a)>=$d ? 1 : 0);
} unless $dB;
@cible = (0)x16192;
$pset = sub {
my($x,$y, $r,$g,$b) = @_;
my($p)=$y*80 + ($x>>2);
$p += 8192 unless $x & 2;
my($a,$b) = ($g,$r*3+$b+4);
($a,$b)=($a<<4,$b<<4) unless $x&1;
($a,$b)=($b,$a) if $zigzag && ($x&1);
$cible[$p] |= $a;
$cible[$p+40] |= $b;
} unless $pset;
for my $y (0..$h-1) {
for my $x (0..$w-1) {
my($d) = $mat[$x%$mat_x][$y%$mat_y];
my(@p) = splice(@px, 0, 3);
$pset->($x,$y, $dR->($p[0],$d),$dG->($p[1],$d),$dB->($p[2],$d));
}
}
# compute delta
for my $i (0..$#cible) {$cible[$i]^=$ecran[$i]}
@cible[16192..16194] = (255,255,255); # sentinelle
# intrelacement
if($interlace) {
my $f = sub {
my($y) = @_;
splice(@cible, $y*40, 40, (0)x40);
splice(@cible, $y*40+8192, 40, (0)x40);
};
for(my $y=$cpt&1; $y<200; $y+=2) {$f->($y);}
}
return 1;
}
sub guess_zoom {
my($IN, $OUT, $w, $h) = @_;
my $BUFFERSIZE = 7*int(($hz+$fps-1)/$fps);
unlink(<tmp/img*.bmp>);
@ecran = ((0)x16384);
local $cpt = 1;
my $size = 0;
while(&next_image($IN,$OUT,$w,$h)) {
for(my $p = 0; $p<16192;) {
my $k = 1;
while($k<255 && !$cible[$p+$k]) {++$k;}
$p+=$k;
$cible[$p+1]=0; # <== car on marche de 2 en deux
++$size if (($size&511)%7)==0; # audio
$size += 3; # video
}
# audio + goto 0
$size += 4;
print STDERR sprintf("avg %dx%d frame length = %d bytes (%d%%) @ %ds \r", $w, $h, int($size/($cpt-1)), int(100*$size/(($cpt-1)*$BUFFERSIZE)), $cpt-1);
}
$total_sec = $cpt-1;
unlink(<tmp/img*.bmp>);
print STDERR "\n";
my $len_per_img = ($size/($cpt-1)) * (1.05); # 5% extra
close($IN);
close($OUT);
my $zoom = $BUFFERSIZE/$len_per_img;
return $zoom>=1?$zoom:sqrt($zoom);
}
sub dither_init {
my($in, $out, $dither, $w, $h) = @_;
my $expected_size = $h*(($w*3 + 3)&~3) + 54;
# param dither
@mat = ([1]);
@mat = ([1,3],
[4,2]) if $dither eq "bayer2";
@mat = ([7,8,2],
[6,9,4],
[3,5,1]) if $dither eq "sam3";
@mat = ([3,7,4],
[6,1,9],
[2,8,5]) if $dither eq "3x3";
@mat = ([6, 9, 7, 12],
[14, 3, 15, 1],
[8, 11, 5, 10],
[16, 2, 13, 4]) if $dither eq "vac4";
@mat = ([1,9,3,11],
[13,5,15,7],
[4,12,2,10],
[16,8,14,6]) if $dither eq "bayer4";
@mat = ([21,2,16,11,6],
[9,23,5,18,14],
[19,12,7,24,1],
[22,3,17,13,8],
[15,10,25,4,20]) if $dither eq "vac5";
@mat = ([35,57,19,55,7,51,4,21],
[29,6,41,27,37,17,59,45],
[61,15,53,12,62,25,33,9],
[23,39,31,49,2,47,13,43],
[3,52,8,22,36,58,20,56],
[38,18,60,46,30,5,42,28],
[63,26,34,11,64,16,54,10],
[14,48,1,44,24,40,32,50]) if $dither eq "vac8";
$mat_x = 1+$#mat;
$mat_y = 1+$#{$mat[0]};
@teo_pal = (0,100,127,142,163,179,191,203,215,223,231,239,243,247,251,255);
@lin_pal = (0, 33, 54, 69, 93,115,133,152,173,188,204,220,229,237,246,255);
my @pc2teo = ();
for my $i (1..$#teo_pal) {
my($a,$b,$c) = ($teo_pal[$i-1],($teo_pal[$i-1]+$teo_pal[$i])>>1,$teo_pal[$i]);
for my $j ($a..$b) {$pc2teo[$j] = $i-1;}
for my $j ($b+1..$c) {$pc2teo[$j] = $i;}
}
my @tabR = (0)x16;
my @tabG = (0)x16;
my @tabB = (0)x16;
my $time = 1;
my $run = 1;
while(1) {
my $name = sprintf($img_pattern, $time);
if($expected_size != -s $name) {
last unless $run;
my $buf;
my $read = read($in,$buf,4096);
if($read) {
syswrite $out, $buf, $read;
} else {
$run = 0;
close($out);
}
} else {
# image complete!
print STDERR $time++,"s\r";
# lecture de l'image
my $img = Image::Magick->new();
my $x = $img->Read($name); die "$x, stopped $!" if $x;
unlink $name;
&tune_image($img);
if(!defined $pal4096) {
my @px;
for my $r (0..15) {
for my $g (0..15) {
for my $b (0..15) {
push(@px, $teo_pal[$r], $teo_pal[$g], $teo_pal[$b]);
}
}
}
$pal4096 = &px2img(256,16, @px);
}
$img->Remap(image=>$pal4096, dither=>"true", "dither-method"=>"Floyd-Steinberg");
# trammage
my @px = $img->GetPixels(height=>$h, normalize=>"True");
undef $img;
for(my $i=0; $i<$#px; $i+=3) {
++$tabR[$pc2teo[int($px[$i+0]*255)]];
++$tabG[$pc2teo[int($px[$i+1]*255)]];
++$tabB[$pc2teo[int($px[$i+2]*255)]];
}
}
}
close($in);close($out);
unlink(<tmp/img*.bmp>);
my $f = sub {
my($name, @t) = @_;
my($tot, $acc, $max, @r);
my(@tab) = splice(@t,0,16);
for my $t (@tab) {$max = $t if $t>$max; $tot += $t;}
$r[0] = -1;
for my $t (@t) {
for(my $i=$r[$#r]+1; $i<16; ++$i) {
$acc += $tab[$i];
if($acc>=$t*$tot) {
push(@r, $i);
last;
}
}
}
shift @r;
for my $i (0..$#tab) {print sprintf("%s%2d:%3d%% %s\n", $name, $i, int(100*$tab[$i]/$tot), "X"x(int(50*$tab[$i]/$max)));}
print join(' ', @r),"\n";
return @r;
};
($RED0, $RED1, $RED2, $RED3) = $f->("RED", @tabR, 0.02, 0.33, 0.66, 0.98);
($GRN0, $GRN1, $GRN2, $GRN3) = $f->("GRN", @tabR, 0.02, 0.33, 0.66, 0.98);
($BLU0, $BLU1, $BLU2) = $f->("GRN", @tabR, 0.02, 0.50, 0.98);
}
sub px2img {
my($width,$height,@px) = @_;
open(PX2IMG,">/tmp/.toto2.pnm");
print PX2IMG "P6\n$width $height\n255\n",pack('C*', @px),"\n";
close(PX2IMG);
my $img2 = Image::Magick->new();
$img2->ReadImage("/tmp/.toto2.pnm");
unlink "/tmp/.toto2.pnm";
return $img2;
}
sub magick_init {
if(!$_magick) {
$_magick = 1;
eval 'use Image::Magick;';
# determination de l'espace RGB lineaire
my $img = Image::Magick->new(size=>"256x1", depth=>16);
$img->Read('gradient:black-white');
$img->Set(colorspace=>'RGB');
#$img->Set(colorspace=>"Gray") unless $coul;
my @px1 = $img->GetPixel(x=>128, y=>0);
$img->Read('gradient:black-white');
$img->Set(colorspace=>'sRGB');
#$img->Set(colorspace=>"Gray") unless $coul;
my @px2 = $img->GetPixel(x=>128, y=>0);
my $d1 = $px1[0]-0.5; $d1=-$d1 if $d1<0;
my $d2 = $px2[0]-0.5; $d2=-$d2 if $d2<0;
$LINEAR_SPACE = $d1>=$d2 ? "RGB" : "sRGB";
#print $px1[0], " ",$px2[0]," $LINEAR_SPACE\n";
}
}
Comme on peut le voir on peut faire une version entrelacée ou non. En entrelacé les images sont plus grandes, mais on voit bien l'entrelacement des lignes lors des gros changements. La version non entrelacée ne montre que les bicolonnes paires/impaires.
(Sur emul ca marche bien. Sur vraie machine il faut modifier le player pour qu'il récupère les noms de fichier).
.
Si on s'autorise à le changer, on peut éviter l'apparition des bi-colonnes. Mais je pense qu'il faut sans doute trouver un meilleur encodage. L'offset vaut souvent 2. C'est un peu du gaspillage. Si on le rends implicite, on augmente de 50% la bande passante vidéo: 6 données vidéos en 60 cycles, soit un écran complet (16ko) en 164ms, sensiblement 6fps sans compression. Hum.. bof.