[Ffmpeg-devel] Re: Listing suitable codec for each format

Dean Bender dean98
Fri Mar 30 17:54:33 CEST 2007


Hello all,

First, I'm new to the ffmpeg API and I'm surprised that the
documentation is very lacking. I wish I can help in some areas when I
have more time this summer.

Now let's get to my problem. I'm trying to use ffmpeg as the AV
encoder in a modified quake3 source code. I've figured out how to use
the encoding component using libavcodec/libavformat. Now I'm trying to
automate things, by detecting if the user-specified codec and format
are a good match (not all codecs can be used with any formats right ?)
I looked at the ffmpeg's doxygen and saw that there is an AVCodecTag
** codec_tag that sounds exactly like what I need for what I'm trying
to do. However I'm stumped now because the array isn't filled in for
every single formats. I have attached the code I'm using to get the
codec_tag array and list them.

One more thing, why is the AVCodecTag declared as a struct member for
AVOutputFormat, but only defined in riff.c ? It seems to be so
illogical to me. Please explain to me, thanks.



flvformat = L_av_alloc_format_context();
sprintf(flvformat->filename,fileName);
char * codecname = lowercase(cl_videoCodec->string);

Com_Printf ("Trying format %s\n",cl_videoFormat->string);
Com_Printf ("Trying codec %s\n",cl_videoCodec->string);
flvformat->oformat = L_guess_format(cl_videoFormat->string, NULL, NULL);

if (!flvformat->oformat) {
                               Com_Printf ( S_COLOR_RED "Invalid
format (%s) . Enter \\listFormat
to see valid formats for ffmpeg\n",cl_videoFormat->string);
       return qfalse;
   }

struct AVCodecTag ** tag = (flvformat->oformat->codec_tag);
AVCodec * p=0;
int i=0;

//tag[0][x] for video, tag[1][x] for audio
Com_Printf("firstcodec : %s\n",tag[0][0].id);
//return qfalse; <-- some formats hang here. tag[][] is null maybe ?
p = L_avcodec_find_encoder(tag[0][0].id);
while(p){
Com_Printf("codec %d: %s\n",i,p->name);
if( Q_stricmp(p->name,cl_videoCodec->string) == 0 ){
codec = p;
Com_Printf("match\n");
break;
}
i++;
p= L_avcodec_find_encoder(tag[0][i].id);
}

               if (!codec) {
                               Com_Printf ( S_COLOR_YELLOW "Codec (%s)
not suitable for format
(%s). Reverting to a compatible codec
(%s)\n",cl_videoCodec->string,cl_videoFormat->string,L_avcodec_find_encoder(flvformat->oformat->video_codec)->name);
                               codec = L_avcodec_find_encoder(
flvformat->oformat->video_codec  );
   }


   if (!codec) {
                               Com_Printf ( S_COLOR_RED "Invalid codec
(%s) . Enter \\listCodec
to see valid codecs for ffmpeg\n",cl_videoCodec->string);
       return qfalse;
   }

return qfalse;




Regards,

Hassan




More information about the ffmpeg-devel mailing list