Compiler un programme avec ffmpeg

Je suis très étonné de ce qui m’arrive sous Lenny…

J’ai voulu compiler un programme faisant appel à libavcodec, libavformat…et d’autres bouts de ffmpeg sous Lenny.
Je me suis retrouvé avec des erreurs de compilation et pratiquement voilà ce que j’ai du faire :

Tous les chemins vers les headers et dans les headers entre eux étaient cassés.

Pour être sur de mon coup j’ai pris le paquet source de ffmpeg2theora qui, par défaut sur une lenny avec toutes les dépendances de construction, NE COMPILE PAS.
Après la modification énoncée plus : ça compile

J’avais déjà vu un fil sur à peu près le même sujet mais là je me permet d’en rajouter un parce que je suis franchement sur le cul.
Je ne m’explique pas comment un truc comme ça a pu survenir.
Je ne suis pas encore allé faire un tour sur la liste de diffusion debian mais ça ne va pas tarder.

Tiens, au passage si quelqu’un est au courant : la fonction img_convert n’est plus disponible dans ffmpeg, elle serait remplacée par sws_scale de libswscale. C’est sûr ça ?

mélange ftp.debian.fr et multimedia non?

en effet

ben voilà, que donne
apt-cache policy libavcodec0d ffmpeg libavcodec51 libavcodec-dev
par exemple

je ne sais pas car entre temps j’ai viré les dépôts multimedias et réinstallé ffmpeg, libavcodec …
le répertoire /usr/include/ffmpeg se retrouve avec une tête qui me convient…
je crois que je vais me faire crier :neutral_face:

bon maintenant je peux voir si mon correctif de bug sur opencv passe à la compile

Avant de clore ce fil honteux une dernière question, au cas où quelqu’un serait rompu à la prog avec libavcodec, ce qui n’est pas mon cas vu que je m’y suis mis quand j’ai commencé ce fil.

J’avais un vieux bug dans la version d’opencv que je maintiens (1.1.0). Il se trouvait dans une fonction qui permet de générer un “video writter” avec libavcodec/libavformat.

On déclare un AVCodecTag sous la forme :

const AVCodecTag codec_bmp_tags[] = {
    { CODEC_ID_H264, MKTAG('H', '2', '6', '4') },
    { CODEC_ID_H264, MKTAG('h', '2', '6', '4') },
    { CODEC_ID_H264, MKTAG('X', '2', '6', '4') },
    { CODEC_ID_H264, MKTAG('x', '2', '6', '4') },
    { CODEC_ID_H264, MKTAG('a', 'v', 'c', '1') },
    { CODEC_ID_H264, MKTAG('V', 'S', 'S', 'H') },

    { CODEC_ID_H263, MKTAG('H', '2', '6', '3') },
    { CODEC_ID_H263P, MKTAG('H', '2', '6', '3') },
    { CODEC_ID_H263I, MKTAG('I', '2', '6', '3') }, /* intel h263 */
    { CODEC_ID_H261, MKTAG('H', '2', '6', '1') },

    /* added based on MPlayer */
    { CODEC_ID_H263P, MKTAG('U', '2', '6', '3') },
    { CODEC_ID_H263P, MKTAG('v', 'i', 'v', '1') },

    { CODEC_ID_MPEG4, MKTAG('F', 'M', 'P', '4') },
    { CODEC_ID_MPEG4, MKTAG('D', 'I', 'V', 'X') },
    { CODEC_ID_MPEG4, MKTAG('D', 'X', '5', '0') },
    { CODEC_ID_MPEG4, MKTAG('X', 'V', 'I', 'D') },
    { CODEC_ID_MPEG4, MKTAG('M', 'P', '4', 'S') },
    { CODEC_ID_MPEG4, MKTAG('M', '4', 'S', '2') },
    { CODEC_ID_THEORA, MKTAG('t', 'h', 'e', 'o') },
    ...
    { CODEC_ID_NONE, 0 },
};

Et ensuite on recherche le CodecID (du type CODEC_ID_MPEG4) en fonction de son fourcc (du type MKTAG(‘M’, ‘P’, ‘4’, ‘S’)) en utilisant un appel à av_codec_get_id sous la forme :

av_codec_get_id ( (AVCodecTag **)&codec_bmp_tags, fourcc )

Or cet appel ressort en segfault.

Pour moi c’est logique vu qu’on passe l’adresse de codec_bmp_tags à une procédure qui attend un pointeur vers un pointeur.
En attendant je me suis fait une routine qui me permet de remplacer av_codec_get_id car je ne veux pas taper dans la déclaration de codec_bmp_tags qui sert et fonctionne bien pour d’autres versions de ffmpeg-debian.

Mais en attendant de trouver mieux je suis ouvert à d’autres suggestions.