Petite modif.. le player précédent a une période de 65cycles, ce qui nous fait une fréquence en Hz qui ne tombe pas trop juste: 15384.6153846Hz. Pour avoir une fréquence en Hz plus agréable à utiliser j'ai écrit une version à 66cycles:__sam__ a écrit :Demain je vais publier des exemples de ce que j'obtiens avec ce nouveau codage.... suspens.....
Code : Tout sélectionner
ORG $9000
INI
PSHS U,Y,X,DP,B,A,CC empile les registres
ORCC #$50 masque les interruptions
LDX #$1F40 adresse pour test RAM ou ROM
LDB ,X lecture adresse X
COM ,X tente de modifier adresse X
CMPB ,X test modification adresse X
BEQ INIT1 pas de difference -> TO
COM ,X retablissement adresse X
LDU #$A7C0 port A du PIA systeme
LDX #$0000 adresse dans ecran
BRA INIT2 suite des initialisations
INIT1
LDU #$E7C3 port A du PIA systeme
LDX #$4000 adresse dans ecran
INIT2
STX NEWPIC+1 adresse debut ecran
LDA ,U port A du PIA systeme
ORA #1 set bit 0
STA ,U passage en video forme
TFR U,D extraction base $E7/$A7
TFR A,DP initialisation DP
CLRA A=$00
CLRB B=$00
STD <$CE selectionne DDRA et DDRB
LDB #$7F B=$7F
STD <$CC PA b0-7 en entree, PB b0-6 en sortie
ORA #$04 set b2
STA <$CE selectionne PORTA
STA <$CF selectionne PORTB
BRA PLAY1
*------------------------------------------------------
* JOUE LA VIDEO ET LA MUSIQUE
* Boucle de 66 cycles = 15151.51 Hz
*------------------------------------------------------
* lecture octet depl = 20 cycles
PLAY2
ANDA #$3F (2) clear bit 6
STA <$CD (4) acknowledge
LDB <$CC (4) lecture octet deplacement
BEQ NEWPIC (3) nouvelle image
ABX (3) ajout de l'increment
JMP PLAY3 (4) octet video
* retour debut ecran = 7 cycle
NEWPIC
LDX #$4000 (3)
JMP PLAY3 (4)
* mode 2 octets: 20+3 cycles
PLAY4
ANDA #$3F (2) clear bit 6
STA <$CD (4) request to send
LDB <$CC (4) lecture octet image
STB 1,X (5) affiche l'octet image
LEAX 2,X (5) deplacement de 2 octets
BRA PLAY3 (3) compensation "BMI PLAY4"
* sortie video = 26 cycles
PLAY3
ORA #$40 (2) set bit 6
STA <$CD (4) acknowledge
ANDA #$3F (2) clear bit 6
STA <$CD (4) request to send
LDB <$CC (4) lecture octet image
ORA #$40 (2) set bit 6
STA <$CD (4) acknowledge
STB ,X (4) affiche l'octet image
* echantillon son (14 cycles)
PLAY1
ANDA #$3F (2) clear bit 6
STA <$CD (4) request to send
LDA <$CC (4) lecture echantillon son avec B6
STA <$CD (4) joue le son et acknowledge
BMI PLAY4 (3) mode 2 octets?
BNE PLAY2 (3) fin ?
*------------------------------------------------------
* RETOUR AU BASIC
*------------------------------------------------------
ORA #$40 (2) set bit 6
STA <$CD (4) acknowledge
* retour au Basic
PULS CC,A,B,DP,X,Y,U,PC
* retour a l'assembleur
* SWI
END INI
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.
#
##############################################################################
$file = $ARGV[0];
# params par defaut
mkdir("tmp");
$img_pattern = "tmp/img%05d.bmp";
($w, $h) = (320, 180); # 16:9
$hz = 15151.5;
$fps = 10;
$interlace = 0;
$BUFFERSIZE = int((3*$hz+$fps-1)/$fps);
# recherche la taille de l'image
($x,$y, $aspect_ratio) = (320,200,"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) = (266,200,"4:3");
}
}
}
close(IN);
$h = int(($w=320)*$y/$x);
$w = int(($h=200)*$x/$y) if $h>200;
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);
# determination du zoom optimal
$zoom = &guess_zoom($w, $h);
$fps = int($fps * ($zoom>1?$zoom:1));
$BUFFERSIZE = int((3*$hz+$fps-1)/$fps);
$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);
$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 8000);
# position dans ecran
$pos = 8000;
# compression
$time = 0; $start = time; $realimg = 0; $pause = 60;
while(&next_image(*IN,*FFMPEG,$w,$h) && &compresse()) {
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(10*$time/$d)/10, $realimg/($cpt-1), -$audio_cor[1], $audio_cor[0]);
# pour ne pas trop chauffer
if($d>$pause) {
$pause = $d+60;
sleep(10);
}
}
#last if $time>30;
}
# fin fichier
print OUT pack('C*', (0x00,0x00,0x00) x int(1+$BUFFERSIZE/3));
# nettoyage et fermetue flux
print STDERR "\n";
unlink(<tmp/img*.bmp>);
close(OUT);
close(IN);
close(FFMPEG);
close(AUDIO);
# 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;
}
# chargement image-magick la 1ere fois
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:gray(0)-gray(100%)');
$img->Set(colorspace=>'RGB');
my @px1 = $img->GetPixel(x=>184, y=>0);
$img->Set(colorspace=>'sRGB');
my @px2 = $img->GetPixel(x=>184, 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";
}
# 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);
$tmp->Set(dither=>"FloydSteinberg");
if(0) {
#$tmp->Set(monochrome=>"True");
$tmp->Set(colorspace=>"gray");
$tmp->Remap(image=>$bw_img, dither=>"True", "dither-method"=>"FloydSteinberg");
} else {
# mieux ?
$tmp->Set(colorspace=>"gray");
$tmp->OrderedDither(threshold=>"o8x8,2");
#$tmp->OrderedDither(threshold=>"h8x8a,2");
#$tmp->OrderedDither(threshold=>"vac-128,2");
}
# centrage dans image 320x20
my $img = Image::Magick->new(size=>"320x200");
$img->Read("canvas:black");
$img->Composite(image=>$tmp,compose=>"Over",
x=>(320-$w)>>1,y=>(200-$h)>>1);
# remplissage variable globale @cible
my(@p) = $img->GetPixels(map=>"RGB", height=>200, width=>320, normalize=>"True");
my($start) = (200-$h)>>1;
my($stop) = (200-$start)*960-3;
@cible = (0)x(40*$start);
for(my $i=$start*960-3; $i<$stop;) {
my $v = 0;
for my $j (0..7) {$v <<= 1; $v |= 1 if $p[$i+=3]>.5;}
push(@cible, $v ^ $ecran[1+$#cible]);
}
push(@cible, (0)x(40*$start), 1);
if($interlace) {
for(my $y=$cpt&1; $y<200; $y+=2) {splice(@cible,40*$y,40,(0)x40);}
}
return 1;
}
# compresse @cible dans $BUFFERSIZE
sub compresse {
my(@buf) = (0)x$BUFFERSIZE;
my($ok) = 1;
my($k);
my($img_complete) = 0;
# audio
for(my $i=0; $i<$BUFFERSIZE; $i+=3) {
if(!@AUDIO) {
my($buf);
if(!read(AUDIO,$buf,8192)) {
$buf[$i+2] = 0xff; # EOF
$ok = 0;
last
}
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)); $v=255 if $v>255;
$buf[$i] = ($v>>2) | 0x40;
}
# video
my($i) = 0;
if($pos>=8000) {
$buf[$i+1] = $pos = 0;
$buf[$i+2] = ($ecran[$pos] ^= $cible[$pos]); $cible[$pos]=0;
$i += 3;
}
while($i < $BUFFERSIZE) {
my $p = $pos % 8000;
if($p < 7998 && ($cible[$p+1] || $cible[$p+2])) {
$buf[$i+0] |= 0x80;
$buf[$i+1] = ($ecran[$p+1] ^= $cible[$p+1]); $cible[$p+1]=0;
$buf[$i+2] = ($ecran[$p+2] ^= $cible[$p+2]); $cible[$p+2]=0;
$pos += 2;
} else {
my($k) = 1;
while($k<255 && !$cible[$p+$k]) {++$k;}
$pos+=$k;
$k = $p = 0 if ($p+=$k)==8000;
$buf[$i+1] = $k;
$buf[$i+2] = ($ecran[$p] ^= $cible[$p]); $cible[$p]=0;
}
$i += 3;
}
++$realimg if $pos>=8000;
# write
print OUT pack('C*', @buf);
return $ok;
}
sub guess_zoom {
my($w, $h) = @_;
# tuyau vers ffmpeg pour images
open(GOUT,"| ./ffmpeg -i - -v 0 -r 1 -s ${w}x${h} -an $img_pattern");# -vf format=gray
binmode(GOUT);
# fichier video (entree)
open(GIN, "<$file");
binmode(GIN);
unlink(<tmp/img*.bmp>);
@ecran = ((0)x8000, 1);
local $cpt = 1;
my $size = 0;
while(&next_image(\*GIN, \*GOUT,$w,$h)) {
my $p = 0;
while($p<8000) {
my $k;
if($p < 7998 && ($cible[$p+1] || $cible[$p+2])) {
$k=2;
} else {
$k = 1;
while($k<255 && !$cible[$p+$k]) {++$k;}
}
$p+=$k; $size += 3;
}
$size += 3; # retour debut
for $p (0..7999) {$ecran[$p] ^= $cible[$p];}
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);
}
unlink(<tmp/img*.bmp>);
print STDERR "\n";
my $len_per_img = ($size/($cpt-1)) * (1.15); # 15% extra
close(GIN);
close(GOUT);
my $zoom = $BUFFERSIZE/$len_per_img;
return $zoom>=1?$zoom:sqrt($zoom);
}
Code : Tout sélectionner
10 CLEAR,&H8FFF
20 COLOR7,0:SCREEN,,0:CLS:LOCATE1,1,0
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,8E,1F,40,E6,84,63
70 DATA 84,E1,84,27,0A,63,84,CE,A7,C0
80 DATA 8E,00,00,20,06,CE,E7,C3,8E,40
90 DATA 00,BF,90,49,A6,C4,8A,01,A7,C4
100 DATA 1F,30,1F,8B,4F,5F,DD,CE,C6,7F
110 DATA DD,CC,8A,04,97,CE,97,CF,20,2E
120 DATA 84,3F,97,CD,D6,CC,27,04,3A,7E
130 DATA 90,5A,8E,40,00,7E,90,5A,84,3F
140 DATA 97,CD,D6,CC,E7,01,30,02,20,00
150 DATA 8A,40,97,CD,84,3F,97,CD,D6,CC
160 DATA 8A,40,97,CD,E7,84,84,3F,97,CD
170 DATA 96,CC,97,CD,2B,DA,26,C6,8A,40
180 DATA 97,CD,35,FF
190 DATA 9000,**
Code : Tout sélectionner
Eric Prydz - Call on me.mp4 : 640x360 (16:9) -> 320x180
avg 320x180 frame length = 7206 bytes (158%) @ 179s
zoom = 0.74 -> 237x133 @ 10fps
0:03:01 (0.3x) v=1:0.931 a=(x+0)*1
Kylie Minogue - Can't Get You Out Of My Head.mp4 : 554x360 (4:3) -> 307x200
avg 307x200 frame length = 7395 bytes (162%) @ 229s
zoom = 0.73 -> 224x146 @ 10fps
0:03:47 (0.3x) v=1:0.945 a=(x-88)*3
Beaucoup de vidéos ont un zoom>1, ce qui veut dire qu'on peut dépasser les 10fps demandés.
Code : Tout sélectionner
Custom Knight rider intro 1 - Classic.flv : 320x240 (4:3) -> 266x200
avg 266x200 frame length = 3184 bytes (70%) @ 73s
zoom = 1.2 -> 266x200 @ 12fps
0:01:13 (0.3x) v=1:0.977 a=(x-46)*2
HollySiz - Come Back To Me [Clip Officiel].flv : 426x240 (16:9) -> 320x180
avg 320x180 frame length = 2058 bytes (45%) @ 180s
zoom = 1.9 -> 320x180 @ 19fps
0:02:58 (0.2x) v=1:0.93 a=(x+0)*1
Hot Water - Simon's Cat.flv : 426x240 (16:9) -> 320x180
avg 320x180 frame length = 1620 bytes (35%) @ 147s
zoom = 2.5 -> 320x180 @ 24fps
0:02:25 (0.1x) v=1:0.97 a=(x-65)*2
Jan Hammer - Original Miami Vice Theme ( Miami Vice Tribute video by StevenMighty ).flv : 320x240 (4:3) -> 266x200
avg 266x200 frame length = 3117 bytes (68%) @ 170s
zoom = 1.3 -> 266x200 @ 12fps
0:02:48 (0.2x) v=1:0.964 a=(x-24)*1
Paris Combo - Living Room.flv : 294x240 (4:3) -> 245x200
avg 245x200 frame length = 3193 bytes (70%) @ 252s
zoom = 1.2 -> 245x200 @ 12fps
0:04:13 (0.2x) v=1:0.968 a=(x-18)*1
Space Shuttle Launch Audio - play LOUD (no music) HD 1080p.flv : 426x240 (16:9) -> 320x180
avg 320x180 frame length = 2626 bytes (57%) @ 234s
zoom = 1.5 -> 320x180 @ 15fps
0:03:52 (0.2x) v=1:0.973 a=(x+0)*1
The Box - Simon's Cat.flv : 426x240 (16:9) -> 320x180
avg 320x180 frame length = 609 bytes (13%) @ 128s
zoom = 6.5 -> 320x180 @ 65fps
0:00:15 (0x) v=1:0.949 a=(x-78)*2
Washed Up - Simon's Cat.flv : 426x240 (16:9) -> 320x180
avg 320x180 frame length = 786 bytes (17%) @ 148s
zoom = 5.1 -> 320x180 @ 50fps
0:00:32 (0x) v=1:0.984 a=(x-94)*4
0:02:26 (0x) v=1:0.986 a=(x-58)*2
Daft Hands - Harder, Better, Faster, Stronger.mp4 : 540x360 (4:3) -> 300x200
avg 300x200 frame length = 1942 bytes (42%) @ 226s
zoom = 2 -> 300x200 @ 20fps
0:03:44 (0.1x) v=1:0.996 a=(x+0)*1
Indiana Jones Boulder Scene.mp4 : 640x278 (16:9) -> 320x139
avg 320x139 frame length = 1729 bytes (38%) @ 29s
zoom = 2.4 -> 320x139 @ 23fps
0:00:27 (0.1x) v=1:0.944 a=(x-25)*1
Masoud feat. Aneym - No More (Music video))).mp4 : 640x360 (16:9) -> 320x180
avg 320x180 frame length = 2172 bytes (47%) @ 248s
zoom = 1.8 -> 320x180 @ 18fps
0:04:06 (0.2x) v=1:0.991 a=(x+0)*1
Paris Combo - Señor (Live).mp4 : 640x360 (16:9) -> 320x180
avg 320x180 frame length = 2377 bytes (52%) @ 399s
zoom = 1.7 -> 320x180 @ 16fps
0:06:37 (0.2x) v=1:0.994 a=(x+0)*1
Star Trek Genesis.mp4 : 480x360 (4:3) -> 266x200
avg 266x200 frame length = 2255 bytes (49%) @ 67s
zoom = 1.8 -> 266x200 @ 17fps
0:01:05 (0.2x) v=1:0.99 a=(x-123)*8
Star Wars Episode V - The Empire Strikes Back Trailer.mp4 : 540x360 (4:3) -> 300x200
avg 300x200 frame length = 2716 bytes (59%) @ 197s
zoom = 1.5 -> 300x200 @ 14fps
0:03:15 (0.2x) v=1:0.965 a=(x+0)*1
Star Wars- Return Of The Jedi Trailer (HD).mp4 : 640x360 (16:9) -> 320x180
avg 320x180 frame length = 2706 bytes (59%) @ 131s
zoom = 1.5 -> 320x180 @ 14fps
0:02:11 (0.2x) v=1:0.954 a=(x-11)*1
Star Wars The Force Awakens Special Extended Trailer.mp4 : 1280x720 (16:9) -> 320x180
avg 320x180 frame length = 2590 bytes (56%) @ 149s
zoom = 1.5 -> 320x180 @ 15fps
0:02:28 (0.2x) v=1:0.949 a=(x+0)*1
THE ABYSS - Trailer ( 1989 ).mp4 : 540x360 (4:3) -> 300x200
avg 300x200 frame length = 1730 bytes (38%) @ 177s
zoom = 2.3 -> 300x200 @ 22fps
0:02:56 (0.1x) v=1:0.974 a=(x+0)*1
Bonne visu sur émulateur. On attendra le retour de Daniel pour voir si le protocole par simple front serait possible (les 18kHz me font super de l'œil).
A noter: un truc que je ne m'explique pas.
Le tramage de Bayer 8x8 s'encode mieux que le void-and-cluster 8x8. C'est pas logique car les deux sont basés sur les mêmes tuiles 8x8 et les deux ont la propriété qu'un seul pixel ne s'allume quand on passe d'une intensité à la suivante. Pourquoi le mode 2octets a l'air de mieux tirer parti de la régularité inter-tuile du tramage de Bayer? Certes, il regarde les octets changés, mais pas leur contenu, et donc n'exploite pas de régularité entre octets identiques. Non vraiment je ne comprends pas pourquoi Bayer s'encode mieux. Peut-être est-ce lié au fait qu'entre les niveaux n et n+4, c'est le même octet qui est changé, favorisant les changements sur le même octet... mais encore ca n'est pas vrai entre n et n+3 ou n et n+5. Donc pas grand chose de significatif je pense.