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 13:11 | #
C'est à dire que tu demandes quand même un tableau de ≈24000000 int, soit presque 100Mo quand même :s... Du coup ça doit déjà poser problème à ce niveau là sur la calto, sachant qu'elle n'a pas plus de 1 Mo de RAM (enfin je ne connais plus la velue exacte, mais clairement pas tant) !
Citer : Posté le 07/02/2015 13:14 | #
Oui j'ai pensé à ça en fait je devrai avoir un tableau de bits plutôt que d'entiers mais je ne sais pas trop comment faire, y a-t-il des int_1bit ?
Regardez mon lecteur de vidéo !
Citer : Posté le 07/02/2015 13:19 | #
Non, tu n'as pas de variable de 1 bit de base (et faire ça à coup de champs de bit ça me parait pas super propre quand même ^^...), mais après un int c'est 4 octets (sur Casio en tout cas), donc 32 bits, (ou sinon tu peux passer par des char qui font eux 1 octet donc 8 bits, ce qui sera peut être plus simple) après c'est juste la manipulation de bits dans la variable ;).
Citer : Posté le 07/02/2015 13:22 | #
Hey, il y a 64 kio de stack. Laisse tomber, là tu demandes 1500 fois la mémoire disponible.
int_1bit... ça n'a aucun sens ! Prends des octets, des char quoi...
Faut ouvrir le fichier, lire frame par frame puis le fermer à la fin.
int handle = Bfile_OpenFile(SOURCE,_OPENMODE_READ);
unsigned filesize = Bfile_FileSize(handle);
unsigned read_bytes = 0;
while(read_bytes < filesize)
{
Bfile_ReadFile(handle,buffer,1024,-1);
afficher_frame(buffer); // ta fonction d'affichage
Sleep(1000);
read_bytes += 1024;
}
Bfile_CloseFile(handle);
Citer : Posté le 07/02/2015 13:40 | #
Merci pour vos réponses je me rend compte à quel point je n'ai pas réfléchi avant de programmer, je suis en train d'appliquer toutes le modifs nécessaires.
Regardez mon lecteur de vidéo !
Citer : Posté le 07/02/2015 13:42 | #
Merci pour vos réponses je me rend compte à quel point je n'ai pas réfléchi avant de programmer, je suis en train d'appliquer toutes le modifs nécessaires.
Y'a pas de mal. D'autant plus que tu commences pas par le plus simple...
Au fait, le lecteur de Martin Poupe devait être recompilé à chaque vidéo, si tu pouvais écrire un convertisseur pour PC et un lecteur générique pour la machine (ce sur quoi tu sembles parti) ce serait mieux.
Citer : Posté le 07/02/2015 13:47 | #
C'est justement ce que je suis en train de faire actuellement une vidéo de 2 mins pèse 24,5 Mo c'est encore réductible à 3 Mo, je travaille dessus.
Regardez mon lecteur de vidéo !
Citer : Posté le 07/02/2015 13:48 | #
Actuellement une vidéo de 2 mins pèse 24,5 Mo c'est encore réductible à 3 Mo, je travaille dessus.
Hey, il y a 1.5 Mio de mémoire Flash sur la calculatrice...
D'ailleurs c'est bien le problème, on ne peut fondamentalement mettre que 64 secondes à 24 FPS...
Citer : Posté le 07/02/2015 14:22 | #
Euuhh... pourquoi je dois faire un buffer de 1024 cases alors que 128*64(la taille de l'écran)=8196 ? Ça me perturbe lorsque je dois afficher les pixels.
Edit: Si on ne peut avoir que 64 secs, comment fait Martin Poupe alors ?
Regardez mon lecteur de vidéo !
Citer : Posté le 07/02/2015 14:28 | #
Euuhh... pourquoi je dois faire un buffer de 1024 cases alors que 128*64(la taille de l'écran)=8196 ? Ça me perturbe lorsque je dois afficher les pixels.
Parce qu'un pixel de l'écran est soit noir soit blanc : 0/1 ça tient sur un bit donc on peut en mettre 8 par octet (i.e. par case de tableau)
Si on ne peut avoir que 64 secs, comment fait Martin Poupe alors ?
En toute sincérité, je ne sais pas. À creuser.
Regarde aussi les méthodes de compression sans pertes.
Citer : Posté le 07/02/2015 14:35 | #
Ok donc chacune des 1024 valeurs de buffer va contenir la couleur de 8 pixels maintenant comment je fait pour récupérer ces 8 pixles sur un char ? J'ai déjà entendu parler de masque avec >> mais je ne vois pas trop comment faire.
Regardez mon lecteur de vidéo !
Citer : Posté le 07/02/2015 14:38 | #
Même pas besoin
En fait la VRAM (mémoire virtuelle de l'écran, je suppose que tu connais le double buffering) est formatée exactement comme ça. Donc il te suffit de copier tes 1024 octets à l'adresse de la VRAM, puis tu utilises Bdisp_PutDisp_DD() et c'est réglé !
Pour récupérer l'adresse de la VRAM y'a un syscall, sinon tu peux récupérer la fonction ML_getVram() sans problème pour les droits.
Citer : Posté le 07/02/2015 14:52 | #
Ok (note à soi-même arrêter de poser des question à la con avant d'avoir fait un minimum de recherches)
J'ai regardé la doc de MonochromeLib et je vois
Regardez mon lecteur de vidéo !
Citer : Posté le 07/02/2015 14:56 | #
Ben, toi tu vas vouloir copier tout ton buffer non ?
{
char *vram = ML_vram_adress();
memcpy(vram,buffer,1024);
Bdisp_PutDisp_DD(); // ou ML_display_vram();
}
Sinon pour les manips plus détaillées, tu peux utiliser MonochromeLib, elle est faite pour ça
Citer : Posté le 07/02/2015 15:07 | #
Le compilateur ne veut pas marcher, il me dit que ML_vram_adress n'existe pas alors qu'il ne dit rien pour ML_display_vram() o_O Est-ce une erreur connue ?
Regardez mon lecteur de vidéo !
Citer : Posté le 07/02/2015 15:09 | #
Non, mais pour éviter d'ajouter du code inutile au fichier compilé, PierrotLL a jouté une fonctionnalité surprenante : par défaut, aucune fonction n'est définie. Pour qu'elle le soit, il faut décommenter le define associé dans le header.
Autrement dit, il faut que tu décommentes « #define ML_DISPLAY_VRAM » dans MonochromeLib.h.
Citer : Posté le 07/02/2015 15:17 | #
Oui ça je le savais mais c'est ML_vram_adress qui ne marche pas.
Regardez mon lecteur de vidéo !
Citer : Posté le 07/02/2015 15:21 | #
Oui ça je le savais mais c'est ML_vram_adress qui ne marche pas.
Oups, j'ai mal lu
Dis-moi, dans MonochromeLib.c, est-ce que ML_vram_adress() ne serait pas définie en static ? Si oui, enlève-le.
Citer : Posté le 07/02/2015 15:24 | #
Je vois ça :
const unsigned int sc0135[] = { 0xD201D002, 0x422B0009, 0x80010070, 0x0135 };
#define ML_vram_adress (*(sc_cpv)sc0135)
Regardez mon lecteur de vidéo !
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