Bonjour,
Tout d'abord, désolé pour le titre peu clair, mais je voyais pas trop comment résumer le problème.
Donc j'explique vite fait. Je souhaite créer un petit player vidéo, pour ca, j'utilise 2 librairies, libmpeg2 pour le décodage et SDL pour l'affichage.
libmpeg2 décode la vidéo, et stocke chaque image produite dans un fichier et SDL (en fait SDL_Image) lit l'image et l'affiche. Le problème, c'est que passer par un fichier, c'est un peu moisi, disons ce qui est.
Le code de base d'écriture de fichier fourni par libmpeg2 ressemble à ca:
et pour l'afficher j'utilise IMG_load(filename) (enfin pour le charger).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 static void save_ppm (int width, int height, uint8_t * buf, int num) { char filename[100]; FILE * ppmfile; sprintf (filename, "%d.ppm", num); ppmfile = fopen (filename, "wb"); if (!ppmfile) { fprintf (stderr, "Could not open file \"%s\".\n", filename); exit (1); } fprintf (ppmfile, "P6\n%d %d\n255\n", width, height); fwrite (buf, 3 * width, height, ppmfile); fclose (ppmfile); }
Donc pour en revenir au problème (oui je prend mon temps), j'ai vu 2 solutions:
- soit écrire le fichier dans la RAM (mais la aucune idée de comment faire, surtout que ca doit être du code portable, donc j'ai des doutes sur cette solution)
- soit éviter de passer par fopen etc, juste faire un malloc/free. Sauf que (bah oui, y'a un sauf forcément) je rencontre un problème pour trouver la taille du fichier (qui est nécessaire pour utiliser SDL_RWFromMem)
Donc en restant sur la 2eme solution, j'ai testé la fonction fsize donné dans la faq mais ca plante (et comme un boulet que je suis jai oublié de noter l'erreur :/ ).
La solution testé avant c'était d'utiliser une chaine pour y placer l'entête ("P6\n etc") avec sprintf pour ensuite utiliser sizeof et strlen pour avoir la taille, un autre sizeof pour avoir la taille du buffer mais je n'obtient pas la bonne taille du fichier apparement.
Je suis sur à 95% que la solution est toute bête mais la je cale :/
Merci d'avance.
Partager