[FFmpeg-devel] [PATCH] Make a clear distinction between an unsupported codec and an unknown one

Vitor Sessak vitor1001
Mon Sep 1 07:10:19 CEST 2008


Stefano Sabatini wrote:
> On date Sunday 2008-08-31 17:30:58 +0100, Robert Swain encoded:
>> 2008/8/31 Vitor Sessak <vitor1001 at gmail.com>:
>>> Robert Swain wrote:
>>>> 2008/8/31 Peter Ross <pross at xvid.org>:
>>>>> On Sun, Aug 31, 2008 at 12:53:34PM +0200, Michael Niedermayer wrote:
>>>>>> On Sun, Aug 31, 2008 at 06:56:48AM +0200, Vitor Sessak wrote:
>>>>>>> See $subj. I got pretty confused by "Stream #0.1: Audio: 0x0000, 5512 Hz,
>>>>>>> mono, s16" meaning that a codec is known, but unsupported...
>>>>>>>
>>>>>>> -Vitor
>>>>>>> Index: libavcodec/utils.c
>>>>>>> ===================================================================
>>>>>>> --- libavcodec/utils.c      (revision 15050)
>>>>>>> +++ libavcodec/utils.c      (working copy)
>>>>>>> @@ -1091,8 +1091,12 @@
>>>>>>>                       (enc->codec_tag >> 16) & 0xff,
>>>>>>>                       (enc->codec_tag >> 24) & 0xff,
>>>>>>>                        enc->codec_tag);
>>>>>>> +        } else if (enc->codec_id) {
>>>>>>> +            snprintf(buf1, sizeof(buf1), "unsuported (id 0x%04x)", enc->codec_id);
>>>>>>> +        } else if (enc->codec_tag) {
>>>>>>> +            snprintf(buf1, sizeof(buf1), "unknown (0x%04x)", enc->codec_tag);
>>>>>>>          } else {
>>>>>>> -            snprintf(buf1, sizeof(buf1), "0x%04x", enc->codec_tag);
>>>>>>> +            snprintf(buf1, sizeof(buf1), "unknown");
>>>>>>>          }
>>>>>> I think this is inconsistant now
>>>>>> Before it just printed the tag now it prints the tag when its
>>>>>> printable, if not and codec_id is not 0 the id and if not and
>>>>>> id is 0 and the tag is not 0 the tag and ...
>>>>>> Printing the ID in addition to the tag and "NONE" instead of
>>>>>> 0x0000 or so seems more consistent to me
>>> IMHO, when we have a codec ID, the codec is already identified and there
>>> is no use printing the 4CC. Yes, I should move them the "if
>>> (enc->codec_id)" up.
>> Some people may be interested in the FOURCC even if they know the codec.
>>
>>>>> An enhancement to the unsupported case would be to actually print
>>>>> the name of the codec. e.g. i am always forgetting which 0x16X
>>>>> twocc refers to wmav3.
>>>> Indeed. In my opinion it should print the codec name if possible and
>>> Today we have:
>>>
>>> AVCodec flac_decoder = {
>>>     "flac",
>>>     CODEC_TYPE_AUDIO,
>>>     CODEC_ID_FLAC,
>>>     sizeof(FLACContext),
>>>     flac_decode_init,
>>>     NULL,
>>>     flac_decode_close,
>>>     flac_decode_frame,
>>>     CODEC_CAP_DELAY,
>>>     .flush= flac_flush,
>>>     .long_name= NULL_IF_CONFIG_SMALL("FLAC (Free Lossless Audio Codec)"),
>>> };
>>>
>>> AVCodec flac_encoder = {
>>>     "flac",
>>>     CODEC_TYPE_AUDIO,
>>>     CODEC_ID_FLAC,
>>>     sizeof(FlacEncodeContext),
>>>     flac_encode_init,
>>>     flac_encode_frame,
>>>     flac_encode_close,
>>>     NULL,
>>>     .capabilities = CODEC_CAP_SMALL_LAST_FRAME,
>>>     .sample_fmts = (enum SampleFormat[]){SAMPLE_FMT_S16,SAMPLE_FMT_NONE},
>>>     .long_name = NULL_IF_CONFIG_SMALL("FLAC (Free Lossless Audio Codec)"),
>>> };
>>>
>>> enum CodecID {
>>>     CODEC_ID_NONE,
>>>
>>>     /* video codecs */
>>>     CODEC_ID_MPEG1VIDEO,
>>> [...]
>>>
>>>     CODEC_ID_FLAC,
>>> [...]
>>> }
>>>
>>> Note the duplication of both the short and the long name. I think that
>>> setting the codec long and short name in the same place of CodecID would
>>> remove duplication and resolve the issue of finding the name of
>>> unimplemented codecs...
>> I like this idea. 
> 
> Just my 2 ?cent...
> 
> We could have a list of the format supported, with a name like
> AVCodecFormat
> or
> AVStreamFormat
> 
> unfortunately the term "format" creates confusion with the specific
> (and likely not-so-correct) use of term format done in libavformat.
> 
> Such structure could contain for example a name, long_name, fourcc,
> type, and a list of encoders and decoders supporting it (yes it could
> be more than one, think for example aac/libfaad, last time I tried to do:
> ffmpeg -acodec libfaad -i ~/test.mov -ar 22100 -vcodec libx264 -t 1.0 -y outfile.mp4
> I end up decoding with the native decoder...).

I understand the usefulness of your idea (one format, several decoders) 
but I don't see a good way of implementing it without adding another 
list of encoders/decoders (besides the list of formats) or anything else 
ugly.

> Also, maybe it would make sense to keep there the capabilities and the
> list of supported things (pix_fmts, framerates, sizes etc.).

I'm not sure if this last point is a good idea. Think of the case where 
have a format that our decoder support both stereo and 5.1 and our 
encoder support only stereo.

-Vitor




More information about the ffmpeg-devel mailing list