1

Dnas mon projet de logiciel de VJ(pikixhttp://www.pikilipita.com/vj), parce que j'ai mal pensé mon codec video, je dois convertir des couleurs codées en 15bits vers des couleurs codées en 16bits, ceci pour "blitter" plus rapidement.

Voici mon algorithme, il est déja plus rapide que la fonction de conversion SDL, mais peut-être pourrez vous me suggerer des astuces pour l'optimiser davantage...

__________________
couleur15=couleursRLE[teteRLE];
couleurR=couleur15>>10;
couleurV=(couleur15>>5)-(couleurR<<5);
couleurB=couleur15-(couleurR<<10)-(couleurV<<5);
couleur16=(couleurR<<11)+(couleurV<<6)+couleurB;
__________________

je converti la couleur 15bits en 3 composantes RVB.
couleurR, couleurV et couleurB sont les composantes r,v,b de la couleur 15 bits
A partir de ces 3 composantes, je crée une couleur 16bit.

Voilà!

2


peut etre un truc comme ca, mais j'ai pas testé

couleur16=((couleur15&31744)<<1)& (couleur15 & 1023) ;

il me semble que le mode RVB 16 bits est en 565 et pas 655 comme dans ton exemple.
avatar

3

attention mode proposition de moi qui n'y connais pas grand chose en prog grin

Pourquoi ne pas regarder le code asm généré et regarder si tu peux l'optimiser.. ca pourrait te guider au moins dans tes optimisations pitetre

Voila grin
avatar
Tout probleme a sa solution
Oeil de feu

4

#define 565from1555(x) ((x<<1)&0xFFC0)&(x&0x001F)
#define 565from5155(x) (x&0xF81F)&((x&0x03E0)<<1)
#define 565from5515(x) x&0xFFDF
#define 565from5551(x) (x&0xFFC0)&((x&0x003E)>>1)

Kochise
avatar
Si Dieu m'a de nouveau fait homme, cette fois il m'a pas raté : marcher sur l'eau et dupliquer les pains, ça marche p'us :/

5

Désolé les gars, mais aucunes de vos solutions n'a fonctionné.
Oui, le mode 16 bits est bien en 565, comme dans mon exemple.

Kochise, vos propositions sont séduisantes, mais je ne connais pas la fonction du caractere "&", donc je ne peux pas bidouiller vos lignes de codes.

Qu'elle est donc la fonction de ce "&" ?

6

wé excuse me suis trompé

couleur16=((couleur15&31744)<<1)+ (couleur15 & 1023) ;

tout devait etre a zero :s

tu peut remplacer le + par un ou

le "&" est un "ET" logique bit a bit
avatar

7

OUi, la 1ere proposition renvoayit des pixels noirs.

Voici le résultat de ton deuxieme essai :
violet.jpg

C'est pas encore ca, mais c'en est proche.
Bon, je vais essayer de finir par moi même, en utilisant ce que vous venez de m'apprendre.

Merci!

8

on dirait que les composantes R et G sont inversées
avatar

9

-

10

Je découvre les deux en meme temps...
Evidemment, mon codec n'est pas un exemple de performances monstres, mais je perfectionne quotidiennement, au fur et à mesure de mes découvertes en C.

Je l'utilise dans mon projet de logiciel de mix video, cf ce topic:
topics/91666-utilitaire-musique-pikix-logiciel-pour-vj#0

Pour le moment, mon code ne contient pas un seul "&", mais ca ce donne des idées pour l'optimiser...

11

Essaye ça pour voir couleur16=((couleur15&0x7FE0)<<1)+(couleur15&0x1F);
(de 1555 à 565 normalement)

12

Parfait Marc, ta suggestion fonctionne.
Merci!