Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Projets de programmation


Index du Forum » Projets de programmation » Lecteur vidéo
Aliegeois Hors ligne Membre Points: 75 Défis: 0 Message

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.


1, 2, 3 Suivante
Nemhardy Hors ligne Grand maître des Traits d'Esprit Points: 1242 Défis: 54 Message

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) !
Aliegeois Hors ligne Membre Points: 75 Défis: 0 Message

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 ?
Calculatrice : CASIO GRAPH 95
Regardez mon lecteur de vidéo !
Nemhardy Hors ligne Grand maître des Traits d'Esprit Points: 1242 Défis: 54 Message

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 ;).
Lephenixnoir Hors ligne Administrateur Points: 24228 Défis: 170 Message

Citer : Posté le 07/02/2015 13:22 | #


Aliegeois a écrit :
int fichier[24576000] = {0};

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.
char buffer[1024]; // buffer pour un écran
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);

Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Aliegeois Hors ligne Membre Points: 75 Défis: 0 Message

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.
Calculatrice : CASIO GRAPH 95
Regardez mon lecteur de vidéo !
Lephenixnoir Hors ligne Administrateur Points: 24228 Défis: 170 Message

Citer : Posté le 07/02/2015 13:42 | #


Aliegeois a écrit :
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.

Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Aliegeois Hors ligne Membre Points: 75 Défis: 0 Message

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.
Calculatrice : CASIO GRAPH 95
Regardez mon lecteur de vidéo !
Lephenixnoir Hors ligne Administrateur Points: 24228 Défis: 170 Message

Citer : Posté le 07/02/2015 13:48 | #


Aliegeois a écrit :
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...
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Aliegeois Hors ligne Membre Points: 75 Défis: 0 Message

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 ?
Calculatrice : CASIO GRAPH 95
Regardez mon lecteur de vidéo !
Lephenixnoir Hors ligne Administrateur Points: 24228 Défis: 170 Message

Citer : Posté le 07/02/2015 14:28 | #


Aliegeois a écrit :
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)

Aliegeois a écrit :
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.

Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Aliegeois Hors ligne Membre Points: 75 Défis: 0 Message

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.
Calculatrice : CASIO GRAPH 95
Regardez mon lecteur de vidéo !
Lephenixnoir Hors ligne Administrateur Points: 24228 Défis: 170 Message

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.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Aliegeois Hors ligne Membre Points: 75 Défis: 0 Message

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
memset(ML_vram_adress(), 255, 1024);
qui permet de remplir l'écran de noir, mais si je veut modifier un seul pixel et non tous, je fait comment ? Et pour mettre un tableau complet ? Là par contre je vois vraiment pas comment faire.
Calculatrice : CASIO GRAPH 95
Regardez mon lecteur de vidéo !
Lephenixnoir Hors ligne Administrateur Points: 24228 Défis: 170 Message

Citer : Posté le 07/02/2015 14:56 | #


Ben, toi tu vas vouloir copier tout ton buffer non ?
void drawframe(const char *buffer)
{
    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
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Aliegeois Hors ligne Membre Points: 75 Défis: 0 Message

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 ?
Calculatrice : CASIO GRAPH 95
Regardez mon lecteur de vidéo !
Lephenixnoir Hors ligne Administrateur Points: 24228 Défis: 170 Message

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.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Aliegeois Hors ligne Membre Points: 75 Défis: 0 Message

Citer : Posté le 07/02/2015 15:17 | #


Oui ça je le savais mais c'est ML_vram_adress qui ne marche pas.
Calculatrice : CASIO GRAPH 95
Regardez mon lecteur de vidéo !
Lephenixnoir Hors ligne Administrateur Points: 24228 Défis: 170 Message

Citer : Posté le 07/02/2015 15:21 | #


Aliegeois a écrit :
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.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Aliegeois Hors ligne Membre Points: 75 Défis: 0 Message

Citer : Posté le 07/02/2015 15:24 | #


Je vois ça :
typedef char*(*sc_cpv)(void);
const unsigned int sc0135[] = { 0xD201D002, 0x422B0009, 0x80010070, 0x0135 };
#define ML_vram_adress (*(sc_cpv)sc0135)

Calculatrice : CASIO GRAPH 95
Regardez mon lecteur de vidéo !
Lephenixnoir Hors ligne Administrateur Points: 24228 Défis: 170 Message

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().
    .export _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

Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
1, 2, 3 Suivante

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 74 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd