Lecteur vidéo
Posté le 07/02/2015 13:05
Bonjour à tous !
Depuis longtemps que je programme en BASIC j'ai finalement envie de faire un add-in et pour commencer je prévois un lecteur de vidéos (à la
Martin Poupe), un genre de défi personnel. J'ai déjà réussi à transformer une vidéo "classique" en vidéo monochrome de 128*64 (via Processing si cela intéresse quelqu'un dites-le moi) mais je plante à la lecture du fichier sur calto -_-' Je ne maîtrise pas vraiment les Bfile_openfile et autres et j'aurai besoin d'un peu d'aide, voici le début de mon code (j'enlève tout le blabla compatibilité SH4 je sais je ça fonctionne) :
#include "memory.h"
#define SOURCE "\\\\crd0\\ASDFMV1"
int AddIn_main(int isAppli, unsigned short OptionNum)
{
int handle = memory_openfile(SOURCE, _OPENMODE_READ);
int fichier[24576000] = {0};
int taille = memory_filesize(handle);
int erreur = memory_readfile(handle, fichier, taille, -1);
Bdisp_AllClr_DDVRAM();
while(1) {}
return 1;
}
Comment marche ? Pour une vidéo de 2 mins, j'aurai un fichier de 128*64*120(secondes)*25(fps) soit 24576000 bits donc un tableau de taille équivalente, en fait je stocke tous les pixels à la suite sur mon fichier (je ne sais pas si je suis clair)
Je suis sûr que "ASDFMV1" est dans le dossier "SDCard" s'il y a des spécificités que je devrai connaître sur l'ouverture des fichiers j'aimerai bien qu'on m'en fasse part
Merci d'avance de vos réponses.
Citer : Posté le 07/02/2015 15:28 | #
Ah oui, zut
Ben, c'est facile : comme le define n'est actif que dans le fichier MonochromeLib.c, il risque pas de la trouver... et comme la fonction existe simplement pas...
Bon, alors on va faire plus simple : mets ce code dans un fichier src, ajoute-le au projet et utilise la fonction getVRAM().
_getVRAM:
mov.l sc_addr, r2
mov.l sc_id, r0
jmp @r2
nop
sc_id:
.data.l h'0135
sc_addr:
.data.l h'80010070
.end
Citer : Posté le 07/02/2015 15:33 | #
Euuuuuh... c'est quoi un fichier src ? (c'est incroyable, j'ai l'impression de tenter d'apprendre à marcher et de même pas être capable de me mettre à quatre pattes..)
Regardez mon lecteur de vidéo !
Citer : Posté le 07/02/2015 15:33 | #
tu mets de l'asm dedans
Citer : Posté le 07/02/2015 15:35 | #
S'il vous plait quelqu’un pour parler dans une autre langue que le chinois ?
Regardez mon lecteur de vidéo !
Citer : Posté le 07/02/2015 15:36 | #
c'est bien du français pourtant mais regarde là
Bonne lecture
EDIT : je te conseil de regarder plein de code source avant de te lance, ça donne plein d'idées
Citer : Posté le 07/02/2015 15:39 | #
T'embête pas, c'est du code Assembleur, la traduction du langage binaire natif du processeur. Les fichiers .src sont les fichiers Assembleur du compilateur de l'IDE.
Franchement, y'a rien dedans. J'appelle le code à une adresse définie (le gestionnaire de syscalls) en lui disant que j'appelle le syscall numéro 0x0135, et ce syscall retourne l'adresse de la vram.
En fait, le tableau constant dans MonochromeLib.c contient la version compilée de ce code... bref, t'embête pas à apprendre l'Assembleur pour ça
Citer : Posté le 07/02/2015 15:46 | #
Et sinon je suis le seul chez qui ça ne marche pas ou c'est pareil pour tout le monde ?
Regardez mon lecteur de vidéo !
Citer : Posté le 07/02/2015 15:54 | #
Et sinon je suis le seul chez qui ça ne marche pas ou c'est pareil pour tout le monde ?
Qu'est-ce qui ne marche pas ?
Qu'est-ce que tu attendais comme résultat ?
Qu'est-ce que tu as obtenu ?
Quel morceau de code est en cause ?
Citer : Posté le 07/02/2015 16:00 | #
Je parle de la fonction ML_vram_adress, comment font les autres ? Ils créent un fichier asm et copient la fonction que tu m'a donnée ?
Regardez mon lecteur de vidéo !
Citer : Posté le 07/02/2015 16:02 | #
Non, en fait ils ne s'en servent pas.
Parce qu'on accède très rarement à la vram directement. MonochromeLib est une interface de dessin. Entre autres elle a des fonctions pour dessiner des points, des lignes, des polygones, ellipses, etc. et elle se débrouille.
Mais toi, tu veux copier l'intégralité d'un buffer dans la mémoire et pour un lecteur vidéo t'as besoin que le programme soit rapide pour gérer les entrées/sorties et la lecture vidéo de la manière la plus fluide possible.
Donc, il faut que tu utilises la méthode la plus optimisée et en l'occurrence c'est celle-ci.
Citer : Posté le 07/02/2015 16:14 | #
Le fait de mettre
const unsigned int nom_a_la_con[] = { 0xD201D002, 0x422B0009, 0x80010070, 0x0135 };
#define adresse (*(sc_cpv)nom_a_la_con)
ne me permet pas d'utiliser adresse pour obtenir la vram ? Et ainsi faire
Regardez mon lecteur de vidéo !
Citer : Posté le 07/02/2015 16:27 | #
Si mais c'est pareil et un peu plus moche
D'abord, tu fais passer adresse pour une variable alors que c'en est pas une. En C, c'est vraiment le genre de choses à pas faire.
Voilà en fait ce que fait ce code :
→ Il définit un tableau contenant des valeurs en hexadécimal ;
→ Il considère l'adresse du tableau comme l'adresse d'une fonction ;
→ Et il appelle la fonction.
Donc en fait il exécute le code contenu dans le tableau, parce que le tableau contient du code compilé ! Et le code compilé... de la fonction que je t'ai filé.
Donc oui, ça fonctionne mais c'est exactement pareil et vraiment moche. Mettre du code compilé dans un tableau dans le code source est un autre exemple de chose à ne pas faire... mais ça évitait à PLL d'ajouter un fichier src au projet (parce qu'on ne peut pas mettre d'Asm inline dans du code C avec cet IDE), et puis il savait ce qu'il faisait.
Citer : Posté le 07/02/2015 21:48 | #
Bon je reviens après avoir passé tout l'après-midi à re-re-refaire l'encodage de la vidéo qui était faux depuis le début (ça n'aide pas vraiment pour les tests) et maintenant je reviens sur le problème d'origine : afficher la vidéo sur calto. Or maintenant ce qui plante c'est que je n'ai que la dernière image, il y a bien le temps d'attente comme si la vidéo s'affichait, mais rien puis à la fin la dernière image..
Je hais faire ça car j'ai l'impression qu'on fait le code à ma place mais je n'ai pas d'autres solutions donc voila :
{
ML_clear_vram();
memcpy(adresse(), buffer, 1024);
}
int AddIn_main(int isAppli, unsigned short OptionNum)
{
unsigned int key;
char buffer[1024];
int handle = memory_openfile("\\\\crd0\\LAMA.LOL", _OPENMODE_READ);
int filesize = memory_filesize(handle);
int read_bytes = 0;
ML_clear_vram();
ML_clear_screen();
while(read_bytes < filesize)
{
memory_readfile(handle, &buffer, 1024, -1);
afficher_frame(buffer);
read_bytes += 1024;
Sleep(40); // 25 fps donc 1000 / 25 = 40
}
memory_closefile(handle);
while(1) {GetKey(&key);}
return 1;
}
Regardez mon lecteur de vidéo !
Citer : Posté le 07/02/2015 21:50 | #
Faut bouger le curseur
http://wiki.planet-casio.com/fr/Fxlib.h#Bfile_SeekFile
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2
merci a tout le monde pour son soutien
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm
(dont je connais le nom, mais pas vous )Arcuz !Citer : Posté le 07/02/2015 21:52 | #
Zut, c'est pas à &buffer qu'il faut lire mais à buffer
Sinon, ben faut actualiser l'écran (double buffering) !
Dans afficher_frame(), faut appeler ML_display_vram()
Ajouté le 07/02/2015 à 21:53 :
Faut bouger le curseur
http://wiki.planet-casio.com/fr/Fxlib.h#Bfile_SeekFile
Nan, rien à voir >_<
Il bouge tout seul >_<
Citer : Posté le 07/02/2015 21:54 | #
il ne se sert même pas de cette fonction
Citer : Posté le 07/02/2015 22:00 | #
Alléluia !! Ca marche !!!
Merci beaucoup mais seul Lephenixnoir m'a aidé (et encore qu'à moitié ) il ne me manquait que le display_vram. @Dodoremur : le paramètre -1 dans read_file permet de continuer la lecture du fichier là où on en était rendu donc pas besoin de seek_file. Merci quand-même je suis super heureux pour un premier add-in je le trouve pas trop mal Je vais créer un post pour mettre l'encodeur(un petit programme de ma conception) et le décodeur, l'add-in calto.
Merci encore.
Regardez mon lecteur de vidéo !
Citer : Posté le 07/02/2015 22:01 | #
ton addin avec la vidéo prend bcp de place ?
Citer : Posté le 07/02/2015 22:05 | #
L'add-in : 34 ko, la vidéo de 4 secs(pour le test) : 100ko, soit 25 ko/sec.
Regardez mon lecteur de vidéo !
Citer : Posté le 07/02/2015 22:29 | #
Merci beaucoup mais seul Lephenixnoir m'a aidé (et encore qu'à moitié ) il ne me manquait que le display_vram.
Tu me fais peur quand même, je crois que tu vas lire/écrire n'importe où en mémoire. Utilise de l'alloc dynamique plutôt.
Citer : Posté le 07/02/2015 22:31 | #
Si tu veut tu pourra modifier mon code à ta guise mais pour l'instant tout ce que je vois c'est qu'il marche sans problèmes ! Je n'ai rien envie de modifier. (Je m'en fous des problèmes de mémoire )
Regardez mon lecteur de vidéo !